首先解讀一下CTP的接口說明,CTP的API使用建立在TCP協議之上FTD協議(《期貨交易數據交換協議》)與交易託管系統進行通訊,而交易託管系統負責投資者的交易業務處理。FTD 協議中規定了所有的通訊都基於某一種通訊模式。
交易涉及的通訊模式共有三種:
1.對話通訊模式,是指由會員端主動發起的通訊請求。該請求被交易所端接收和處理,並給予響應。例如報單、查詢等。這種通訊模式與普通的客戶/服務器模式相同。
2.私有通訊模式,是指交易所端主動,向某個特定的會員發出的信息。例如成交
回報等。
3.廣播通訊模式,是指交易所端主動,向市場中的所有會員都發出相同的信息。
例如公告、市場公共信息等。
CTP的交易API提供了兩個接口,分別爲CThostFtdcTraderApi 和CThostFtdcTraderSpi
我們自己開發的交易系統通過CThostFtdcTraderApi向CTP發送操作請求,通過CThostFtdcTraderSpi接收CTP的任何響應。
現在把主要的業務舉例在下表中
業務舉例 |
通訊模式 |
CThostFtdcTraderApi |
CThostFtdcTraderSpi |
登錄 |
對話模式 |
ReqUserLogin |
OnRspUserLogin |
報單錄入 |
ReqOrderInsert |
OnRspOrderInsert |
|
報單查詢 |
ReqQryOrder |
OnRspQryOrder |
|
成交查詢 |
ReqQryTrade |
OnRspQryTrade |
|
報單回報 |
私有模式 |
|
OnRtnOrder |
成交回報 |
|
OnRtnTrade |
行情涉及的通訊模式共有兩種:
1.對話通訊模式,同交易一樣,是指由會員端主動發起的通訊請求。該請求被交易所端接收和處理,並給予響應。例如登錄,退訂等。
2.廣播通訊模式,主要是行情訂閱,當訂閱行情後交易所端主動向會員連續主動發出行情信息。
業務舉例 |
通訊模式 |
CThostFtdcMdApi |
CThostFtdcMdSpi |
登錄 |
對話 |
ReqUserLogin |
OnRspUserLogin |
行情訂閱 |
廣播 模式 |
SubscribeMarketData |
OnRspQryDepthMarketData |
行情退訂 |
對話模式 |
UnSubMarketData
|
OnRspUnSubMarketData
|
可見,通過CTP提供的接口,我們可以向CTP發送業務申請,也不斷的按照三種通訊模式中的其中一種接收CTP的響應。因此我們寫的交易系統中至少就應該有兩個線程,一個稱其爲主業務線程,負責對CTP發出業務申請;另一個線程爲API工作線程,負責接收CTP通過廣播通訊模式,對話通訊模式,私有通訊模式其中一種模式對交易系統的響應。
綜上所述,我們的程序化交易系統需要完成的業務可以劃分爲:
1.基本操作,比如登錄,訂閱等;
2.行情操作,比如對行情數據的接收,存儲等
3.訂單操作,比如報單;對報單,成交狀況的查詢;報單,成交狀況的私有回報等。
4.數據監聽和處理操作,比如接收到新數據之後的統計處理,滿足統計條件後的報單處理(其實這裏就是我們的策略所在)
那麼,我建議將我們的程序化交易系統分爲四個線程,分別處理上述業務。程序的主線程就可以完成基本操作,完成登入,訂閱等初始化工作。
其它三個線程工作關係如下圖所示:
程序化交易系統是一個複雜的多線程網絡程序,在開發過程中要特別注意處理很多的線程互斥、數據處理造成的網絡丟包等一系列棘手問題。另外,對於CTP開發的資料,大家可以留言給我,我儘量提供,也歡迎大家多多討論。