Guide d'utilisation du WebSocket de la plateforme quantitative de crypto-monnaie FMZ (explication détaillée de la fonction de numérotation améliorée)

Auteur:Je ne sais pas., Créé à partir de: 2023-07-13

img

Guide d'utilisation du WebSocket de la plateforme quantitative de crypto-monnaie FMZ (explication détaillée de la fonction de numérotation améliorée)

La plupart des échanges de crypto-monnaie prennent en charge l'envoi de données de marché via WebSocket, et certains échanges prennent également en charge la mise à jour des informations de compte via WebSocket.

Cet article présentera principalement l'utilisation de la fonction Dial, qui est encapsulée dans la plate-forme FMZ Quant en utilisant le langage JavaScript. Les instructions et paramètres spécifiques peuvent être trouvés dans la documentation en recherchant Dial. Afin d'obtenir diverses fonctionnalités, la fonction Dial a subi plusieurs mises à jour, qui seront couvertes dans cet article.

1. Connexion avec le Websocket:

Une connexion directe est généralement suffisante, par exemple pour obtenir une poussée de ticker de sécurité de pièce:

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

Lorsque les données renvoyées sont compressées, elles doivent être spécifiées lors de la connexion. compress est utilisé pour spécifier le format de compression, et mode représente la partie des données (envoi ou retour) qui doit être compressée.

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

La fonction Dial prend en charge la reconnexion, qui est gérée par le langage Go sous-jacent. Elle se reconnecte automatiquement lorsqu'une connexion est détectée pour être déconnectée. Pour les cas où les données de demande sont déjà incluses dans l'URL, comme l'exemple précédent avec Binance, elle est très pratique et recommandée à utiliser. Cependant, pour les cas où l'envoi de messages d'abonnement est nécessaire, il est recommandé de maintenir le mécanisme de reconnexion manuellement.

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

Abonnez-vous à des messages wss, certains échanges ont des demandes dans l'url, et il y a aussi des canaux que vous devez envoyer vos propres abonnements, comme coinbase:

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2. Lecture du Websocket

Généralement, il peut être lu en continu dans une boucle infinie.

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 
    }
}

La vitesse de publication des données wss est très rapide. La sous-couche de Golang cache toutes les données dans la file d'attente, et lorsque le programme appelle à lire, les données seront retournées à leur tour. Cependant, des opérations telles que la passation d'un ordre sur le bot entraîneront des retards, ce qui peut entraîner l'accumulation de données. Pour des informations telles que la publication de l'exécution des transactions, la publication du compte et l'interpolation de la profondeur, nous avons besoin des données d'historique. Pour les données de marché de devis, dans la plupart des cas, nous ne nous soucions que des dernières données, pas des données d'historique.

Si read() n'ajoute aucun paramètre, il renvoie les données les plus anciennes, et bloque jusqu'à ce qu'il renvoie quand il n'y a pas de données. Si vous voulez les dernières données, vous pouvez utiliser client.read(-2) pour renvoyer les dernières données immédiatement, mais quand il n'y a pas de données, il renvoie null, qui doit être jugé avant référence.

Selon la façon de traiter les anciennes données mises en cache et si elle est bloquée lorsqu'il n'y a pas de données, read a des paramètres différents, comme indiqué dans le tableau ci-dessous, ce qui semble compliqué, mais rend le programme plus flexible.

img

3. Connexion avec plusieurs plateformes par Websocket

Dans ce cas, il est évident que le simple fait d'utiliser read() ne fonctionne pas dans le programme, car une plate-forme bloquera les messages en attente, et une autre plate-forme ne recevra pas même s'il y a de nouveaux messages.

    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
        }
    }

4. Problèmes de déconnexion et de reconnexion

Cette partie du traitement est plus gênante, car les données de poussée peuvent être interrompues, ou le délai de poussée est extrêmement long. Même si le battement cardiaque peut être reçu, cela ne signifie pas que les données sont toujours poussées. Vous pouvez définir un intervalle d'événement; si aucune mise à jour n'est reçue après l'intervalle, reconnectez-vous; il est préférable de comparer les résultats retournés par rest après une période de temps, pour voir si les données sont exactes. Pour les cas spéciaux de Binance, vous pouvez directement définir la reconnexion automatique.

5. Utilisation du cadre de programme général de Websocket

Pour les données push ont été utilisés, le programme sera naturellement écrit comme événement déclenché; faire attention à la fréquence de données push, parce que les demandes à haute fréquence conduira à être bloqué; en général, vous pouvez écrire:

    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)
        }
    }

6. Conclusion

La méthode de connexion, la méthode de transmission de données, le contenu souscrit et le format de données du websocket sur chaque plate-forme sont souvent différents, de sorte que la plate-forme ne l'encapsule pas et doit utiliser la fonction Dial pour se connecter par elle-même.

PS: Bien que certaines plates-formes ne fournissent pas de citations de websocket, en fait, lorsque vous vous connectez au site Web pour utiliser la fonction de débogage, vous constaterez qu'elles utilisent toutes le websocket push.


Plus de