GithubHelp home page GithubHelp logo

python-ctpapi's Introduction

一、简介

此CTP Python API在windows上由于Python3.X系列互不兼容,所以之前的老版本(v6.3.19)分别编译了Python3.7和Python3.8的版本,新版本(v6.6.1)只编译了Python3.8的版本,windows上使用时请务必安装对应Python版本,linux上无此问题。
该API是用swig方法在官方C++ API上编译得到,完全开源,有兴趣自己编译的读者windows64版可以参考笔者 CTP Python API及Demo(利用Swig封装)Windows版(traderapi)这篇博客,Linux版只需要参考笔者其他博客,更改下makefile即可。
此方法编译得到的API在数据结构,参数名,函数名及用法上与C++版API完全一致,十分容易上手。
Github上如果不方便下,请到gitee上下载 https://gitee.com/nicai0609/Python-CTPAPI 或者扫码进入QQ群群文件中下载。编译维护不易,欢迎star,fork鼓励。

二、文件清单

.
|-- 6.6.1P1_API接口说明_20210805.chm //官方文档,也可至http://www.sfit.com.cn/下载(加了日期便于区别版本)
|-- demo  //相关demo,见下面章节详述
|   |-- calculate_volume_delta.py
|   |-- candle_demo.py
|   |-- md_demo.py
|   |-- td_demo(auth).py
|   `-- td_demo.py
|-- LICENSE
|-- README.md  //本文档
|-- v6.3.19_P1_20200106   //CTP生产版本,用于正式交易或连simnow
|   |-- linux   //linux下版本(不区分Python3.X系列,通用)
|   |   |-- libthostmduserapi_se.so
|   |   |-- libthosttraderapi_se.so
|   |   |-- thostmduserapi.py
|   |   |-- _thostmduserapi.so
|   |   |-- thosttraderapi.py
|   |   `-- _thosttraderapi.so
|   `-- win64   //windows下版本,由于Python3.7和Python3.8不兼容,现同时提供两种
|       |-- py37 //Python3.7版本
|       |   |-- _thostmduserapi.pyd   //交易库转换文件
|       |   `-- _thosttraderapi.pyd   //行情库转换文件
|       |-- py38 //Python3.8版本
|       |   |-- _thostmduserapi.pyd
|       |   `-- _thosttraderapi.pyd
|       |-- thostmduserapi.py      //行情头文件(以下4个文件对于Python3.7和Python3.8版本是共用的)
|       |-- thostmduserapi_se.dll  //行情官方动态库
|       |-- thosttraderapi.py      //交易头文件
|       `-- thosttraderapi_se.dll  //交易官方动态库
|-- v6.3.19_T1_20200423 //CTP评测版本,用于穿透式认证评测,文件内容具体同上说明
|   |-- linux
|   |   |-- libthostmduserapi_se.so
|   |   |-- libthosttraderapi_se.so
|   |   |-- thostmduserapi.py
|   |   |-- _thostmduserapi.so
|   |   |-- thosttraderapi.py
|   |   `-- _thosttraderapi.so
|   `-- win64
|       |-- py37
|       |   |-- _thostmduserapi.pyd
|       |   `-- _thosttraderapi.pyd
|       |-- py38
|       |   |-- _thostmduserapi.pyd
|       |   `-- _thosttraderapi.pyd
|       |-- thostmduserapi.py
|       |-- thostmduserapi_se.dll
|       |-- thosttraderapi.py
|       `-- thosttraderapi_se.dll
|-- v6.6.1_P1_20210406 //CTP生产版本,用于正式交易或连simnow,该版本官方新增了一些函数,具体参考chm文档
|   |-- linux
|   |   |-- libthostmduserapi_se.so
|   |   |-- libthosttraderapi_se.so
|   |   |-- thostmduserapi.py
|   |   |-- _thostmduserapi.so
|   |   |-- thosttraderapi.py
|   |   `-- _thosttraderapi.so
|   `-- win64
|       |-- py38
|       |   |-- _thostmduserapi.pyd
|       |   `-- _thosttraderapi.pyd
|       |-- thostmduserapi.py
|       |-- thostmduserapi_se.dll
|       |-- thosttraderapi.py
|       `-- thosttraderapi_se.dll
`-- v6.6.1_P1_CP_20210406 //CTP评测版本
    |-- linux
    |   |-- libthostmduserapi_se.so
    |   |-- libthosttraderapi_se.so
    |   |-- thostmduserapi.py
    |   |-- _thostmduserapi.so
    |   |-- thosttraderapi.py
    |   `-- _thosttraderapi.so
    `-- win64
        |-- py38
        |   |-- _thostmduserapi.pyd
        |   `-- _thosttraderapi.pyd
        |-- thostmduserapi.py
        |-- thostmduserapi_se.dll
        |-- thosttraderapi.py
        `-- thosttraderapi_se.dll

三、请求函数及数据结构

所有函数名、参数及参数数据结构都是与官方C++版一致的,可以参见上期技术官网文档。以登录请求为例:
官方C++版:
函数名

virtual int ReqUserLogin(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID) = 0;

调用方法

CThostFtdcReqUserLoginField reqUserLogin = { 0 };
strcpy_s(reqUserLogin.BrokerID, “0000”);
strcpy_s(reqUserLogin.UserID, “00001”);
strcpy_s(reqUserLogin.Password, “123456”); 
m_pUserApi->ReqUserLogin(&reqUserLogin, nRequestID++);

Python版:
函数名

def ReqUserLogin(self, pReqUserLoginField: 'CThostFtdcReqUserLoginField', nRequestID: 'int') -> "int":

调用方法

loginfield = api.CThostFtdcReqUserLoginField()
loginfield.BrokerID="0000"
loginfield.UserID="00001"
loginfield.Password="123456"
tradeapi.ReqUserLogin(loginfield,0)

所有的函数名均可以在相应头文件底部class CThostFtdcTraderApiclass CThostFtdcMdApi中查到,函数声明中自带了参数类型,参数结构直接在头文件中搜索就可以。至于对应的函数怎么用,请参考附带官方文档。以登录为例,找到文档中

/6.6.1P1_API接口说明/交易接口/CThostFtdcTraderApi/ReqUserLogin

这里面写的非常清楚。

四、回调函数及数据结构

所有函数名、参数及参数数据结构都是与官方C++版一致的,可以参见上期技术官网文档。以登录响应为例: 官方C++版:
函数名

virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};

调用方法为继承该函数所在类,重写该函数调用。
Python版:
函数名

def OnRspUserLogin(self, pRspUserLogin: 'CThostFtdcRspUserLoginField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":

调用方法同样是继承所在CThostFtdcTraderSpi类,重写该函数,实现自己需要的逻辑。
所有的函数名均可以在头文件底部class CThostFtdcTraderSpiclass CThostFtdcMdSpi中查到,函数名中自带了参数类型,参数结构直接在头文件中搜索就可以。

五、Demo及其用法

将td_demo(auth).py文件直接拷贝到API库交易相关文件(3个)同一文件夹中,切换到该目录运行Python td_demo(auth).py即可直接运行。此时如下几个文件应该在一个文件夹底下:

.
|-- _thosttraderapi.pyd
|-- td_demo(auth).py
|-- thosttraderapi.py
`-- thosttraderapi_se.dll

md_demo.py用法相同。

  • td_demo.py实现了简单的登录,查询结算单,确认结算单并买开一手rb1909合约的功能。注意,要将td_demo.py顶部的几个参数改为你自己测试环境参数;合约过期的话要换成非过期合约。
  • md_demo.py实现了订阅"au1912","IC1909","i2001","TA001"这4个合约的功能,并将收取行情存入csv,可以修改subID列表订阅别的合约,同时也要注意修改底部的行情前置地址。
  • td_demo(auth).py实现了加入认证功能后的登录报单等功能,适用于正式生产上。
  • candle_demo.py实现了绘制K线图数据功能

六、常见问题

1. 运行时“ImportError: DLL load failed: 找不到指定的模块”

首先确认运行的python版本,运行python -V,确保是对应的Python版本(目前仅支持Python3.7和Python3.8版本)。如果版本没有问题,windows上搜索“微软常用运行库合集64位” 安装,linux上确保so所在目录在环境变量LD_LIBRARY_PATH中。

2.出错直接退出

通常都是类型对象为None,却直接使用了该对象的成员变量。以查结算单为例,返回回调中,如果输出结算单内容通常直接写成:

def OnRspQrySettlementInfo(self, pSettlementInfo: 'CThostFtdcSettlementInfoField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
    print ("content:",pSettlementInfo.Content)

这时如果查到结算单自然没有问题,但如果查回结算单为空则直接出错退出,因为pSettlementInfo是None类型。所以正确写法应该先判断是否为空,写成如下:

def OnRspQrySettlementInfo(self, pSettlementInfo: 'CThostFtdcSettlementInfoField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
    if  pSettlementInfo is not None :
        print ("content:",pSettlementInfo.Content)

3.API调用init后为啥没有任何反应(demo运行没有任何反应或者没有OnFrontConnected回调)?

先检查网络链路是否畅通,可以telnet一下CTP前置地址,是否通畅。再检查API版本是否正确,连生产或者simnow现必须是v6.3.19_P1_20200106或者v6.6.1_P1_20210406版本api,评测请用v6.3.19_T1_20200423或者v6.6.1_P1_CP_20210406。详细参考如下: image

4.运行mddemo没有收到行情?

请参考CTP程序化交易入门系列之四:行情订阅常见问题解答这篇博客

七、欢迎交流

欢迎扫二维码关注或者搜索程序化交易入门(QuantRoad2019),一起学习程序化交易!
image

QQ交流群(767101469),一起讨论程序化交易!
image

python-ctpapi's People

Contributors

nicai0609 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-ctpapi's Issues

读取不了持仓

登录、下单都OK,但持仓数据读取不了,也不抛异常
def OnRspQryInvestorPosition(self,pPositions:'CThostFtdcInvestorPositionField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
print ("OnRspQryInvestorPosition")
print ("ErrorID=",pRspInfo.ErrorID)
print ("ErrorMsg=",pRspInfo.ErrorMsg)
try:
print(pPositions)
except:
import traceback
traceback.print_exc()

def GetPositions(self):
queryfield=api.CThostFtdcQryInvestorPositionField ()
queryfield.BrokerID=BROKERID
queryfield.InvestorID=USERID
self.tapi.ReqQryInvestorPosition(queryfield,0)

linux环境下怎么编译

程序中还有其他代码需要执行只调用ctp的Init函数,不想调用Join函数堵塞,可是程序直接退出

程序无法中断运行

md_demo.py在终端下ctrl+c没有反映,
手工加上try/except keyboardinterrupt/exit() 也是如止

arch linux/python 3.7.7

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.