龙听期货论坛's Archiver

龙听 发表于 2017-11-1 15:49

基于CTP的程序化交易系统开发(一)

[p=21, 2, left][font=宋体][size=12pt]  自从综合交易平台(CTP)的API开放以来,很多人开始编写自己的程序化交易系统,今天我想说说自己的一些看法。
    首先解读一下CTP的接口说明,CTP的API使用建立在TCP协议之上FTD协议(《期货交易数据交换协议》)与交易托管系统进行通讯,而交易托管系统负责投资者的交易业务处理。FTD 协议中规定了所有的通讯都基于某一种通讯模式。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]交易涉及的通讯模式共有三种:[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]1[/size][/font][font=宋体][size=12pt].对话通讯模式,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如报单、查询等。这种通讯模式与普通的客户/服务器模式相同。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]2.[/size][/font][font=宋体][size=12pt]私有通讯模式,是指交易所端主动,向某个特定的会员发出的信息。例如成交[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]回报等。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]3.[/size][/font][font=宋体][size=12pt]广播通讯模式,是指交易所端主动,向市场中的所有会员都发出相同的信息。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]例如公告、市场公共信息等。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]CTP[/size][/font][font=宋体][size=12pt]的交易API提供了两个接口,分别为CThostFtdcTraderApi 和CThostFtdcTraderSpi[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]我们自己开发的交易系统通过CThostFtdcTraderApi向CTP发送操作请求,通过CThostFtdcTraderSpi接收CTP的任何响应。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]现在把主要的业务举例在下表中[/size][/font][/p]
[table=98%]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]业务举例[/size][/font][/p][/td][td=1,1,48][p=18, 2, left][font=宋体][size=12pt]通讯模式[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt]CThostFtdcTraderApi[/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]CThostFtdcTraderSpi[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]登录[/size][/font][/p][/td][td=1,4,48][p=18, 2, left][font=宋体][size=12pt]对话模式[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt]ReqUserLogin[/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRspUserLogin[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]报单录入[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt]ReqOrderInsert[/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRspOrderInsert[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]报单查询[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt]ReqQryOrder[/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRspQryOrder[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]成交查询[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt]ReqQryTrade[/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRspQryTrade[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]报单回报[/size][/font][/p][/td][td=1,2,48][p=18, 2, left][font=宋体][size=12pt]私有模式[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt] [/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRtnOrder[/size][/font][/p][/td][/tr]
[tr][td=1,1,55][p=18, 2, left][font=宋体][size=12pt]成交回报[/size][/font][/p][/td][td=1,1,215][p=18, 2, left][font=宋体][size=12pt] [/size][/font][/p][/td][td=1,1,250][p=18, 2, left][font=宋体][size=12pt]OnRtnTrade[/size][/font][/p][/td][/tr]
[/table][p=21, 2, left][font=宋体][size=12pt]行情涉及的通讯模式共有两种:[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]1[/size][/font][font=宋体][size=12pt].对话通讯模式,同交易一样,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如登录,退订等。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]2.[/size][/font][font=宋体][size=12pt]广播通讯模式,主要是行情订阅,当订阅行情后交易所端主动向会员连续主动发出行情信息。[/size][/font][/p][table=98%]
[tr][td=1,1,87][p=18, 2, left][font=宋体][size=12pt]业务举例[/size][/font][/p][/td][td=1,1,128][p=18, 2, left][font=宋体][size=12pt]通讯模式[/size][/font][/p][/td][td=1,1,153][p=18, 2, left][font=宋体][size=12pt]CThostFtdcMdApi[/size][/font][/p][/td][td=1,1,200][p=18, 2, left][font=宋体][size=12pt]CThostFtdcMdSpi[/size][/font][/p][/td][/tr]
[tr][td=1,1,87][p=18, 2, left][font=宋体][size=12pt]  登录[/size][/font][/p][/td][td=1,1,128][p=18, 2, left][font=宋体][size=12pt]对话[/size][/font]
[font=宋体][size=12pt]模式[/size][/font][/p][/td][td=1,1,153][p=18, 2, left][font=宋体][size=12pt]ReqUserLogin[/size][/font][/p][/td][td=1,1,200][p=18, 2, left][font=宋体][size=12pt]OnRspUserLogin[/size][/font][/p][/td][/tr]
[tr][td=1,1,87][p=18, 2, left][font=宋体][size=12pt]行情[/size][/font][font=宋体][size=12pt]订阅[/size][/font][/p][/td][td=1,1,128][p=18, 2, left][font=宋体][size=12pt]广播[/size][/font][/p][p=18, 2, left][font=宋体][size=12pt]模式[/size][/font][/p][/td][td=1,1,153][p=18, 2, left][font=宋体][size=12pt]SubscribeMarketData[/size][/font][/p][/td][td=1,1,200][p=18, 2, left][font=宋体][size=12pt]OnRspQryDepthMarketData[/size][/font][/p][/td][/tr]
[tr][td=1,1,87][p=18, 2, left][font=宋体][size=12pt]行情退订[/size][/font][/p][/td][td=1,1,128][p=18, 2, left][font=宋体][size=12pt]对话模式[/size][/font][/p][/td][td=1,1,153][p=18, 2, left][font=宋体][size=12pt]UnSubMarketData[/size][/font][/p]
[/td][td=1,1,200][p=18, 2, left][font=宋体][size=12pt]OnRspUnSubMarketData[/size][/font][/p]
[/td][/tr]
[/table][p=21, 2, left][font=宋体][size=12pt]可见,通过CTP提供的接口,我们可以向CTP发送业务申请,也不断的按照三种通讯模式中的其中一种接收CTP的响应。因此我们写的交易系统中至少就应该有两个线程,一个称其为主业务线程,负责对CTP发出业务申请;另一个线程为API工作线程,负责接收CTP通过广播通讯模式,对话通讯模式,私有通讯模式其中一种模式对交易系统的响应。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]    综上所述,我们的程序化交易系统需要完成的业务可以划分为:[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]1.[/size][/font][font=宋体][size=12pt]基本操作,比如登录,订阅等;[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]2.[/size][/font][font=宋体][size=12pt]行情操作,比如对行情数据的接收,存储等[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]3.[/size][/font][font=宋体][size=12pt]订单操作,比如报单;对报单,成交状况的查询;报单,成交状况的私有回报等。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]4.数据监听和处理操作,比如接收到新数据之后的统计处理,满足统计条件后的报单处理(其实这里就是我们的策略所在)[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]    那么,我建议将我们的程序化交易系统分为四个线程,分别处理上述业务。程序的主线程就可以完成基本操作,完成登入,订阅等初始化工作。[/size][/font][/p][p=21, 2, left][font=宋体][size=12pt]    其它三个线程工作关系如下图所示:[/size][/font][/p][p=21, 2, left][url=http://photo.blog.sina.com.cn/showpic.html#blogid=56e7157f01016ri2&url=http://s13.sinaimg.cn/orignal/56e7157fhc40ec1e3e14c][img=0,337]http://s13.sinaimg.cn/middle/56e7157fhc40ec1e3e14c&690[/img][/url]

[/p][p=21, 2, left][font=宋体][size=12pt]程序化交易系统是一个复杂的多线程网络程序,在开发过程中要特别注意处理很多的线程互斥、数据处理造成的网络丢包等一系列棘手问题。另外,对于CTP开发的资料,大家可以留言给我,我尽量提供,也欢迎大家多多讨论。[/size][/font][/p]

龙听 发表于 2024-9-24 16:24

自从综合交易平台(CTP)的API开放以来,很多人开始编写自己的程序化交易系统,今天我想说说自己的一些看法。

首先解读一下CTP的接口说明,CTP的API使用建立在TCP协议之上FTD协议(《期货交易数据交换协议》)与交易托管系统进行通讯,而交易托管系统负责投资者的交易业务处理。FTD 协议中规定了所有的通讯都基于某一种通讯模式。

交易涉及的通讯模式共有三种:

1.对话通讯模式,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如报单、查询等。这种通讯模式与普通的客户/服务器模式相同。

2.私有通讯模式,是指交易所端主动,向某个特定的会员发出的信息。例如成交回报等。

3.广播通讯模式,是指交易所端主动,向市场中的所有会员都发出相同的信息。例如公告、市场公共信息等。CTP的交易API提供了两个接口,分别为CThostFtdcTraderApi 和CThostFtdcTraderSpi我们自己开发的交易系统通过CThostFtdcTraderApi向CTP发送操作请求,通过CThostFtdcTraderSpi接收CTP的任何响应。

现在把主要的业务举例在下表中

[img]http://p.algo2.net/2024/0924/7641bfa07ee85.jpg[/img]

行情涉及的通讯模式共有两种:

1.对话通讯模式,同交易一样,是指由会员端主动发起的通讯请求。该请求被交易所端接收和处理,并给予响应。例如登录,退订等。

2.广播通讯模式,主要是行情订阅,当订阅行情后交易所端主动向会员连续主动发出行情信息。

[img]http://p.algo2.net/2024/0924/cc90150bdfc00.jpg[/img]

综上所述,我们的程序化交易系统需要完成的业务可以划分为:可见,通过CTP提供的接口,我们可以向CTP发送业务申请,也不断的按照三种通讯模式中的其中一种接收CTP的响应。因此我们写的交易系统中至少就应该有两个线程,一个称其为主业务线程,负责对CTP发出业务申请;另一个线程为API工作线程,负责接收CTP通过广播通讯模式,对话通讯模式,私有通讯模式其中一种模式对交易系统的响应。

1.基本操作,比如登录,订阅等;

2.行情操作,比如对行情数据的接收,存储等

3.订单操作,比如报单;对报单,成交状况的查询;报单,成交状况的私有回报等。

4.数据监听和处理操作,比如接收到新数据之后的统计处理,满足统计条件后的报单处理(其实这里就是我们的策略所在)

那么,我建议将我们的程序化交易系统分为四个线程,分别处理上述业务。程序的主线程就可以完成基本操作,完成登入,订阅等初始化工作。

其它三个线程工作关系如下图所示:

[img]http://p.algo2.net/2024/0924/f9c82dcf05819.jpeg[/img]

程序化交易系统是一个复杂的多线程网络程序,在开发过程中要特别注意处理很多的线程互斥、数据处理造成的网络丢包等一系列棘手问题。另外,对于CTP开发的资料,大家可以留言给我,我尽量提供,也欢迎大家多多讨论。

龙听 发表于 2024-9-24 16:31

补了一下,之前的图床没有了,所以补一下图片,并整理一下段落。

页: [1]