Grundsätzlich unterstützen alle digitalen Währungsbörsen die Websocket-Zustellung, einige Börsen unterstützen die Aktualisierung von Websocket-Kontoinformationen. Im Vergleich zur Rest API hat Websocket im Allgemeinen eine geringe Verzögerung, eine hohe Frequenz und ist nicht von der Rest-API-Frequenzbeschränkung der Plattform abhängig. Der Nachteil ist, dass es Unterbrechungsprobleme gibt und nicht intuitiv verarbeitet wird. https://zhuanlan.zhihu.com/p/22693475
Dieser Artikel wird sich hauptsächlich mit der Quantifizierungsplattform der FMZ-Erfinder befassen, die die JavaScript-Sprache verwendet, die Dial-Funktion, die in der Plattform enthalten ist, um die Verbindung herzustellen, die Spezifikationen und Parameter sind in der Dokumentation, die Dial-Suche, die Dial-Funktion wurde mehrmals aktualisiert, um verschiedene Funktionen zu implementieren. Dieser Artikel wird dies abdecken und eine auf WSS basierende, ereignisgetriebene Strategie sowie die Frage der Verbindung mit mehreren Börsen behandeln.
Im Allgemeinen gibt es direkte Verbindungen, wie z. B. die Übertragung von Sicherheitsticker:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Für die Rückgabe von Daten ist das Komprimierungsformat erforderlich, das bei der Verbindung angegeben ist, und die Komprimierungsform wird durch die Komprimierung angegeben, wobei der Modus, der die Rückgabe von Daten sendet, die Komprimierung benötigt, 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 Wiedereinbindung, die von der unteren Go-Sprache durchgeführt wird. Die Erkennung von Verbindungsunterbrechungen führt zu einer Wiedereinbindung, die für die Anforderung von Dateninhalten, die bereits in der URL enthalten sind, wie beispielsweise bei Binance, sehr praktisch und empfehlenswert ist. Für diejenigen, die eine bestellte Nachricht senden müssen, können Sie die Wiedereinbindung selbst pflegen.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Wenn Sie sich für die Nachrichten von wss anmelden möchten, können einige Börsen ihre Anfragen in der URL angeben, aber auch einige Kanäle, die sich selbst anmelden müssen, wie z. B. Coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Der Code, der in der Regel in einer toten Schleife gelesen wird, lautet:
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 sind sehr schnell verschickt. Die Basis von Go speichert alle Daten in einer Queue, so dass die Programmierung Read aufruft und wieder zurückkommt. Roboter-Aufträge und ähnliche Vorgänge verursachen Verzögerungen und können zu einer Anhäufung von Daten führen. Für Transaktions-Push, Konto-Push, Tiefpunkt-Push und ähnliche Informationen benötigen wir historische Daten.
Wenn keine Parameter hinzugefügt werden, werden die ältesten Daten zurückgegeben. Wenn keine Daten vorhanden sind, wird die Rückgabe blockiert. Wenn die neuesten Daten gewünscht werden, können Sie die neuesten Daten sofort mit client.read(-2) zurückgeben, aber wenn keine Daten mehr vorhanden sind, wird null zurückgegeben.
Read hat verschiedene Parameter, je nachdem, wie man mit alten Daten in der Cache umgeht, und ob sie ohne Daten verstopft sind. Das sieht kompliziert aus, aber es macht das Programm flexibler.

In diesem Fall kann das Verfahren offensichtlich nicht mit einem einfachen Read () abgeschlossen werden, da eine Börse die Warte-Nachricht blockiert, während die andere Börse keine Nachricht empfängt, auch wenn es neue Nachrichten gibt. Die allgemeine Verarbeitung ist:
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 der Abwicklung ist problematisch, da die Push-Daten unterbrochen werden können, oder die Push-Verzögerung sehr hoch ist. Selbst wenn der Heartbeat empfangen werden kann, bedeutet dies nicht, dass die Daten noch weitergeleitet werden. Sie können einen Ereignisintervall einrichten, der erneut verbunden wird, wenn der Intervall nicht überschritten wird.
Da Push-Daten bereits verwendet werden, müssen Programme natürlich als Ereignis-Driver geschrieben werden. Beachten Sie, dass Push-Daten häufig geschickt werden, ohne dass zu viele Anfragen zu einer Sperrung 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 einzelnen Börsen verbunden sind, die Art und Weise, wie die Daten gesendet werden, der Inhalt, der abonniert werden kann, und das Datenformat sind oft unterschiedlich, so dass die Plattform nicht verpackt ist und eine eigene Verbindung mit der Dial-Funktion erforderlich ist. Dieser Artikel deckt grundsätzlich einige grundlegende Vorsichtsmaßnahmen ab.
PS. Einige Börsen bieten zwar keine Websocket-Version an, aber wenn man tatsächlich auf die Webseite geht, um die Formatierung zu nutzen, wird man feststellen, dass Websocket-Push verwendet wird. Wenn man die Abonnementsformate und die Rücksendeformate untersucht, wird man feststellen, dass einige von ihnen verschlüsselt aussehen und mit Base64 entschlüsselt und entschlüsselt werden können.