Hello CTP(六)——CTP API问题汇总

1、CTP API兼容

CTP柜台升级为穿透式版本后,只能使用6.3.15版本及后续版本API才能登陆上。为了强制客户使用最新穿透式API,如果客户使用API版本与CTP柜台不一致,将不会回调OnFrontConnected。目前一共有三类CTP API:旧生产版(6.3.11_20180109及以前);穿透式评测版(6.3.13_20181119);穿透式生产版(6.3.15_20190220)。

API实例调用Init后没有任何反应或者没有OnFrontConnected回调,先检查网络链路是否畅通,再检查API版本是否正确,连生产或者SimNow必须是6.3.15版本API,版本不正确将没有回调。

2、行情订阅问题

行情订阅成功但无行情数据推送。首先确保是否订阅成功。CTP无论订阅什么合约id,都会返回"CTP:No Error",但只有填对合约编码才有相应行情。因此,需要对合约代码进行检查,检查编码是否正确,国内五大期货交易所对合约命名格式并不统一,中金所采用大写+4个数字;检查订阅合约是否过期,过期合约将不会推送行情。

3、CTP行情tick数据

CTP提供的实时tick数据不是真正的tick数据。tick数据是指市场上的逐笔数据,例如一笔委托会产生一笔行情,一笔成交也会产生一笔行情。目前国内期货交易所不支持推送逐笔行情数据,只推送切片(快照)数据。切片数据是指将一定时间内的逐笔数据统一成一个快照发出,一般是1秒2笔。

4、TradingDay和ActionDay

在CTP中,TradingDay表示交易日,ActionDay表示当前实际日期。期货交易分为日夜盘,TradingDay和ActionDay在日盘是一致的,但在夜盘有区别,因为当天夜盘属于下一个交易日。

5、非交易时段收到行情

日盘盘前可能会收到行情,因为CTP日盘起动时会重演夜盘流水,所以有可能会将夜盘行情再推送一遍。日盘结束后也会收到行情,是交易所结算完成发出的行情,结算价字段是当日结算价,一般推送时间在3点~3点半。建议按照交易时间过滤掉非盘中行情,以免影响交易逻辑。

6、组合合约行情

CTP不会计算组合合约行情,只转发交易所行情,所以要看交易所推不推。如果直接以组合合约号订阅行情,郑商所和大商所都会推,但比实际情况下少不少,所以建议订阅各个单腿合约行情,计算价差自己得到组合行情。

7、当前切片成交量

Volume字段是累计成交量,是交易日内的累计成交量。如需要当前切片内的成交量,需要用当前切片的字段值减去上个切片相应值,差额即是当前切片内成交量。

9、UpdateMillisec

上期/能源/中金三个交易所会出现0和500两种值,大商所值是切片时真实毫秒时间,郑州该值都是0。

10、无效行情数据

行情数据中常看到有数值是1.7976931348623157e+308,是double类型的上限值,在CTP内部表示无效值。例如盘中本次结算价字段SettlementPrice即为无效值。

11、CTP网络连接问题

CTP API底层如果检测到客户端与CTP前置网络断开时会回调到API的SPI函数OnFrontDisconnected。SPI中OnFrontDisconnected函数nReason参数含义如下:

0x1001 网络读失败

0x1002 网络写失败

0x2001 接收心跳超时

0x2002 发送心跳失败

0x2003 收到错误报文

0x1001转成十进制即是4097,0x2001转成十进制即是8193。

CTP要求API版本和后台版本一致才有正确onfrontconnected回调。CTP API版本不兼容会不停地回调OnFrontDisconnected或输出Decrypt handshake data failed或没有任何反应。

所以先检查API版本是否正确,可以调用函数GetApiVersion输出当前API版本。

12、撤单

CTP不支持批量撤单。CTP API中ReqBatchOrderAction表示批量撤单请求,目前支持大商所支持,而且只有做市商客户才能用。

为了防止盘口愰骗,各期货交易所都将频繁撤单列入异常交易管理规范。目前上期所明确规定单个合约撤单数不能超过500笔,但CTP内并没有该项风控,建议策略自行加入风控。FAK和FOK撤单不计入合约撤单限制,所以如果策略可能会有大量撤单,建议使用FOK和FAK报单。

13、订单索引

CTP API实例每次连接服务器时,最大报单引用(MaxOrderRef)都是从1开始的, CTP中FrontID + SessionID + OrderRef可以唯一索引一笔订单,当FrontID + SessionID变更后MaxOrderRef将重置。