關於期貨交易CTP介面的五檔行情接收,和設定實現

張國平 發表於 2021-01-26

就像2020年總結提到,最近想在中高頻策略搞搞。對於高頻交易,如果有深度行情當然是必須的,看到說上期所五檔行情免費提供,而且我用其他行情軟體可以查到,就想在VNPY儲存到資料庫先研究下。有點發現,寫下來記錄下。


首先看了下程式碼,VNPY的ctp_gateway已經支援五檔行情接收,也不需要什麼配置,但是沒有發現五檔行情資料,無論是介面端還是資料庫。


然後研究下,因為 ctp_ gateway行情接收是採用繼承介面被呼叫的模式,是由CTP API工作執行緒驅動;沒法被直接debug,倒是可以直接插入print方法輸出。發現是有返回值,但是是1.79769313486232e+308這樣的溢位值,被一個VNPY專門寫靜態方法adjust_price給過濾掉了。順便說下,1.9.2版本也實現ctp五檔行情讀取,不過要改改 ctp_ gateway程式碼,把上期所加入。


我想是不是VNPY封裝的CTP介面太老呢,不支援呢,因為看Github歷史記錄是2年前更新的。就研究了下CTP-API,發現原來是由下面幾個點要注意,稍微說下。

首先按照CTP-API介面文件說的支援的通訊模式有三種:對話通訊模式,私有通訊模式,廣播通訊模式,

  • 對話通訊模式

對話通訊模式是指由會員端主動發起的通訊請求。該請求被交易所端接收和處理,並給予響應。例如報單、查詢等。這種通訊模式與普通的客戶/伺服器模式相同。CTP-API中的命名Req------或者ReqQry------這樣都是發起API

  • 私有通訊模式

私有通訊模式是指交易所端主動,向某個特定的會員發出的資訊。例如成交回報等,一般是On-----這樣名字,也是上面提到繼承介面被CTP呼叫。

  • 廣播通訊模式(公有流)

廣播通訊模式又稱公有流,是指交易所端主動,向市場中的所有會員都發出相同的資訊。例如公告、市場公共資訊等。


但是,在CTP-API文件裡面很明確的說明,五檔行情是使用組播模式,針對同一組的機器進行廣播。

二代組播行情(下文簡稱二代行情):交易所以組播方式提供的實時五檔行情。因為是組播,所以接收端必須在內部網路並且要加入組播組。


目前交易所不允許投資者直接連線交易所報盤網去接收組播行情,如果期貨公司將行情轉發出來給投資者使用,投資者便能享受到快速的組播行情。我和我期貨公司溝通,必須要把機器放在期貨公司委託機房才可以接收轉發組播的五檔行情。 這邊補充下,查了些文件,組播也可以在公網搞,但是因為UDP沒有確認,容易掉包,CTP-API提供增量方法來保證針對這個情況加以彌補,但是很少期貨公司提供公網組播,比較吃了不討好,如果那個提供我就去了,哈。


就算機器放在託管機房了,還有一個地方要設定,就是設定訂閱組播行情前置,CTP-API方法如下

static CThostFtdcMdApi *CreateFtdcMdApi(const char *pszFlowPath = "", const bool bIsUsingUdp=false, const bool bIsMulticast=false);

各型別行情欄位組合如下:

  bIsUsingUdp bIsMulticast
TCP行情前置 false false
UDP行情前置 true false
組播行情前置 true true

那麼說,五檔行情時候必須引數 bIsUsingUdp和 bIsMulticast都為True才可以。


我看了下VNPY 2.1.8的ctp-api,vnctpmd.h標頭檔案的介面是createFtdcMdApi(string pszFlowPath = ""),沒有提供 bIsUsingUdp和 bIsMulticast引數錄入。可能是vnpy封裝的 CTP-API的版本太老,因為6.3.15api中的好像最早版本的行情部分並不支援二代,必須自己拼接。


總結下,就是要拿到免費五檔行情,需要機器放在託管機房,另外ctp行情訂閱必須把 bIsUsingUdp和 bIsMulticast都為True,對於VNPY需要重新封裝以下 CTP-API,更新下ctp_gateway。

參考了這篇文章 https://zhuanlan.zhihu.com/p/103178845


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2753148/,如需轉載,請註明出處,否則將追究法律責任。