其實這本是個很簡單的錯誤,但經常看到有人問到,而且網上居然還出了玄學解答,所以乾脆單獨寫一篇解釋一下這個錯誤。
這一篇文章同樣適用於解決爲什麼沒有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版本。
目前期貨公司正式生產和simnow上均是v6.3.15_20190220版本,期貨公司評測使用v6.3.13或者v6.3.16版本(小版本號不影響評測)。
2)覈對網絡
確保版本無誤的話那基本就是網絡問題了。先檢查交易前置網是否暢通,建議使用telnet,不要使用ping(因爲服務端有可能會禁ping)。如下:
telnet 180.168.146.187 10100
如果telnet沒有反應,要麼是你自己後臺的前置地址搞錯(請去看QQ羣裏公告地址)了,要麼說明CTP後臺服務器沒有啓動(此時正常環境多數是因爲沒在交易時段,可以切到7*24小時環境測試)。
如果地址沒有搞錯,正常生產上,生產時間是不會出現這樣的問題的,但simnow因爲用戶很多,有時會導致前置擁堵,就會出現這樣的問題。另外simnow 7*24小時地址也不是很穩定,常出現這樣的問題。
另外如果是非交易時段(交易時段參見文章《一個獲取最新期貨品種交易時間的小腳本》),那後臺服務確實有可能沒開。這時可以切到simnow模擬的7*24小時環境測試。
如果連接的simnow前置地址出現這樣的問題,可以切換到其他兩組模擬地址試一下,如果還不行,那隻能去羣裏問下客服是否連接不上了,等待修復了,沒有其他方案。
歡迎關注公衆號,一起學習程序化交易!