其实这本是个很简单的错误,但经常看到有人问到,而且网上居然还出了玄学解答,所以干脆单独写一篇解释一下这个错误。
这一篇文章同样适用于解决为什么没有OnFrontConnected回调,Decrypt handshake data failed,8193等错误。如果是运行没有反应,请直接看2.原因排查。
1. 出处
目前在dll底层代码中,如果检测到与CTP前置网络断开时会有一段代码
printf("CThostFtdcUserApiImplBase::OnSessionDisconnected ...
输出这个错误,并且回调到API的spi函数OnFrontDisconnected。所以在写策略时,如果在spi中的OnFrontDisconnected函数里面打印nReason这个函数参数,遇到网络断开,就会输出这个4097。如下:
其实在API头文件中也早就写明了,在OnFrontDisconnected前面有:
///@param nReason 错误原因
/// 0x1001 网络读失败
/// 0x1002 网络写失败
/// 0x2001 接收心跳超时
/// 0x2002 发送心跳失败
/// 0x2003 收到错误报文
0x表示是16进制,0x1001转成十进制即是4097,0x2001转成十进制即是8193。
2. 原因排查
1)核对版本
目前CTP要求API版本和后台版本一致才能有正确的onfrontconnected回调。
版本不对会不停地回调OnFrontDisconnected,或者输出Decrypt handshake data failed,或者没有任何反应。
所以先检查API版本是否正确,可以调用函数GetApiVersion输出当前API版本,示例如下。
python:
print(f"CTP API version = {api.CThostFtdcTraderApi_GetApiVersion()}")
c++
cout<<"CTP API Version: "<<CThostFtdcTraderApi::GetApiVersion()<<endl;
V6.3.X的API可以访问6.3.X~6.6.X及其以上的CTP后台系统,但无法支持大商所长合约期权组合,无法支持IPv6;
V6.5.X、V6.6.X的API只能访问6.5.X及其以上的CTP后台系统,支持大商所长合约期权组合,支持IPv6;
注意:6.6.1API引入的新函数只有在接入6.6.1及以上后台的时候才会有响应,接入6.5.0时无响应。
目前期货公司正式生产基本是v6.5.1_20200908版本,以上三个系列版本都可以连上,注意要用名字带P的版本才能连上。
simnow同样是V6.5.X系列版本,所以以上三个系列版本都可以连上,注意要用名字带P的版本才能连上。
期货公司评测使用v6.3.13,v6.3.16或 v6.3.19_T1_20200423版本(这三个都可以)。
2)核对网络
确保版本无误的话那基本就是网络问题了。先检查交易前置网是否畅通,建议使用telnet,不要使用ping(因为服务端有可能会禁ping)。如下:
telnet 180.168.146.187 10100
如果telnet没有反应,要么是你自己后台的前置地址搞错(请去看QQ群里公告地址)了,要么说明CTP后台服务器没有启动(此时正常环境多数是因为没在交易时段,可以切到7*24小时环境测试)。
如果地址没有搞错,正常生产上,生产时间是不会出现这样的问题的,但simnow因为用户很多,有时会导致前置拥堵,就会出现这样的问题。另外simnow 7*24小时地址也不是很稳定,常出现这样的问题。
另外如果是非交易时段(交易时段参见文章《一个获取最新期货品种交易时间的小脚本》),那后台服务确实有可能没开。这时可以切到simnow模拟的7*24小时环境测试。
如果连接的simnow前置地址出现这样的问题,可以切换到其他两组模拟地址试一下,如果还不行,那只能去群里问下客服是否连接不上了,等待修复了,没有其他方案。
欢迎关注公众号,一起学习程序化交易!