圈内几乎所有的CTP封装的接口都是有偿获取的,或者干脆不开源,笔者在无数个深夜翻来覆去的查找资料之后,终于完成了初步的CTP基于C++/CLI的封装(无与伦比的痛苦。。。)。
刚开始的时候一听到要用C++/CLI这个陌生的工具来封装就一个头十个大,但真正的完成了以后会过头一看,感觉很简单,所以初学者千万不要先入为主,等你学完了C++/CLI可能你会跟笔者一样有一种打开了新世界的大门的赶脚。。。。
笔者不太会写博客,就怎么简单怎么来吧。。。。
注:封装过程的各种设置和注意还是有点多的,所以这还是有点难度的。。。。
在封装之前首先要先编译一个boost库,https://www.boost.org/users/history/version_1_67_0.html,选择末尾是7z的版本下载,
下载好以后放到D盘的根目录:D:\boost_1_67_0\boost_1_67_0.
、、、、、、、、、、、、、、、、、、、、、、、、、、编译Boost、、、、、、、、、、、、、、、、、、、、、、、、、
编译A:打开VS2017 x64本机工具命令提示
编译B:在命令提示窗口进入到boost安装目录中 cd\boost_1_67_0\boost_1_67_0
编译C:输入:bootstrap.bat 执行完成后,接着输入 b2 --toolset=msvc-14.1 --build-type=complete(因为VS2017,所以对应着14.1版本)
编译D:没有了D,有的只是一直的等待几个小时(如果电脑性能好的话半个小时就可以完成,性能差的话。。。。。)
、、、、、、、、、、、、、、、、、、、、、、、、编译Boost、、、、、、、、、、、、、、、、、、、、、、、、、、、
1、不太会C++/CLI的朋友们,建议还是去看一下下面的这本书《Visual C++/CLI从入门到精通》。。。
2、好了!开始项目的第一步吧。。。
3、打开VS2017(最好是用最新版的VS吧,新功能很棒),创建一个动态链接库(dll),把文件命名为TdCTPApiClr(封装的是交易api)
4、开始设置各种属性:
1)项目--右键--属性--常规 【公共语言运行时支持项:选择公共语言运行时支持(clr)】;
2)选择VC++目录 【包含目录:选择D:\boost_1_67_0\boost_1_67_0,引用目录:选择D:\boost_1_67_0\boost_1_67_0,
3)链接器:附加库目录选择D:\boost_1_67_0\boost_1_67_0\stage\lib】
5、完成上述的设置后别忘了在dllmain.cpp文件的头部加一句话:#pragma unmanaged
6、好了完成了以上的设置就可以开始真正的封装咯 。。。。。
7、把原生带来的cpp文件删掉,新建类(生成一个h文件和cpp文件),在h文件中添加namespace(并且cpp也要写上一样的命名空间),命名一个托管类 public ref TdCTPApiClr(public不能少),实现cpp文件中的构造函数和析构函数,如下图:
- 8、再生成一个类文件【CenterSpi.h/CenterSpi.cpp】,这两个文件是用来封装回调函数的,所以必须实现CenterSpi类和TdCTPApiClr类的相互调用。【一般如果两个头文件相互调用是不允许的,所以这里特殊的处理一下,以实现两个类相互调用】
- 1)、在TdCTPApiClr.h文件中写上class CenterSpi、在托管类中声明指针CenterSpi* ctspi
- 在public下面声明一个函数用于调用非托管类CenterSpi,代码如下:
- ///杂项
void CreateCenter(); - 2)、在TdCTPApiClr.cpp文件中include CenterSpi.h文件
- 实现头文件中的CreateCenter方法,利用.net的方式(构造函数)把当前类传送给非托管类
- void TdApiClr::CreateCenter() //tdcspi
{
tdcspi = new TdCenterSpi(this);
} - 3)、切换到CenterSpi.h文件,在构造函数里声明一个托管类的对象,通过这种方式接收托管类的对象成员
- (A、别忘记了#include<gcroot.h> 否则没法在非托管类中实例化托管类;B、声明一个万能指针(void* m_ptdapiClr)用于操作托管类的句柄)
4)、CenterSpi.cpp文件中通过实例化托管类 gcroot<TdApiClr^>*tdClr;声明托管类的对象
9、至此,已经实现两个类之间的连通,剩下的就是CenterSpi类继承Api的回调函数,TdCTPApiClr类操作Api的主动函数,这里边的代码量非常的大,就不在博客里写了,大家可以直接去GitHub上取项目的源码自己研究吧(因编程能力有限,果发现代码存在问题,请指出来,大家一起进步。。。)
https://github.com/jxlliang/From_CLI_CTPtdapi_Packge
10、因为我是整套量化交易系统都已经封装完毕,所以我深切的明白到后期当接口封装完毕后到C#端操作的时候还会遇到很多的问题的,而这些细节我都是花了很长时间才解决了,也欢迎大家如果遇到不懂的可以找我交流下,相互学习,共同进步。。。。。
qq:1013359736 【风。。。】