3
Подписаться
1444
Подписчики

Руководство по использованию веб-сокетов цифровой количественной платформы Inventor Digital Currency (подробное объяснение после обновления функции набора номера)

Создано: 2019-04-01 11:06:09, Обновлено: 2019-12-04 10:41:25
comments   5
hits   5811

В основном все криптовалютные биржи поддерживают отправку 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 имеет различные параметры, которые, как показано ниже, кажутся сложными, но позволяют программе быть более гибкой. Руководство по использованию веб-сокетов цифровой количественной платформы Inventor Digital Currency (подробное объяснение после обновления функции набора номера)

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. Несмотря на то, что некоторые биржи не предоставляют веб-сокеты, при посещении веб-сайта, используя настройки, вы обнаружите, что они используют веб-сокетный проталкивание, и если вы изучите их, вы обнаружите, что они используют формат подписки и формат возвращения.