注:本人开发的期货网格化交易软件,源代码出售,包教包会包功能扩展。有意向留言,或联系qq:610151253

本篇开始介绍我的工程代码。

开发之前要按照上篇所讲获取API接口文档

API截图如下,我们所需的是dll和.h文件。

 接口文档,截图如下,需要我们从头到尾看一遍,当然因为我们只是作为个人投资者,里面很多内容可以大概浏览即可。

 一、开发工具

VS和Qt都可,我用的Qt,工程目录截图如下:

 至于SPI和API的作用和功能,开发文档已经讲的非常详细,我这里就不说了。

通过查看接口中的.h头文件:

ThostFtdcTraderApi.h

ThostFtdcMdApi.h

看出交易类:CThostFtdcTraderSpi、CThostFtdcTraderApi,和行情类CThostFtdcMdSpi、CThostFtdcMdApi都是虚函数,所以我们要做的就是对其继承,实现所需的接口。

这里可以直接查看官方提供的demo,按照其方法进行继承实现自己的类。

MiddleCTP是我自己实现的一个承上启下的单例类,比如我实际只需要通过CTP的API实现报单和撤单的功能,业务处理层面报单和撤单都调用这个类。

二、内存模型

1、原谅我没安装流程图工具!

 map1

这是一个map,把它想象成一个数据库表。用户每次提交报单,唯一索引+1,报单是个结构体,把他的每个元素想象成数据库表的字段。

里面用字段记录着开仓价格、平仓价格、止损价格和开平标志;

初次报单自然是开仓,成交后通过报单引用查询到此条记录,取出数据进行平仓报单;再次成交后再通过报单引用查询出来进行开仓报单,如此往复循环

map2

报单的时候生成,因为报单的时候需要生成报单引用,每个报单的报单引用是唯一的。

它的目的是把报单引用map1中的key键相关联。因为CTP返回的报单回报中只能通过报单引用来查到原始报单数据。

CTP系统返回后会把数据放到一个队列,上图代码工程中的QDealReportListThread是个线程,处理这个队列,通过报单引用从map1中找到报单数据,进行后续的开、平仓操作。

2、行情

在ctp中行情和报单是完全独立的两个模块。用户提交报单时,虽然是批量提交但都是同一合约,此时取出合约,到行情线程进行行情订阅。

行情订阅的目的是为了止损。

交易接口也提供行情查询,但交易接口的查询是限流的,上限为每秒查询一次。而订阅行情接口后500ms会返回一次深度行情,这样能尽早的拿到行情用来实时止损!

但会用行情的一个潜在问题就是cpu的利用率非常高,在我本机能达到80%多。

CTP行情和交易都是在独立的线程中。

我们在创建行情和交易实例时都进行了Init()函数的调用,其实这里面就创建了线程。因为行情模块每500ms就会给我们行情回报,所以占用cpu高也是有情可原的。

本篇就先说到这里,下篇开始分析我的代码!在下篇之前,希望您通过开发手册及demo可以实现ctp交易实例的创建,并能登录成功!

注:本人源代码出售,有意向请联系qq:610151263

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐