http://blog.csdn.net/grafx/article/details/54411872
http://weibo.com/p/2304187dfd20dd0102vl1y
http://www.cnblogs.com/eecs/p/4158526.html
http://blog.csdn.net/u012234115/article/details/70195889
https://www.cnblogs.com/kevonyang/p/5965825.html
https://www.cnblogs.com/dongerlei/p/5380340.html

CTP是基于多线程的,至少有两个线程在工作,一个是程序主线程,另一个是API工作线程。

API底层封装了TCP通讯,通过函数回调来使用API接口。文档手册里的一个示意图。所以开发CTP程序时,要先吃透API的各种回调函数。

CTP的API封装分为两大部分,一个是TraderApi(thosttraderapi.dll)负责交易部分,另一个是MdUserApi(thostmduserapi.dll)。

http://www.sfit.com.cn/DocumentDown/api/CTPcdg_ch.pdf

https://images0.cnblogs.com/blog/566935/201412/112116580872562.png

简单介绍一下MdApi和TraderApi的一般工作流程,这里不会包含太多细节,仅仅是让读者有一个概念。

MdApi 创建MdSpi对象

调用MdApi类以Create开头的静态方法,创建MdApi对象

调用MdApi对象的RegisterSpi方法注册MdSpi对象的指针

调用MdApi对象的RegisterFront方法注册行情柜台的前置机地址

调用MdApi对象的Init方法初始化到前置机的连接,连接成功后会通过MdSpi对象的OnFrontConnected回调函数通知用户

等待连接成功的通知后,可以调用MdApi的ReqUserLogin方法登陆,登陆成功后会通过MdSpi对象的OnRspUserLogin通知用户

登陆成功后就可以开始订阅合约了,使用MdApi对象的SubscribeMarketData方法,传入参数为想要订阅的合约的代码

订阅成功后,当合约有新的行情时,会通过MdApi的OnRtnDepthMarketData回调函数通知用户

用户的某次请求发生错误时,会通过OnRspError通知用户。

MdApi同样提供了退订合约、登出的功能,一般退出程序时就直接杀进程(不太安全)

TraderApi TraderApi和MdApi类似,以下仅仅介绍不同点

注册TraderSpi对象的指针后,需要调用TraderApi对象的SubscribePrivateTopic和SubscribePublicTopic方法去选择公开和私有数据流的重传方法(这一步MdApi没有)

对于期货柜台而言(CTP、恒生UFT期货等),在每日第一次登陆成功后需要先查询前一日的结算单,等待结算单查询结果返回后,确认结算单,才可以进行后面的操作;而证券柜台LTS无此要求

上一步完成后,用户可以调用ReqQryInstrument的方法查询柜台上所有可以交易的合约信息(包括代码、中文名、涨跌停、最小价位变动、合约乘数等大量细节),一般是在这里获得合约信息列表后,再去MdApi中订阅合约;经常有人问为什么在MdApi中找不到查询可供订阅的合约代码的函数,这里尤其要注意,必须通过TraderApi来获取

当用户的报单、成交状态发生变化时,TraderApi会自动通过OnRtnOrder、OnRtnTrade通知用户,无需额外订阅