在发明者量化交易平台的[策略广场](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链接接受数据的缓冲区中的最新数据。
感谢阅读