上节讲了CTP程序化交易的入门工作:下载API,准备账号密码地址等。这节我们来讲API基本架构及初始化。

一、 CTP API基本架构

 这里为了便于大家理解API的相关函数,我简略地讲一下API的基本架构。如上图所画,左边部分是客户的交易程序,中间是封装好的API动态库底层;右边是CTP系统。以客户登录为例,顺序逻辑如下:

  1. 客户程序里调用API的函数ReqUserLogin写入动态库底层维护的缓存中;
  2. 动态库内置线程读取缓存内容通过tcp链接发往CTP前置;
  3. 动态库内置线程通过tcp链接读取CTP的回复,然后回调SPI中的函数OnRspUserLogin;
  4. 客户在继承重写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基本架构及初始化相关推荐

  1. CTP程序化交易入门系列之四:行情订阅常见问题解答

    前言 这一章总结了大家订阅行情最常问的一些问题的相关解答,希望能有帮助.如有不对的地方,欢迎指正.后期会在这里更新迭代,欢迎到这底下提问! 更新时间:20201112 1 获取行情的地址在哪里可以查到 ...

  2. CTP程序化交易入门系列之六:报单(一)

    行情(mduserapi)这一块终于介绍的差不多了,下面着重介绍交易(traderapi)相关.再次强调两点: 一.交易和行情是完全独立的,互不干扰: 二.本系列用Python版本讲解,主要考虑到Py ...

  3. CTP程序化交易入门系列之一:准备

    前言: 笔者自毕业后一直从事低延时交易系统开发行业,这些年经历过神奇bug,给客户培训,回答客户千奇百怪的问题.在这个过程中,自身能力得到了很大的提升,但有时在面对一些小白问题时,总是感叹为何没有一系 ...

  4. CTP程序化交易入门系列之三:获取实时行情及k线合成

    前面两篇有了基础知识的准备,这一篇讲通过CTP API获取实时行情,录入csv,实时合成k线.github上开源了录入csv及合成k线代码,后台回复pyctp可获取.先上两张效果图: 图1 csv数据 ...

  5. 【量化】量化交易入门系列6:量化交易学习书籍推荐(二)

    作者:悠悠做神仙 来源: 恒生LIGHT云社区 上一篇 量化交易入门系列5:量化交易学习书籍推荐(一) 我们介绍一些量化交易一些操作和理论性书籍,可能对于刚入门的大家而言,可能有些枯燥.所以这篇文章, ...

  6. 【量化】量化交易入门系列2:经典的量化交易策略(上)

    作者:悠悠做神仙 来源: 恒生LIGHT云社区 上一篇文章 量化交易入门系列1:编程语言与数据源 ,介绍了关于量化交易的基本概念,以及要做量化交易的编程语言选择,和量化交易的一些数据源获取工具.那么, ...

  7. 【量化】量化交易入门系列5:量化交易学习书籍推荐(一)

    作者:悠悠做神仙 来源: 恒生LIGHT云社区 量化交易入门系列,给大家介绍了关于量化交易的数据源获取.编程语言推荐.经典的交易策略,那么本篇将介绍一些比较经典的量化交易书籍. 书籍是人类智慧的结晶, ...

  8. [转]OllyDBG 入门系列(二)-字串参考

    标 题: [原创]OllyDBG 入门系列(二)-字串参考 作 者: CCDebuger 时 间: 2006-02-14,13:34 链 接: http://bbs.pediy.com/showthr ...

  9. STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

    摘自:STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置 作者:自信且爱笑' 发布时间: 2021-05-01 12:08:32 网址:https://blog ...

最新文章

  1. 子分类账知识学习(汇总网上比较有用的资料)
  2. 怎么两边同时取ln_脏辫发型怎么编编发教程图解简单易学!
  3. linux socket无延迟发送数据
  4. XAML实例教程系列 – 对象和属性
  5. SQL语言之DQL语言学习(三)排序查询
  6. jscript换行等特殊字符
  7. 【Android QR Code】开源项目:ZXing(一)导入项目
  8. Temp文件夹缺少network service权限,webservice能访问,但是不能调用
  9. BCD与ASCII码互转-C语言实现
  10. html搜索框 模糊搜索,前端js模糊搜索(模糊查询)
  11. 利用分类模型学习特征权重
  12. [En]Web Forms Syntax Reference
  13. Windows10 设置网络共享文件驱动器
  14. 学习python自动化测试的好处
  15. 特殊字符图案大全c语言,特殊符号大全
  16. FIRST集 FOLLOW集和SELECT集
  17. 八字计算方法 php,php计算四柱(生辰八字)的方法
  18. 【论文笔记】ViLBERT:Pretraining Task-Agnostic VisiolinguisticRepresentations for Vision-and-Language Tasks
  19. 搭建属于自己的云同步盘
  20. 替换word中手动换行(软回车)为段落标记(硬回车)

热门文章

  1. [转]浅说软件需求分析
  2. 初见物理引擎库Cannon.js:使用dat.gui修改物体属性
  3. Android项目gen目下没有R.class文…
  4. Winmail 邮件服务器的「架设与使用」
  5. html边框闪烁代码,纯css实现动态边框的示例代码
  6. mybatisplus报 Invalid bound statement (not found):
  7. 餐饮店选址要考虑竞品分布,用户画像等
  8. 【养生】第一步-----筑基
  9. 全球与中国干式涡旋泵市场深度研究分析报告
  10. python公交查询系统