FMZ发明者量化平台:使用JavaScript和Dial函数实现WebSocket连接与多交易所策略

qer1232025-01-25 11:09:5227

本文将主要介绍发明者发明者上的一款量化平台欧意交易所,使用语言,以及使用该平台封装的DIAL函数包进行连接。具体说明和参数在文档和搜索中。为了实现各种功能,DIAL功能已经进行了多次更新。这篇文章将涵盖这篇文章的内容。这就引入了基于WSS的事件驱动策略,以及连接多个交易所。

1、连接方式:

一般情况下直接连接即可。如果您收到硬币安全推送:

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

由于后台数据是压缩格式,需要指定连接。需要指定指定的压缩格式。 Mode代表发送需要压缩的返回数据。

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

DIAL功能支持重连,由底层GO语言完成。检测到的连接断开连续奉献已在 URL 中。比如的例子就很方便,推荐使用。对于需要发送消息的用户,可以自行维护重连机制。

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

订阅WSS消息,有些交易所的请求在URL中也有一些通道需要自己发送订阅,比如:

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2. 阅读:

一般在死循环中读取,代码如下:

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg) //把json字符串解析为可引用的object
// 处理data数据
    }
}

WSS数据推送速度很快。 Go底层会减慢队列中所有数据的速度。当程序调用read时,会依次返回。机器人指令的运行会带来延迟,可能会导致数据积累。对于交易推送、账户推送、深度插值推送,我们需要历史数据。对于市场数据,我们大多数情况只关心最新的,不关心历史数据。

read()如果不加参数,会返回最旧的数据,没有数据时会阻塞。如果你想要最新的数据,你可以使用。 READ(-2)立即返回最新数据,没有数据时返回NULL。你需要参考判断。

根据如何对待缓存的旧数据,以及无良时是否阻塞,读取有不同的参数。下面的具体图看起来比较复杂,但是却让程序变得更加灵活。

3. 连接多个交易所:

很明显,简单的Read()在这种情况下显然是不允许的,因为一个交换器会阻塞等待消息,而此时另一个交换器即使有新消息也不会被接受。一般治疗方法是:

function main() {
    var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    var coinbase = Dial("wss://ws-feed.pro.coinbase.com", 60)
    coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
    while (true) {
        var msgBinance = binance.read(-1) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
        var msgCoinbase = coinbase.read(-1)
        if(msgBinance){
            // 此时币安有数据返回
        }
        if(msgCoinbase){
            // 此时coinbase有数据返回
        }
        Sleep(1) // 可以休眠1ms
    }
}

4、解决线路重连接问题:

这部分处理比较麻烦,因为推送数据可能会中断,或者延迟极高。即使能收到,也不代表数据还在推送。可以设置事件间隔。最好对比一下REST返回的结果,看看数据是否准确。对于币安特殊情况,直接设置自动重连。

5、使用的通用程序框架:

因为已经使用了推送数据,所以程序也必须写成事件驱动程序。关注频繁推送的数据。

var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
    if(Date.now() - tradeTime > 2000){//这里即限制了2s内只交易一次
        tradeTime = Date.now()
        //交易逻辑
    }
}
function GetAccount(){
    if(Date.now() - accountTime > 5000){//这里即限制了5s内只获取账户一次
        accountTime = Date.now()
        return exchange.GetAccount()
    }
}
function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg)
        var account = GetAccount()
        trade(data)
    }
}

六、总结:

每个交易所的连接方式、数据发送方式、订阅内容往往不同okx,所以平台没有封装,Dial功能需要自己连接。这篇文章基本上涵盖了一些基本的注意事项。如果您有任何疑问,请提问。

诗。虽然有的交易所不提供报价,但其实登录网站使用调整功能,你就会发现你都用了。研究之后你会发现订阅格式和返回格式都会找到。有的好像是加密的,用解码就可以看到。

相关内容

本文链接:http://www.chuangkn.com/?id=1631

数字货币量化平台

阅读更多

网友评论