Type/to search
3
Follow
1507
Followers
Руководство по использованию веб-сокетов цифровой количественной платформы Inventor Digital Currency (подробное объяснение после обновления функции набора номера)
FAQ
Created 2019-04-01 11:06:09  Updated 2019-12-04 10:41:25
 5
 6273

В основном все криптовалютные биржи поддерживают отправку websocket, некоторые биржи поддерживают обновление информации об учетных записях websocket. По сравнению с rest API, websocket, как правило, имеет низкую задержку, высокую частоту, не ограничивается частотой платформы rest API и т. Д.
https://zhuanlan.zhihu.com/p/22693475

Эта статья будет посвящена в основном квантовой платформе FMZ Inventors, использующей язык JavaScript, использующей встроенную платформу Dial для подключения, с указаниями и параметрами в документации, поиском Dial, которая была несколько раз обновлена для реализации различных функций, и будет посвящена стратегии, основанной на WSS, а также подключению к многобиржевым вопросам.

1. websocket-соединение:

Как правило, это прямое подключение, например, для получения тикеров безопасности:

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

Для возвращенных данных, которые должны быть сжаты, нужно указать, что они должны быть сжаты в соединении, и, чтобы сжать, нужно указать, что они должны быть сжаты в соединении, и, чтобы отправить возвращенные данные, mode означает, что они должны быть сжаты, например, в соединении OKEX:

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

Функция Dial поддерживает повторное соединение, выполняется языком Go, обнаруживается разрыв соединения и повторное соединение, удобное для запрошенных данных, которые уже есть в url, как в случае с Binance. Рекомендуется использовать. Для тех, кто нуждается в отправке заказных сообщений, можно самостоятельно поддерживать механизм повторного соединения.

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

Некоторые биржи просят подписаться на новости в url, а также на каналы, которые сами должны подписаться, например, на Coinbase:

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

2. websocket читает:

Код, который обычно читается в мертвом цикле, выглядит следующим образом:

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 Data Push очень быстрый, в Go все данные сохраняются в очередях, и когда программа вызывает read, она возвращается в очередь. В то время как другие операции, такие как заказ, могут привести к задержке, что может привести к накоплению данных. Для передачи данных, учетных записей, глубины вставки и т. д. нам нужны исторические данные, для фактических данных мы в большинстве случаев заботимся только о последних, не заботясь о исторических данных.

read() возвращает самые старые данные без добавления параметров, а если нет данных, то блокируется до возвращения. Если вы хотите получить новейшие данные, вы можете использовать client.read(-2), чтобы немедленно вернуть новейшие данные, но если больше нет данных, то возвращает null, необходимо определить и снова ссылаться на них.

В зависимости от того, как обращаться со старыми данными, хранящимися в кэше, а также от того, блокируются ли они в отсутствие данных, read имеет различные параметры, которые, как показано ниже, кажутся сложными, но позволяют программе быть более гибкой.
img

3. Подключение нескольких биржевых websockets:

Для таких случаев в процедуре явно не может использоваться простое 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. Вопрос восстановления разъединения:

Эта часть обработки является более проблематичной, потому что передача данных может быть прервана или передача может быть очень задержена, даже если получать сердцебиение, это не означает, что данные все еще передаются. Можно установить интервал событий, пересоединиться, если интервал не будет обновлен, и лучше сравнить результаты с остальным возвратом через некоторое время, чтобы увидеть, является ли данные точными.

5. Общие программные рамки для использования websocket:

Поскольку уже используются push-данные, программа естественно должна быть написана в виде драйвера событий, обратите внимание, что push-данные часто используются, не требуя слишком много запросов, что приводит к блокировке, обычно можно написать:

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) } }

6. Резюме:

Способы подключения веб-сокетов, способы передачи данных, подписный контент и формат данных часто различаются между различными биржами, поэтому платформы не упаковываются и требуют самостоятельного подключения с помощью функции Dial. В этой статье рассматриваются некоторые основные меры предосторожности.

PS. Несмотря на то, что некоторые биржи не предоставляют веб-сокеты, при посещении веб-сайта, используя настройки, вы обнаружите, что они используют веб-сокетный проталкивание, и если вы изучите их, вы обнаружите, что они используют формат подписки и формат возвращения.

Related Recommendations
Comment
All comments (5)

    wss连接运行一段时间后,报“ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)”这个错误,请问大神要如何处理?已经设置了自动重连,需要再手动写一个重连么@小草

    4 years ago

    解析错误,把消息打印出来看看,做个容错就行

    4 years ago

    收到,谢谢

    4 years ago

    币安永续合约为什么 连接完,定阅账户信息变动,一分钟后 read 就返回空了

    6 years ago

    因为币安规定,只有账号信息有变动时才会推送信息。是这样吧?

    5 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)