您的位置:首页 > 编程语言 > Python开发

CTP Python API(利用Swig 封装)Windows版(mduserapi)

2017-08-17 19:18 826 查看
1. 准备工作

和上文traderapi一致。此版本是在原先版本上的升级,解决了onfrontconnected回调的宕机问题。感谢知乎网友@warlock 一起探讨。

2. 通过Swig得到python接口文件

新建文件
thostmduserapi.i
,内容如下

%module(directors="1") thostmduserapi
%{
#include "ThostFtdcMdApi.h"
%}

%feature("director") CThostFtdcMdSpi;

%include "ThostFtdcUserApiDataType.h"
%include "ThostFtdcUserApiStruct.h"
%include "ThostFtdcMdApi.h"

%inline %{
int SubscribeMarketDataByManual(CThostFtdcMdApi * arg1,char *arg2){
char *ppInstrumentID[1];
ppInstrumentID[0] = arg2;
return (int)(arg1)->SubscribeMarketData(ppInstrumentID,1);
}
%}


这里主要的变化就在于我添加了一个订阅行情的函数,因为我实际操作过程中发现CTP订阅行情参数是二级指针,转化为python后我每次调用都会宕机。没办法我折中写了个参数为一级指针的函数包装了下CTP订阅行情函数,自己手写的函数每次只能订阅一个合约。

cmd
中切换到当前文件夹下,运行命令

swig -threads -c++ -python thostmduserapi.i


等到运行完成后,可以看到当前目录下生成了

thostmduserapi_wrap.h

thostmduserapi_wrap.cxx

thostmduserapi.py

3. 通过C++得到python可调用的pyd动态库

与上文traderapi中一致。

4. Python Demo

新建文件mduserapi_demo.py,注意文件同目录底下要有如下三个文件:

thostmduserapi.py

thostmduserapi.dll

_thostmduserapi.pyd

本demo实现登录成功后订阅两个合约行情的功能。完整的demo代码如下:

# -*- coding: gbk -*-
import thostmduserapi as mdapi

class CFtdcMdSpi(mdapi.CThostFtdcMdSpi):
tapi=''
def __init__(self,tapi):
mdapi.CThostFtdcMdSpi.__init__(self)
self.tapi=tapi
def OnFrontConnected(self):
print "OnFrontConnected"
loginfield = mdapi.CThostFtdcReqUserLoginField()
loginfield.BrokerID="8000"
loginfield.UserID="000005"
loginfield.Password="123456"
loginfield.UserProductInfo="python dll"
self.tapi.ReqUserLogin(loginfield,0)
def OnRspUserLogin(self, *args):
print "OnRspUserLogin"
rsploginfield=args[0]
rspinfofield=args[1]
print "SessionID=",rsploginfield.SessionID
print "ErrorID=",rspinfofield.ErrorID
print "ErrorMsg=",rspinfofield.ErrorMsg
mdapi.SubscribeMarketDataByManual(self.tapi,"sc1412")
mdapi.SubscribeMarketDataByManual(self.tapi,"sc1512")

def OnRtnDepthMarketData(self, *args):
print "OnRtnDepthMarketData"
field=args[0]
print "InstrumentID=",field.InstrumentID
print "LastPrice=",field.LastPrice

def main():
mduserapi=mdapi.CThostFtdcMdApi_CreateFtdcMdApi()
mduserspi=CFtdcMdSpi(mduserapi)
mduserapi.RegisterFront("tcp://172.19.125.39:39235")
mduserapi.RegisterSpi(mduserspi)
mduserapi.Init()
mduserapi.Join()

if __name__ == '__main__':
main()


本人所编译的CTP0606版本的交易、行情
Python API
点击下载。声明:仅是个人爱好编译,对此API引起的你的任何损失不负责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows python api