python封装ctp
具体流程:
1、需要将两个定义了数据类型等的头文件转换成python的格式,方便后续gateway映射使用
2、将原生ctpapi接口用C++继承实现一次
3、利用pybind11对C++继承好的类进行转换
vnpy整个处理逻辑是:将MdApi分成四大部分
- 继承原生CTP接口的Onxxxxx函数
- 额外开一个task线程,用来运行process特定的任务
- 额外声明onxxxxx响应函数
- 额外声明包括createFtdcxxx等主动函数
运行的时候,先调用createFtdcxxx(实际调用的是原生CTP定义好的函数),进行初始化后,远端Thost服务器响应调用Onxxxx,将响应包装成一个事件推送到任务处理队列中,由process一系列函数挑选处理,推送到相应的onxxxx函数里。这样做的好处很明显,一是利用了一个无限长的任务处理队列,不用担心阻塞了CTP回调;二是只需要将onxxxx暴露给vnpy,个人感觉比较简洁?
对原生接口进行继承重写,分成两部分:
1、头文件:继承CThostFtdcMdSpi生成MdApi,其中MdApi类其中包括了原生Api对象(原生Spi只提供回调函数,原生Api只提供主动请求函数),继承定义的MdApi将两者合二为一,按照上面的处理逻辑声明特定的函数即可
2、源文件:将上述声明的类方法都实现一遍
- 原生API回调函数Onxxxx:负责生成Task类实例推送给API的工作线程队列。
- 回调处理函数processxxxx
- onxxxx
- 初始化和主动请求函数(包括createFtdcMdApi(...))