加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

利用上期所CTP API开发程序化交易系统

(2015-06-11 20:11:05)
标签:

股票

ctp_api

ctp培训

期货ctp

上期ctp

分类: CTP_API技术开发

综合交易平台(Comprehensive Transaction Platform)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成,交易系统主要负责订单处理、行情转发及银期转账业务。系统能够同时连通国内四家期货交易所,支持国内商品期货和股指期货的交易结算业务,并能自动生成、报送保证金监控文件和反洗钱监控文件。


CTP API是由C++语言开发而成,因此用C++调用该接口就显得十分方便,如果用其它语言,则需要先进行封装。


 

关于CTP_API开发的问题,可以加群讨论:241849717 或 202367118

群主QQ:1531-80931



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

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

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

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

回报等。

3.广播通讯模式,是指交易所端主动,向市场中的所有会员都发出相同的信息。

例如公告、市场公共信息等。

CTP的交易API提供了两个接口,分别为CThostFtdcTraderApi CThostFtdcTraderSpi

我们自己开发的交易系统通过CThostFtdcTraderApiCTP发送操作请求,通过CThostFtdcTraderSpi接收CTP的任何响应。

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

业务举例

通讯模式

CThostFtdcTraderApi

CThostFtdcTraderSpi

登录

对话模式

ReqUserLogin

OnRspUserLogin

报单录入

ReqOrderInsert

OnRspOrderInsert

报单查询

ReqQryOrder

OnRspQryOrder

成交查询

ReqQryTrade

OnRspQryTrade

报单回报

私有模式

 

OnRtnOrder

成交回报

 

OnRtnTrade

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

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

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

业务举例

通讯模式

CThostFtdcMdApi

CThostFtdcMdSpi

  登录

对话
模式

ReqUserLogin

OnRspUserLogin

行情订阅

广播

模式

SubscribeMarketData

OnRspQryDepthMarketData

行情退订

对话模式

UnSubMarketData

 

OnRspUnSubMarketData

 

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

    综上所述,我们的程序化交易系统需要完成的业务可以划分为:

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

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

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

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

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


CTP提供给开发者的文件一共有4个头文件 ThostFtdcTraderApi.hThostFtdcMdApi.hThostFtdcUserApiStruct.hThostFtdcUserApiDataType.h 2dllthosttraderapi.dllthostmduserapi.dll(动态链接库,如果是静态库则是thosttraderapi.libthostmduserapi.lib)。
    
其中ThostFtdcTraderApi.h定义了交易请求接口CThostFtdcUserApi和交易事件处理接口CThostFtdcUserSpi
    ThostFtdcMdApi.h
定义了行情请求接口CThostFtdcMdApi,行情事件处理接口CThostFtdcMdSpi
    ThostFtdcUserApiStruct.h
定义了接口方法中用到的数据结构。
    ThostFtdcUserApiDataType.h
定义了数据结构中用到数据类型,枚举描述。
    
开发者通过CThostFtdcUserApi就可以完成交易接口的初始化,登入,确认结算结果,查询合约,查询资金,查询持仓,报单,撤单等业务操作;通过CThostFtdcUserSpi获取相应回报
    
开发者也可以通过CThostFtdcMdApi完成行情接口的初始化,登入,订阅,收行情等业务;通过CThostFtdcMdSpi获取相应的行情业务操作的回报
   
上文提到了基于CTP的程序化交易系统开发最好要有四个线程:
1.
完成初始化及退出操作的主线程;
2.
行情接受和处理线程;
3.
新行情数据监听和处理线程;
4.
订单管理线程
现在先讨论一下主线程的初始化工作。初始化工作包括交易接口和行情接口两部分,对于交易接口的初始化,程序必须完成如下步骤:
1,
产生一个CThostFtdcTraderApi实例
2,
产生一个事件处理的实例
3,
注册一个事件处理的实例
4,
订阅私有流
5,
订阅公共流
6,
设置交易托管服务的地址。

 

 

 

行情的接收是通过CThostFtdcMdApi::SubscribeMarketData()完成对行情的订阅,通过CThostFtdcMdSpi::OnRtnDepthMarketData()完成对于行情数据的接收。此线程的工作主要要完成如下三个方面:
1.行情数据的存储:由于SubscribeMarketData()可以对多个合约行情进行订阅,所以在接收到数据后的处理首先要考虑对不同合约的数据分别以合适的方式(这里合适的方式是指存取,遍历,查询,增删等操作最为稳定快速的算法)存储。

2.行情数据的补齐:这是一个相当重要的问题。当tick数据为空的时候,必须以合适的方式补齐(因为缺失的数据对后来的统计指标计算有较大的影响,所以数据补齐是相当考究的)。

3.最新行情数据到来时向数据监听线程发出信号。

 

 

 

 

本文讨论一下数据监听线程和订单管理线程做些什么。
   一,数据监听线程

   数据监听线程,当行情处理线程接收到新的行情数据时,也就是每当一个tick到来时,就向数据监听线程发出信号,触发此线程启动,然后依次进行:

1.各种指标计算,

2.然后进行策略计算,

3.最后在满足策略时进行交易。

   指标计算,就是指根据新到来的数据以及历史数据进行某些统计值的计算,比如常见的MAMACDRSI等,当然也可以自己构造出某个统计值。这里需要提到的是数据周期的问题(我在之前的博文中曾解释过)。如果指标计算是基于数据周期,那么对于行情数据就要进行数据的拼装,也就是说将每一tick数据(500毫秒)拼装成你所需要的数据周期(也就是拼装成K线),然后将每个周期(每根k线)中的openhighlowclose计算出来,以便进行统计值的计算。

   策略计算就是将你的计算出来的指标,按照你自己的交易思想,交易策略进行逻辑的组合,然后在满足策略逻辑的时候进行交易。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有