在发明者量化交易平台的策略广场上有很多有趣的策略,当时数字货币交易所基本都是使用的rest
协议的API接口,很多策略都是基于rest
接口的,有时候行情更新比较慢。另外,近期也有出现有些交易所rest
接口故障,导致策略无法使用的情况。如果对策略修改,增加对于websocket
接口的支持就需要对策略代码做一定的改动,通常会比较麻烦(改策略难度远远高于重新写)。
如何能不改动策略,但是又使用websocket
行情接口呢?
这里就充分体现出发明者量化交易平台强大的灵活性了,我们可以通过:
exchange.GetTicker
等行情获取的函数Hook操作。从而实现,不改动策略一行代码,让策略由websocket
行情接口推送的数据驱动运行起来。
代码编写语言使用JavaScript
语言。
例如我们要修改一个经典的老策略「破冰者」
我们首先看一下策略代码,发现该策略是由tick行情驱动的,主要使用了ticker
数据中的Buy
、Sell
、Last
这几个属性,ticker
数据由FMZ平台的API函数:exchange.GetTicker
获取。这样目标就明确了,我们把这个exchange.GetTicker
函数Hook
操作(即改写为另一个版本替换掉)就可以了。
但是,我们不能在破冰者策略中改写,那样会影响策略,我们要的可是无缝对接!!
所以就需要接下来的主角登场了。
init
函数的配合我们创建一个「模板类库」,命名:SeamlessConnWS,清空初始的代码。
然后给SeamlessConnWS模板设置2个参数
用于控制是否开启使用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模板复制到自己的策略库中以后,只用给「破冰者」策略引用上就可以了,如图:
勾选,保存,即可。
创建「破冰者」策略实盘机器人,交易所选择币安 。 开启SeamlessConnWS模板上的控制参数。
运行起来:
为了方便看到推送来的数据,我专门在157行,加上了一句打印日志的代码,会输出交易所推送来的数据。
机器人日志上的显示:
这样就没有修改一行策略代码,实现了使用websocket行情接口和策略无缝对接。
本例只是针对使用exchange.GetTicker
行情接口函数的策略做出的讲解,其它行情接口例如 exchange.GetDepth
、exchange.GetTrades
、exchange.GetRecords
也是同样的套路!对于范例模板SeamlessConnWS,可以进一步扩展。
对于模板中具体的链接websocket
的实现,使用的Dial
函数(参看API文档Dial函数),可以根据需要调整。比如可以给read()
函数指定参数-2
,即只返回websocket
连接接受数据的缓冲区中的最新数据。
感谢阅读
congcong009 梦哥,能多一点python版本的么?
诺女也 好东西,应该早点分享嘛。。。
发明者量化-小小梦 好的 感谢建议。