По сути, все цифровые валютные биржи поддерживают websocket для отправки сообщений, а некоторые поддерживают websocket для обновления учетной информации. По сравнению с rest API, websocket обычно имеет низкую задержку, высокую частоту, не имеет ограничений на частоту rest API платформы.https://zhuanlan.zhihu.com/p/22693475
Основное внимание будет уделено квантовой платформе FMZ Inventors, использованию языка JavaScript, подключению к диалоговой функции, встроенной с помощью платформы, описанию и параметрам в документации, поиску диалога. Для реализации различных функций функция Dial была несколько раз обновлена.
Обычно можно напрямую подключиться, например, для получения тикеров:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Для возвращаемых данных формат компрессии, необходимый при соединении, указан, compress указывает формат компрессии, mode представляет собой отправку возвращаемых данных, требующих сжатия, например, при соединении OKEX:
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, а также некоторые каналы, которые требуют отправки подписки, такие как 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) //把json字符串解析为可引用的object
// 处理data数据
}
}
wss передает данные очень быстро, нижний слой Go откладывает все данные в очередь, и когда программа вызывает read, она возвращается обратно; а действия робота, такие как загрузка запроса, приводят к задержке, что может привести к накоплению данных. Для передачи транзакций, рассылки счетов, рассылки глубины, мы нуждаемся в исторических данных, а для рыночных данных мы в большинстве случаев интересуемся только последними, не интересуемся историческими данными.
read ((() возвращает самые старые данные, если параметры не добавлены, и блокирует их, когда нет данных. Если вы хотите получить последние данные, вы можете использовать client.read (((-2) для немедленного возвращения последних данных, но если больше нет данных, он возвращает null, и вам нужно будет решить, как использовать эти данные.
В зависимости от того, как обращаться со старыми данными в кэше, а также от того, блокируются ли они при отсутствии данных, read имеет различные параметры, которые, как показано ниже, кажутся сложными, но делают программу более гибкой.
Для такого случая в процедуре, очевидно, нельзя использовать простой 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
}
}
Эта часть обработки является более проблематичной, поскольку перемещение данных может быть прервано, или задержка перемещения чрезвычайно высока, даже если получать сердцебиение не означает, что данные все еще перемещаются, можно установить интервал событий, если не будет получено обновления, перезагрузиться, и лучше провести некоторое время и сравнить результаты возвращения rest, чтобы увидеть, является ли данные точными. Для таких особых случаев, как Bitcoin, можно установить автоматическое перезагрузку.
Поскольку уже использовались данные push, программа, естественно, должна быть написана как event-driven, обратите внимание на частое 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)
}
}
Способы подключения веб-сокетов, способы передачи данных, подписного контента и формат данных различных бирж часто различаются, поэтому платформа не упакована, а требует самостоятельного подключения с помощью функции Dial.
PS. Некоторые биржи, хотя и не предлагают рынок websocket, но фактически используют функцию настройки сайта для входа на сайт.
xaifer48wss после некоторого времени работы соединения сообщает json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
ХаохаоПочему биткоин-контракт не действует После подключения, информация об учетной записи меняется, и через минуту read возвращается пустым?
xaifer48Получено, спасибо.
ТраваПроанализируйте ошибки, напечатайте сообщение и попробуйте сделать ошибку.
Стремиться к количествуПоскольку по правилам Биньян, сообщение будет отправлено только при изменении информации об аккаунте.