Большинство криптовалютных бирж поддерживают отправку рыночных данных через WebSocket, а некоторые биржи также поддерживают обновление информации об аккаунте через WebSocket. По сравнению с REST API, WebSocket обычно имеет более низкую задержку, более высокую частоту и не подчиняется ограничениям скорости API платформы.
В этой статье в основном будет представлено использование функции Dial, которая инкапсулирована в платформе FMZ Quant с использованием языка JavaScript. Конкретные инструкции и параметры можно найти в документации путем поиска
Обычно достаточно прямого подключения, например, чтобы получить тикер безопасности монеты:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Когда возвращенные данные в сжатом формате, они должны быть указаны во время подключения.
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")
Подпишитесь на wss сообщения, некоторые биржи имеют запросы в URL, и есть также каналы, которые вы должны отправить свои собственные подписки, такие как coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Как правило, его можно читать непрерывно в бесконечной петле.
function main() {
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
while (true) {
var msg = client.read()
var data = JSON.parse(msg) // Parse json strings into quotable objects
// Process data
}
}
Скорость продвижения данных wss очень быстрая. Подслой Golang будет кэшировать все данные в очереди, и когда вызовы программы будут прочитаны, данные будут возвращены в свою очередь. Однако такие операции, как размещение заказа на боте, вызовут задержки, что может привести к накоплению данных. Для информации, такой как продвижение исполнения торговли, продвижение счета и продвижение глубины интерполяции, нам нужны данные истории. Для данных рынка котировок в большинстве случаев мы заботимся только о последних данных, а не о данных истории.
Если read() не добавляет параметров, он вернет старейшие данные и блокирует до возвращения, когда нет данных. Если вы хотите получить последние данные, вы можете использовать client.read(-2) для немедленного возвращения последних данных, но когда нет данных, он вернет null, который необходимо оценить перед ссылкой.
В зависимости от того, как обращаться со старыми кэшированными данными и блокируется ли она, когда нет данных,
В этом случае очевидно, что просто использование
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) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// at this time, Binance has data to return
}
if(msgCoinbase){
// at this time, coinbase has data to return
}
Sleep(1) // Sleep for 1 millisecond
}
}
Эта часть обработки является более проблематичной, поскольку данные могут быть прерваны или задержка продлится чрезвычайно долго. Даже если можно получить сердцебиение, это не означает, что данные все еще подталкиваются. Вы можете установить интервал событий; если после интервала не будет получено обновления, перезагрузите; лучше сравнить результаты, возвращенные
Для push-данных, которые были использованы, программа естественно будет записываться как вызванная событием; обратите внимание на частоту push-данных, потому что высокочастотные запросы приведут к блокировке; как правило, вы можете написать:
var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds
tradeTime = Date.now()
// Trading logic
}
}
function GetAccount(){
if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds
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)
}
}
Способ подключения, способ передачи данных, подписанный контент и формат данных веб-сокета на каждой платформе часто различаются, поэтому платформа не инкапсулирует его и должна использовать функцию Dial для подключения самостоятельно.
PS: Несмотря на то, что некоторые платформы не предоставляют цитаты websocket, на самом деле, когда вы входите на сайт, чтобы использовать функцию отладки, вы обнаружите, что все они используют push websocket.