1) VS 2015html
2) Python 3.7 64位python
3) CTP API (从 http://www.sfit.com.cn/5_2_DocumentDown.htm 下载,此文档使用的是 http://www.sfit.com.cn/APIHistory1.html 下载的 6.3.11_20180109 版本)c++
error.dtd error.xml ThostFtdcMdApi.h ThostFtdcTraderApi.h ThostFtdcUserApiDataType.h ThostFtdcUserApiStruct.h thostmduserapi.dll thostmduserapi.lib thosttraderapi.dll thosttraderapi.lib
4) Swingwindows
下载地址: https://sourceforge.net/projects/swig/files/。本文用的是 3.0.12 版本api
使用方式:下载完成后,解压缩,而后 将存放的文件路径 加到 系统变量 PATH 中。多线程
5) liviconv 库工具
这个库主要适用于字节编码转换,由于CTP的中文是GB2312编码,转换为UTF-8编码,适合python输出编码
编译方法:按照 https://blog.csdn.net/ghevinn/article/details/9825765 步骤spa
备注:1. 本次使用的是最新的 1.16 版本,能够经过 http://ftp.gnu.org/pub/gnu/libiconv/, 查询当前可用的版本.net
2. VS 编译生成的是 Release x64 位。
在刚刚下载获得的API文件夹20180109_tradeapi64_windows内,新建文件thosttraderapi.i,内容以下
%module(directors="1") thosttraderapi %{ #include "ThostFtdcTraderApi.h" #include "iconv.h" %} %typemap(out) char[ANY], char[] { if ($1) { iconv_t cd = iconv_open("utf-8", "gb2312"); if (cd != reinterpret_cast<iconv_t>(-1)) { char buf[4096] = {}; const char **in = (const char **)&$1; char *out = buf; size_t inlen = strlen($1), outlen = 4096; if (iconv(cd, in, &inlen, &out, &outlen) != static_cast<size_t>(-1)) { size_t size = outlen; while (size && (buf[size - 1] == '\0')) --size; resultobj = SWIG_FromCharPtrAndSize(buf, size); } iconv_close(cd); } } } %feature("director") CThostFtdcTraderSpi; %ignore THOST_FTDC_VTC_BankBankToFuture; %ignore THOST_FTDC_VTC_BankFutureToBank; %ignore THOST_FTDC_VTC_FutureBankToFuture; %ignore THOST_FTDC_VTC_FutureFutureToBank; %ignore THOST_FTDC_FTC_BankLaunchBankToBroker; %ignore THOST_FTDC_FTC_BrokerLaunchBankToBroker; %ignore THOST_FTDC_FTC_BankLaunchBrokerToBank; %ignore THOST_FTDC_FTC_BrokerLaunchBrokerToBank; %feature("director") CThostFtdcTraderSpi; %include "ThostFtdcUserApiDataType.h" %include "ThostFtdcUserApiStruct.h" %include "ThostFtdcTraderApi.h"
这是一个接口文件,用于告诉swig为哪些类和方法建立接口。打开windows cmd工具,cd到当前目录\20180109_tradeapi_windows下。 在cmd中运行命令
swig -threads -c++ -python thosttraderapi.i
等到运行完成后,能够看到当前目录下生成了
thosttraderapi_wrap.h thosttraderapi_wrap.cxx thosttradeapi.py
.h和.cx文件是用于包装原来C++接口的文件,下面要用。.py文件是python调用方法的接口文件。
在当前文件夹下创建一个C++工程,工程的应用程序类型选DLL,工程名为_thosttraderapi(建工程的步骤也可参考https://blog.csdn.net/pjjing/article/details/53186394这篇文章第3步开头),
须要注意几点:1)工程建64位dll类型,2)运行库选多线程(/MT)。而后将以下文件拷贝到_thosttraderapi\文件夹下:
ThostFtdcTraderApi.h ThostFtdcUserApiDataType.h ThostFtdcUserApiStruct.h thosttraderapi.lib thosttraderapi_wrap.cxx thosttraderapi_wrap.h libiconv.lib iconv.h
在c++工程中添加现有项,将这些文件所有添加到工程中去。下面还要作几步:
1)将你安装的python下include文件夹的路径添加至C++附加包含目录。个人路径是 D:\Program Files (x86)\Python37\include;,C++附加包含目录在工程-属性-配置属性-c/c++。
2)将你安装的python中python37.lib添加至工程附加依赖项中。个人lib路径是 D:\Program Files (x86)\Python37\libs\python37.lib;,附加依赖项在 工程-属性-配置属性-连接器-输入。
3)这样所有完成以后,选择Release版本 64位,咱们按F7编译,在\_thosttraderapi\Release目录底下可见_thosttraderapi.dll动态库文件,说明编译成功,将其重命名为_thosttraderapi.pyd,这样CTP Python API就编译成功了。
【有可能须要将 iconv.h 和 libIconv.lib 将放在待生成的 Release 目录下】
若是编译出现一些问题,能够百度解决。可能涉及到要修改pyconfig.h,object.h,Python.h三个文件。
问题1: 找不到 没法将参数 2 从“char **”转换为“const char **”, 原文的 thosttraderapi.i 在 VS2015 编译时,有问题,须要将 char **in = &$1; 改成 const char **in = (const char **)&$1;
问题2:没法解析的外部符号 __imp_setlocale,解决办法:在 thosttradeapi_wrap.cxx 的头部加上 #pragma comment(lib,"msvcrtd.lib")
问题3:默认库“library”与其余库的使用冲突;使用 /NODEFAULTLIB:library,解决办法:(https://blog.csdn.net/larry_zeng1/article/details/86679869)
1.右击工程 - 属性 ”配置属性 - 连接器 - 输入 - 忽略特定库“,添加 ”libcmtd.lib“;
或 2.右击工程 - 属性 ”配置属性 - 连接器 - 命令行” 添加: /NODEFAULTLIB:"libcmtd.lib"
4. Python Demo
经过在c++中引入字符转码为utf-8,如今中文已经能够直接输出了,详见demo。
新建文件traderapi_demo.py,注意文件同目录底下要有以下三个文件:
thosttradeapi.py thosttraderapi.dll _thosttradeapi.pyd