在發明者量化交易平臺的[策略廣場](https://www.fmz.com/square)上有不少有趣的策略,當時數字貨幣交易所基本都是使用的rest協議的API接口,不少策略都是基於rest接口的,有時候行情更新比較慢。另外,近期也有出現有些交易所rest接口故障,致使策略沒法使用的狀況。若是對策略修改,增長對於websocket接口的支持就須要對策略代碼作必定的改動,一般會比較麻煩(改策略難度遠遠高於從新寫)。
如何能不改動策略,可是又使用websocket行情接口呢?
這裏就充分體現出發明者量化交易平臺強大的靈活性了,咱們能夠經過:javascript
從而實現,不改動策略一行代碼,讓策略由websocket行情接口推送的數據驅動運行起來。
代碼編寫語言使用JavaScript語言。java
例如咱們要修改一個經典的老策略「破冰者」
[策略地址](https://www.fmz.com/strategy/9929)web
咱們首先看一下策略代碼,發現該策略是由tick行情驅動的,主要使用了ticker數據中的Buy、Sell、Last這幾個屬性,ticker數據由FMZ平臺的API函數:exchange.GetTicker獲取。這樣目標就明確了,咱們把這個exchange.GetTicker函數Hook操做(即改寫爲另外一個版本替換掉)就能夠了。
可是,咱們不能在破冰者策略中改寫,那樣會影響策略,咱們要的但是無縫對接!!
因此就須要接下來的主角登場了。websocket
咱們建立一個「模板類庫」,命名:SeamlessConnWS,清空初始的代碼。app
而後給SeamlessConnWS模板設置2個參數less
用於控制是否開啓使用websocket接口功能,控制指定開啓具體的行情接口。本例中由於篇幅有限,只對exchange.GetTicker接口作hook操做。因此參數上就只有開啓GetTicker接口爲websocket模式的控制參數:Hook_GetTicker。socket
模板建立好了,就能夠在模板裏面寫具體的訪問交易所websocket接口,訂閱某些行情,而後等待交易所推送數據的這些功能代碼了。具體代碼再也不贅述,能夠參看SeamlessConnWS代碼(已公開)、API文檔。須要看一下的是模板中的init函數以及全局變量_DictConnectCreater、_ConnMap:函數
代碼:
spa
能夠看到這個模板只實現了2個交易所的websocket行情接口,分別是幣安現貨、火幣現貨。init函數就是爲了,讓「破冰者」策略引用SeamlessConnWS模板後,實盤運行時,首先會執行init函數,能夠自動的把exchange.GetTicker函數內容替換爲使用websocket接口的代碼實現,從而實現無縫對接上websocket行情。rest
很簡單!把SeamlessConnWS模板複製到本身的策略庫中之後,只用給「破冰者」策略引用上就能夠了,如圖:
勾選,保存,便可。
建立「破冰者」策略實盤機器人,交易所選擇幣安 。
開啓SeamlessConnWS模板上的控制參數。
運行起來:
爲了方便看到推送來的數據,我專門在157行,加上了一句打印日誌的代碼,會輸出交易所推送來的數據。
機器人日誌上的顯示:
這樣就沒有修改一行策略代碼,實現了使用websocket行情接口和策略無縫對接。
本例只是針對使用exchange.GetTicker行情接口函數的策略作出的講解,其它行情接口例如 exchange.GetDepth、exchange.GetTrades、exchange.GetRecords也是一樣的套路!對於範例模板SeamlessConnWS,能夠進一步擴展。
對於模板中具體的連接websocket的實現,使用的Dial函數(參看API文檔Dial函數),能夠根據須要調整。好比能夠給read()函數指定參數-2,即只返回websocket鏈接接受數據的緩衝區中的最新數據。
感謝閱讀