Grundsätzlich unterstützen alle digitalen Währungsbörsen die Websocket-Sendbarkeit, einige unterstützen Websocket-Aktualisierungsinformationen. Im Vergleich zu Rest-API verfügt Websocket im Allgemeinen über eine geringe Verzögerung, eine hohe Frequenz, keine Plattformrest-API-Frequenzbeschränkung, aber mit Unterbrechungsproblemen und nicht intuitiver Abwicklung.https://zhuanlan.zhihu.com/p/22693475
Dieser Artikel behandelt vor allem die Quantitative Plattform der FMZ-Erfinder, die Verwendung der JavaScript-Sprache, die Verbindung mit der Dial-Funktion, die mit der Plattform verpackt ist, Einzelheiten und Parameter in den Dokumentationen, die Suche nach Dial. Die Dial-Funktion wurde mehrmals aktualisiert, um verschiedene Funktionen zu realisieren.
Die Anschlüsse sind in der Regel direkt verfügbar, so dass Sie die Sicherheitsticker erhalten:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Für die zurückgegebenen Daten ist das komprimierte Format, das bei der Verbindung angegeben werden muss, und die komprimierte Formate wird durch den Modus repräsentiert, der die zurückgesandten Daten repräsentiert, die komprimiert werden müssen, wie bei der Verbindung OKEX:
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
Die Dial-Funktion unterstützt die Wiederverknüpfung, die von der unteren Go-Sprache durchgeführt wird, und die Verbindung, die detektiert wird, wird wiederverknüpft. Für den Inhalt der angeforderten Daten, die bereits in der URL sind, wie zum Beispiel bei Binance, ist dies sehr praktisch.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Einige Anfragen von Börsen sind in den URLs, und es gibt auch einige Kanäle, die selbst ein Abonnement senden müssen, wie Coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Der Code lautet folgendermaßen:
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-Daten werden sehr schnell geschickt. Die Unterseite von Go lässt alle Daten in der Warteschlange warten, bis ein Programm den Read aufruft und dann wieder zurückkehrt. Die Handlungen des Roboters verursachen eine Verzögerung und können zu einer Datenaufstockung führen. Für Transaktionspush, Kontopush, Tiefenwertpush usw. benötigen wir historische Daten.
read ((() gibt die ältesten Daten zurück, wenn keine Parameter hinzugefügt werden, und blockiert die Rückkehr, wenn keine Daten vorhanden sind. Wenn Sie die neuesten Daten möchten, können Sie mit client.read (((-2) sofort die neuesten Daten zurückgeben, aber wenn keine Daten mehr vorhanden sind, gibt es Null zurück.
Je nachdem, wie man mit den alten Daten umgeht, die im Cache gespeichert sind, und ob sie bei fehlender Datenfläche verstopft sind, gibt es verschiedene Parameter für das Lesen, wie in der folgenden Abbildung dargestellt, was kompliziert aussieht, aber das Programm flexibler macht.
Für diese Situation kann man offensichtlich nicht einfach "read" verwenden, da eine Börse die Warte-Nachricht blockiert, und die andere keine Nachricht empfängt, selbst wenn sie eine neue Nachricht hat.
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
}
}
Dieser Teil ist problematisch, da die Push-Daten unterbrochen werden können, oder die Push-Verzögerung extrem hoch ist. Auch wenn der Empfang von Heartbeat nicht bedeutet, dass die Daten weitergeschickt werden, kann ein Ereignisintervall festgelegt werden, wenn keine Aktualisierungen empfangen werden.
Da die Push-Daten bereits verwendet wurden, kann ein Programm natürlich auch als Event-Driver geschrieben werden. Achten Sie darauf, dass die Push-Daten häufig ausgeführt werden, um nicht zu viele Anfragen zu verursachen, die zum Verschluss führen.
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)
}
}
Die Art und Weise, wie die Websockets der verschiedenen Börsen verbunden sind, wie Daten gesendet werden, was abonniert werden kann, und das Datenformat sind oft unterschiedlich, so dass die Plattform nicht verpackt ist und eine automatische Verbindung mit der Dial-Funktion erforderlich ist. Dieser Artikel umfasst im Wesentlichen einige grundlegende Vorsichtsmaßnahmen.
PS. Einige Börsen bieten zwar keine Websocket-Markt, aber tatsächlich die Ankunft auf der Website mit der Funktion der Schalldaten, und finden, dass die Websocket-Push verwendet wird. Eine Untersuchung zeigt, dass das Abonnement-Format und das Rückkehrformat gefunden werden.
xaifer48wss-Verbindung läuft eine Weile, meldet json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- Was ist los?Binance-Permanente-Kontrakte, warum wird nach dem Anschluss die Kontoinformationen geändert, und nach einer Minute kehrt die Read-Nummer zurück.
xaifer48Empfangen, vielen Dank.
Das GrasFehler lösen, Nachrichten ausdrucken, Fehler machen und so weiter.
Aufmerksamkeit und QuantitätBinance schreibt, dass die Nachrichten nur geschoben werden, wenn sich die Kontoinformationen ändern.