前言:

目前上期技术CTP系统提供的API版本是C++版本,本文主要介绍Windows 32位平台下利用Swig工具将CTP C++接口trader API转换为python可调用的接口。

1. 准备工作

从CTP官网上下载CTP API点击下载。32位的API文件包清单如下:

error.dtd

error.xml

ThostFtdcMdApi.h

ThostFtdcTraderApi.h

ThostFtdcUserApiDataType.h

ThostFtdcUserApiStruct.h

thostmduserapi.dll

thostmduserapi.lib

thosttraderapi.dll

thosttraderapi.lib

ThostFtdcUserApiDataType.h中找出如下几行注释掉(对用户没有影响,但会影响python API编译)

///银行发起银行资金转期货

//#define THOST_FTDC_VTC_BankBankToFuture '102001'

///银行发起期货资金转银行

//#define THOST_FTDC_VTC_BankFutureToBank '102002'

///期货发起银行资金转期货

//#define THOST_FTDC_VTC_FutureBankToFuture '202001'

///期货发起期货资金转银行

//#define THOST_FTDC_VTC_FutureFutureToBank '202002'

///银行发起银行转期货

//#define THOST_FTDC_FTC_BankLaunchBankToBroker '102001'

///期货发起银行转期货

//#define THOST_FTDC_FTC_BrokerLaunchBankToBroker '202001'

///银行发起期货转银行

//#define THOST_FTDC_FTC_BankLaunchBrokerToBank '102002'

///期货发起期货转银行

//#define THOST_FTDC_FTC_BrokerLaunchBrokerToBank '202002'

安装Swig软件,本文中所用的Swig是swigwin-2.0.11版本,点击下载。

安装python,注意要安装32位版本,将环境变量配置好。本文所用的是2.7.12版本。

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

在刚刚下载得到的API文件夹20160606_tradeapi_windows内,新建文件thosttraderapi.i,内容如下

%module(directors="1") thosttraderapi

%{ #include "ThostFtdcTraderApi.h" %}

%feature("director") CThostFtdcTraderSpi;

%include "ThostFtdcUserApiDataType.h"

%include "ThostFtdcUserApiStruct.h"

%include "ThostFtdcTraderApi.h"

这是一个接口文件,用于告诉swig为哪些类和方法创建接口。打开windows cmd工具,cd到当前目录\20160606_tradeapi_windows下。 在cmd中运行命令

swig -c++ -python thosttraderapi.i

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

thosttraderapi_wrap.h

thosttraderapi_wrap.cxx

thosttradeapi.py

.h和.cx文件是用于包装原来C++接口的文件,下面要用。.py文件是python调用方法的接口文件。

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

在当前文件夹下建立一个C++工程,工程的应用程序类型选DLL,工程名为_thosttraderapi,将如下文件拷贝到_thosttraderapi\_thosttraderapi\文件夹下:

ThostFtdcTraderApi.h

ThostFtdcUserApiDataType.h

ThostFtdcUserApiStruct.h

thosttraderapi.lib

thosttraderapi_wrap.cxx

thosttraderapi_wrap.h

在c++工程中添加现有项,将这些文件全部添加到工程中去。下面还要做几步:

将你安装的python下include文件夹的路径添加至C++附加包含目录。我的路径是C:\Python27\include;,C++附加包含目录在工程-属性-配置属性-c/c++处。

将你安装的python中python27.lib添加至工程附加依赖项中。我的lib路径是C:\Python27\libs\python27.lib,附加依赖项在工程-属性-配置属性-链接器-输入处。

thosttraderapi_wrap.cxx文件中还有需要修改的地方,是SwigDirector_CThostFtdcMdSpi::OnFrontConnected()函数内,因为我发现每次回调OnFrontConnected会导致python API崩溃(OnFrontDisconnected()函数无此问题),我将如下行注释掉就可以正常使用:

#else

//swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "OnFrontConnected", NULL);

#endif

/*

if (!result) {

PyObject *error = PyErr_Occurred();

if (error) {

Swig::DirectorMethodException::raise("Error detected when calling 'CThostFtdcMdSpi.OnFrontConnected'");

}

}

*/

当然,这只是我的讨巧方法,这会导致没有回调OnFrontConnected。读者可以一起探讨下怎么解决这个bug。

这样全部完成之后,我们按F7编译,在\_thosttraderapi\Debug目录底下可见_thosttraderapi.dll动态库文件,说明编译成功,将其重命名为_thosttraderapi.pyd,这样CTP Python API就编译成功了。

如果编译出现一些问题,可以百度解决。可能涉及到要修改pyconfig.h,object.h,Python.h三个文件。

4. Python Demo

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

thosttradeapi.py

thosttraderapi.dll

_thosttradeapi.pyd

本demo实现登录成功后报单,收报单回报的功能。完整的demo代码如下:

# -*- coding: gbk -*-

import time

import thosttraderapi as api

def ReqorderfieldInsert(tradeapi):

print "ReqOrderInsert Start"

orderfield=api.CThostFtdcInputOrderField()

orderfield.BrokerID="8000"

orderfield.InstrumentID="sc1412"

orderfield.UserID="000005"

orderfield.InvestorID="000005"

orderfield.Direction=api.THOST_FTDC_D_Sell

orderfield.LimitPrice=52050

orderfield.VolumeTotalOriginal=1

orderfield.OrderPriceType=api.THOST_FTDC_OPT_LimitPrice

orderfield.ContingentCondition = api.THOST_FTDC_CC_Immediately

orderfield.TimeCondition = api.THOST_FTDC_TC_GFD

orderfield.VolumeCondition = api.THOST_FTDC_VC_AV

orderfield.CombHedgeFlag="1"

orderfield.CombOffsetFlag="0"

orderfield.GTDDate=""

orderfield.orderfieldRef="1"

orderfield.MinVolume = 0

orderfield.ForceCloseReason = api.THOST_FTDC_FCC_NotForceClose

orderfield.IsAutoSuspend = 0

tradeapi.ReqOrderInsert(orderfield,0)

print "ReqOrderInsert End"

class CTradeSpi(api.CThostFtdcTraderSpi):

tapi=''

def __init__(self,tapi):

api.CThostFtdcTraderSpi.__init__(self)

self.tapi=tapi

def OnRspUserLogin(self, *args):

print "OnRspUserLogin"

rsploginfield=args[0]

rspinfofield=args[1]

print "SessionID=",rsploginfield.SessionID

print "ErrorID=",rspinfofield.ErrorID

print "ErrorMsg=",rspinfofield.ErrorMsg

ReqorderfieldInsert(self.tapi)

def OnRtnOrder(self, *args):

print "OnRtnOrder"

rtnfield=args[0]

print "OrderStatus=",rtnfield.OrderStatus

print "StatusMsg=",rtnfield.StatusMsg

print "LimitPrice=",rtnfield.LimitPrice

def OnRspOrderInsert(self, *args):

print "OnRspOrderInsert"

rspinfofield=args[1]

print "ErrorID=",rspinfofield.ErrorID

print "ErrorMsg=",rspinfofield.ErrorMsg

def main():

tradeapi=api.CThostFtdcTraderApi_CreateFtdcTraderApi()

tradespi=CTradeSpi(tradeapi)

loginfield = api.CThostFtdcReqUserLoginField()

loginfield.BrokerID="8000"

loginfield.UserID="000005"

loginfield.Password="123456"

loginfield.UserProductInfo="python dll"

tradeapi.RegisterFront("tcp://172.19.125.39:39233")

tradeapi.RegisterSpi(tradespi)

tradeapi.SubscribePrivateTopic(api.THOST_TERT_RESUME)

tradeapi.SubscribePublicTopic(api.THOST_TERT_RESUME)

tradeapi.Init()

time.sleep(2)

tradeapi.ReqUserLogin(loginfield,0)

tradeapi.Join()

if __name__ == '__main__':

main()

本人所编译的CTP0606版本的交易、行情Python API,点击下载。声明:仅是个人爱好编译,对此API引起的你的任何损失不负责任。

python 调用 ctp_CTP Python API(利用Swig 封装)Windows版(traderapi)相关推荐

  1. 用Python调用华为云API接口发短信

    [摘要] 用Python调用华为云API接口实现发短信,当然能给调用发短信接口前提条件是通过企业实名认证,而且有一个通过审核的短信签名,话不多说,showcode #!/usr/bin/python3 ...

  2. Python调用高德地图API实现经纬度换算、地图可视化

    作者 | 糖甜甜甜 出品 | 经管人学数据分析 Python调用高德地图API实现经纬度换算.地图可视化 前地图可视化的工具和函数比较多,但是在不知道相关地点经纬度的情况下,通过python调用高德地 ...

  3. python调用百度翻译-Python 调用百度翻译API

    由于实习公司这边做的是日文app,有时要看看用户反馈,对于我这种五十音图都没记住的人,表示百度翻译确实还可以.但不想每次都复制粘贴啊,google被墙也是挺蛋疼的事,所以用python结合baidu ...

  4. 你还在为高德地图找不到门牌号等详细地址而烦恼吗?你还在等什么——Python调用高德地图API实现经纬度换算、地图可视化

    Python调用高德地图API实现经纬度换算.地图可视化 前地图可视化的工具和函数比较多,但是在不知道相关地点经纬度的情况下,通过python调用高德地图API实现经纬度换算,并且直接在高德地图新推出 ...

  5. python调用高德地图api 可视化_Python调用高德地图API实现经纬度换算、地图可视化...

    前地图可视化的工具和函数比较多,但是在不知道相关地点经纬度的情况下,通过python调用高德地图API实现经纬度换算,并且直接在高德地图新推出的轻量级可视化平台上实现一键式地图可视化,这其中需要申请密 ...

  6. python实现简单的api接口-简单实现Python调用有道API接口(最新的)

    # ''' # Created on 2018-5-26 # # @author: yaoshuangqi # ''' import urllib.request import urllib.pars ...

  7. python 调用 .netcore api_浅谈Python调用XBee的API来进行通讯

    浅谈Python调用XBee的API来进行通讯 用python编程来控制串口(COM口),来让一对XBee进行通讯.不需要借助终端来发送和接收数据,增大了XBee使用的灵活性.这才是使用XBee模块的 ...

  8. python爬去新浪微博_!如何通过python调用新浪微博的API来爬取数据

    python抓取新浪微博,求教 爬手机端 可以参考的代码, #-*-coding:utf8-*- import smtplib from email.mime.text import MIMEText ...

  9. Python调用腾讯API合成语音

    Python调用腾讯API合成语音 腾讯语音合成 Python调用腾讯接口 说明 腾讯语音合成 腾讯AI开放平台中有ai语音合成的接口,其体验网址是https://ai.qq.com/product/ ...

最新文章

  1. DK云网关与普通DTU之间的区别
  2. 数学建模公选课Ch1.2020.4.4
  3. java 免费cms_开源 免费 java CMS
  4. 核心期刊投稿经验(遥感信息)
  5. 亚马逊的人工智能将实时语音识别错误率降低了6.2%
  6. Flex游戏篇——游戏开发概述
  7. 最棒的 JavaScript 学习指南(2018版)
  8. 第三次面试题目 (反省中!!)
  9. node文件上传插件formidable的使用
  10. linux怎么设置raid,如何在Linux中配置RAID-教程
  11. linux推箱子游戏,Linux下用C语言实现推箱子游戏
  12. 数字化会议管理系统,实现会议全流程管理
  13. 如何解决OpenStack上Windows虚机CPU负荷
  14. 微信运动服务器忙,微信运动步数每天不足百步,你们宅着忙什么呢?
  15. keyshot渲染图文教程_keyshot基础图文教程,手把手教你用keyshot制作动画效果
  16. 测试化妆品真假软件,查询化妆品真伪的app叫什么
  17. 鸡腿的笑话--鸡腿篇
  18. Windows API程序设计入门(新手的第一个Windows程序)
  19. 系统分析师和系统架构师的区别?
  20. Docker: 绿色版docker(带dockerui)安装测试记录_20200120_七侠镇莫尛貝

热门文章

  1. uniapp + vue 实现色弱测试小游戏
  2. Github与GitKraken的基础使用(一)[学习笔记]
  3. 客户推荐:公众号社区产品为什么要选择粉丝圈?
  4. 【Vue2】让别人访问自己本地运行项目
  5. 7 判别式模型--机器学习基础理论入门
  6. IE6/7/8/CSS/BUG以及兼容问题解决方法
  7. [杀毒防毒]用Mcafee打造自己的安全系统详解
  8. ERA5 积雪 降雪 区别_漠河降雪量已达入秋最大级别 气象专家提醒出门注意安全防范_热点...
  9. mysql swing java职业介绍信息管理系统源码+报告
  10. 将1~36进制的数字转成十进制数输入