手把手教你如何給一個老舊策略無縫對接websocket行情接口


手把手教你如何給一個老舊策略無縫對接websocket行情接口

在發明者量化交易平台的[策略廣場](https://www.fmz.com/square)上有很多有趣的策略,當時數字貨幣交易所基本都是使用的rest協議的API接口,很多策略都是基於rest接口的,有時候行情更新比較慢。另外,近期也有出現有些交易所rest接口故障,導致策略無法使用的情況。如果對策略修改,增加對於websocket接口的支持就需要對策略代碼做一定的改動,通常會比較麻煩(改策略難度遠遠高於重新寫)。
如何能不改動策略,但是又使用websocket行情接口呢?
這里就充分體現出發明者量化交易平台強大的靈活性了,我們可以通過:

  • 1、使用策略「模板類庫」。
  • 2、對exchange.GetTicker等行情獲取的函數Hook操作。

從而實現,不改動策略一行代碼,讓策略由websocket行情接口推送的數據驅動運行起來。
代碼編寫語言使用JavaScript語言。

分析策略

例如我們要修改一個經典的老策略「破冰者」
 [策略地址](https://www.fmz.com/strategy/9929)

我們首先看一下策略代碼,發現該策略是由tick行情驅動的,主要使用了ticker數據中的Buy、Sell、Last這幾個屬性,ticker數據由FMZ平台的API函數:exchange.GetTicker獲取。這樣目標就明確了,我們把這個exchange.GetTicker函數Hook操作(即改寫為另一個版本替換掉)就可以了。
但是,我們不能在破冰者策略中改寫,那樣會影響策略,我們要的可是無縫對接!!
所以就需要接下來的主角登場了。

「模板類庫」功能和init函數的配合

我們創建一個「模板類庫」,命名:SeamlessConnWS,清空初始的代碼。

然后給SeamlessConnWS模板設置2個參數

  •  IsUsedWebSocket
  •  Hook_GetTicker@IsUsedWebSocket

用於控制是否開啟使用websocket接口功能,控制指定開啟具體的行情接口。本例中因為篇幅有限,只對exchange.GetTicker接口做hook操作。所以參數上就只有開啟GetTicker接口為websocket模式的控制參數:Hook_GetTicker。

模板創建好了,就可以在模板里面寫具體的訪問交易所websocket接口,訂閱某些行情,然后等待交易所推送數據的這些功能代碼了。具體代碼不再贅述,可以參看SeamlessConnWS代碼(已公開)、API文檔。需要看一下的是模板中的init函數以及全局變量_DictConnectCreater、_ConnMap:

代碼:

var _DictConnectCreater = {     "Huobi" : WSConnecter_Huobi,     "Binance" : WSConnecter_Binance, } var _ConnMap = {} function init () {     if (IsUsedWebSocket) {         var connectCreater = null         if (exchanges.length != 1) {             Log("切換為ws接口只針對 exchange 交易所對象(即第一個添加的交易所對象)")         }         var isFound = false          for (var name in _DictConnectCreater) {             if (exchange.GetName() == name) {                 connectCreater = _DictConnectCreater[name]                 isFound = true             }         }         if (!isFound) {             throw "沒有找到實現"         }                  if (Hook_GetTicker) {             var symbol = exchange.GetCurrency()             _ConnMap.GetTicker = connectCreater("GetTicker", symbol)             exchange.GetTicker = function () {                 return _C(_ConnMap.GetTicker.Read)             }         }         // ...               } } 


 
可以看到這個模板只實現了2個交易所的websocket行情接口,分別是幣安現貨、火幣現貨。init函數就是為了,讓「破冰者」策略引用SeamlessConnWS模板后,實盤運行時,首先會執行init函數,可以自動的把exchange.GetTicker函數內容替換為使用websocket接口的代碼實現,從而實現無縫對接上websocket行情。

[SeamlessConnWS 模板地址](https://www.fmz.com/strategy/167755)
 
如何使用起來

很簡單!把SeamlessConnWS模板復制到自己的策略庫中以后,只用給「破冰者」策略引用上就可以了,如圖:

勾選,保存,即可。

創建「破冰者」策略實盤機器人,交易所選擇幣安 
開啟SeamlessConnWS模板上的控制參數。

運行起來:

為了方便看到推送來的數據,我專門在157行,加上了一句打印日志的代碼,會輸出交易所推送來的數據。

機器人日志上的顯示:

這樣就沒有修改一行策略代碼,實現了使用websocket行情接口和策略無縫對接。

本例只是針對使用exchange.GetTicker行情接口函數的策略做出的講解,其它行情接口例如 exchange.GetDepth、exchange.GetTrades、exchange.GetRecords也是同樣的套路!對於范例模板SeamlessConnWS,可以進一步擴展。

對於模板中具體的鏈接websocket的實現,使用的Dial函數(參看API文檔Dial函數),可以根據需要調整。比如可以給read()函數指定參數-2,即只返回websocket連接接受數據的緩沖區中的最新數據。

感謝閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM