本文将主要介绍发明者发明者上的一款量化平台欧意交易所,使用语言,以及使用该平台封装的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功能需要自己连接。这篇文章基本上涵盖了一些基本的注意事项。如果您有任何疑问,请提问。
诗。虽然有的交易所不提供报价,但其实登录网站使用调整功能,你就会发现你都用了。研究之后你会发现订阅格式和返回格式都会找到。有的好像是加密的,用解码就可以看到。
相关内容
网友评论