CTP程序化交易入门系列之二:API基本架构及初始化
上节讲了CTP程序化交易的入门工作:下载API,准备账号密码地址等。这节我们来讲API基本架构及初始化。
一、 CTP API基本架构
这里为了便于大家理解API的相关函数,我简略地讲一下API的基本架构。如上图所画,左边部分是客户的交易程序,中间是封装好的API动态库底层;右边是CTP系统。以客户登录为例,顺序逻辑如下:
- 客户程序里调用API的函数ReqUserLogin写入动态库底层维护的缓存中;
- 动态库内置线程读取缓存内容通过tcp链接发往CTP前置;
- 动态库内置线程通过tcp链接读取CTP的回复,然后回调SPI中的函数OnRspUserLogin;
- 客户在继承重写OnRspUserLogin函数,在其中处理自己的业务逻辑;
其实这也是国内市场上(包括交易所)大部分异步API的基本架构。
二、接口文件清单
以win64为例:
thosttraderapi.py //交易头文件
_thosttraderapi.pyd //交易库转换文件
thosttraderapi.dll //交易官方动态库,穿透式版为thosttraderapi_se.dll
thostmduserapi.py //行情头文件
_thostmduserapi.pyd //行情库转换文件
thostmduserapi.dll //行情官方动态库,穿透式版为thostmduserapi_se.dll
可以看到API分为交易3个文件,主要负责认证,登录,报单,撤单,查资金,查持仓等功能;行情3个文件,主要负责订阅收取行情。两部分可以独立运行。
三、初始化函数说明
API在调用前需要初始化,初始化的流程都是固定的(详细参考td_demo.py):
import thosttraderapi as api//创建API实例
tradeapi=api.CThostFtdcTraderApi_CreateFtdcTraderApi() //创建SPI实例。CTradeSpi是继承自头文件中CThostFtdcTraderSpi的类型,
//用于收从CTP的回复,可以重写父类中的函数来实现自己的逻辑
tradespi=CTradeSpi(tradeapi) //将创建的SPI实例注册进实例,这样该API实例发出的请求对应的回报就会回调到对应的SPI实例的函数
tradeapi.RegisterSpi(tradespi) //订阅共有流与私有流。订阅方式主要有三种,分为断点续传,重传和连接建立开始传三种。
tradeapi.SubscribePrivateTopic(api.THOST_TERT_QUICK)
tradeapi.SubscribePublicTopic(api.THOST_TERT_QUICK)// 注册前置地址,是指将CTP前置的IP地址注册进API实例内
tradeapi.RegisterFront(FrontAddr) //API启动,init之后就会启动一个内部线程读写,并去连CTP前置
tradeapi.Init()//Join函数是使得函数阻塞在这里,等待api实例创建的内部线程的结束。
//内部线程需要release才会释放结束
tradeapi.Join()
四、请求及回复函数说明
以交易为例,从头文件(thosttraderapi.py)底部可以看到有两个类class CThostFtdcTraderApi和class CThostFtdcTraderSpi。CThostFtdcTraderApi类中是所有的请求函数,例如请求登录:
def ReqUserLogin(self, pReqUserLoginField: 'CThostFtdcReqUserLoginField', nRequestID: 'int') -> "int":
投资者只需要用该函数所要求的参数类型声明一个变量,并将变量中相应成员赋值,再调用函数发送出去就可。如下:
loginfield = api.CThostFtdcReqUserLoginField()
loginfield.BrokerID="0000"
loginfield.UserID="00001"
loginfield.Password="123456"
tradeapi.ReqUserLogin(loginfield,0)
这样就会将登录请求发送到CTP的前置。
而该请求对应的回复我们怎么得到呢?这就需要靠SPI实例了。在第三节中可以看到通过RegisterSpi函数,API的实例和SPI的实例是一一对应的。所以如果CTP发回来回复,底层dll就保证了将回调到对应的SPI中登陆回复函数:
def OnRspUserLogin(self, pRspUserLogin: 'CThostFtdcRspUserLoginField', pRspInfo: 'CThostFtdcRspInfoField', nRequestID: 'int', bIsLast: 'bool') -> "void":
该函数对应的参数便是CTP回复的信息,我们可以继承CThostFtdcTraderSpi类,然后重写该函数,将相应的信息答应出来,也可以在该函数中实现其他的逻辑,例如demo中就在该函数中继续去查结算单信息。
细心的读者一定发现了,CThostFtdcTraderApi类中的请求函数和CThostFtdcTraderSpi类中的回复函数命名存在一一对应关系。这种对应关系可以借用官方文档中一张图:
五、初始化时序图
最后我们以官方文档中的初始化时序图收尾。
下节预告:
如何使用CTP API获取实时行情
关注公众号,一起学习程序化交易!
关注公众号,一起学习程序化交易!
CTP程序化交易入门系列之二:API基本架构及初始化相关推荐
- CTP程序化交易入门系列之四:行情订阅常见问题解答
前言 这一章总结了大家订阅行情最常问的一些问题的相关解答,希望能有帮助.如有不对的地方,欢迎指正.后期会在这里更新迭代,欢迎到这底下提问! 更新时间:20201112 1 获取行情的地址在哪里可以查到 ...
- CTP程序化交易入门系列之六:报单(一)
行情(mduserapi)这一块终于介绍的差不多了,下面着重介绍交易(traderapi)相关.再次强调两点: 一.交易和行情是完全独立的,互不干扰: 二.本系列用Python版本讲解,主要考虑到Py ...
- CTP程序化交易入门系列之一:准备
前言: 笔者自毕业后一直从事低延时交易系统开发行业,这些年经历过神奇bug,给客户培训,回答客户千奇百怪的问题.在这个过程中,自身能力得到了很大的提升,但有时在面对一些小白问题时,总是感叹为何没有一系 ...
- CTP程序化交易入门系列之三:获取实时行情及k线合成
前面两篇有了基础知识的准备,这一篇讲通过CTP API获取实时行情,录入csv,实时合成k线.github上开源了录入csv及合成k线代码,后台回复pyctp可获取.先上两张效果图: 图1 csv数据 ...
- 【量化】量化交易入门系列6:量化交易学习书籍推荐(二)
作者:悠悠做神仙 来源: 恒生LIGHT云社区 上一篇 量化交易入门系列5:量化交易学习书籍推荐(一) 我们介绍一些量化交易一些操作和理论性书籍,可能对于刚入门的大家而言,可能有些枯燥.所以这篇文章, ...
- 【量化】量化交易入门系列2:经典的量化交易策略(上)
作者:悠悠做神仙 来源: 恒生LIGHT云社区 上一篇文章 量化交易入门系列1:编程语言与数据源 ,介绍了关于量化交易的基本概念,以及要做量化交易的编程语言选择,和量化交易的一些数据源获取工具.那么, ...
- 【量化】量化交易入门系列5:量化交易学习书籍推荐(一)
作者:悠悠做神仙 来源: 恒生LIGHT云社区 量化交易入门系列,给大家介绍了关于量化交易的数据源获取.编程语言推荐.经典的交易策略,那么本篇将介绍一些比较经典的量化交易书籍. 书籍是人类智慧的结晶, ...
- [转]OllyDBG 入门系列(二)-字串参考
标 题: [原创]OllyDBG 入门系列(二)-字串参考 作 者: CCDebuger 时 间: 2006-02-14,13:34 链 接: http://bbs.pediy.com/showthr ...
- STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置
摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...
最新文章
- 子分类账知识学习(汇总网上比较有用的资料)
- 怎么两边同时取ln_脏辫发型怎么编编发教程图解简单易学!
- linux socket无延迟发送数据
- XAML实例教程系列 – 对象和属性
- SQL语言之DQL语言学习(三)排序查询
- jscript换行等特殊字符
- 【Android QR Code】开源项目:ZXing(一)导入项目
- Temp文件夹缺少network service权限,webservice能访问,但是不能调用
- BCD与ASCII码互转-C语言实现
- html搜索框 模糊搜索,前端js模糊搜索(模糊查询)
- 利用分类模型学习特征权重
- [En]Web Forms Syntax Reference
- Windows10 设置网络共享文件驱动器
- 学习python自动化测试的好处
- 特殊字符图案大全c语言,特殊符号大全
- FIRST集 FOLLOW集和SELECT集
- 八字计算方法 php,php计算四柱(生辰八字)的方法
- 【论文笔记】ViLBERT:Pretraining Task-Agnostic VisiolinguisticRepresentations for Vision-and-Language Tasks
- 搭建属于自己的云同步盘
- 替换word中手动换行(软回车)为段落标记(硬回车)