Inventeur de la plate-forme de quantification de la monnaie numérique websocket (détails après la mise à niveau de la fonction Dial)

Auteur:Le foin, Créé: 2019-04-01 11:06:09, Mis à jour: 2019-12-04 10:41:25

Pratiquement tous les échanges de crypto-monnaie prennent en charge les transactions d'envoi de websockets, et certains d'entre eux prennent en charge les mises à jour des informations de compte websocket. Comparativement à l'API rest, le websocket a généralement un faible délai, une fréquence élevée, n'est pas soumis à la limitation de la fréquence de l'API rest de la plate-forme.https://zhuanlan.zhihu.com/p/22693475

Cet article traite principalement de la plate-forme de quantification des inventeurs FMZ, de la connexion à l'aide du langage JavaScript, de la fonction Dial enveloppée dans la plate-forme, des spécifications et des paramètres dans la documentation, de la recherche Dial.

1.websocket连接:

Il est généralement possible de se connecter directement, par exemple pour obtenir un ticker de sécurité:

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

Pour les données renvoyées qui doivent être compressées, le format requis lors de la connexion est spécifié, le format requis lors de la compression est spécifié, le mode représentant l'envoi de données renvoyées qui doivent être compressées, comme pour la connexion OKEX:

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

La fonction Dial prend en charge la reconnexion, effectuée par le langage Go sous-jacent, la connexion détectée est déconnectée et reconnectée, ce qui est très pratique et recommandé pour le contenu des données demandées déjà dans l'url, comme l'exemple de Binance. Pour ceux qui ont besoin d'envoyer des messages, vous pouvez maintenir vous-même le mécanisme de reconnexion.

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

Il y a aussi des chaînes qui demandent de s'abonner elles-mêmes, comme Coinbase:

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

2.websocket读取:

En général, le code est lu en continu dans le cycle de la mort:

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

Les données wss sont très rapides, la couche inférieure de Go met toutes les données en attente dans la file d'attente et les renvoie à la suite de l'appel du programme read. Les opérations de téléchargement des robots entraînent des retards, ce qui peut entraîner une accumulation de données. Pour les informations telles que les transferts de transactions, les transferts de comptes, les transferts de profondeur, nous avons besoin de données historiques.

read ((() renvoie les données les plus anciennes si aucun paramètre n'est ajouté, et est bloqué pour les données manquantes. Si vous voulez des données plus récentes, vous pouvez utiliser le client.read (((-2) pour les données les plus récentes immédiatement, mais pour les données manquantes, il renvoie null.

En fonction de la façon dont l'on traite les anciennes données mises en cache, et de l'absence de blocage, les paramètres de lecture varient, comme le montre la figure ci-dessous, ce qui semble compliqué mais rend le programme plus flexible.img

3. Connectez plusieurs websockets d'échanges:

Dans ce cas, il est évident que la procédure ne peut pas utiliser un simple read (), car un échange peut bloquer les messages en attente, ce qui empêche l'autre échange de recevoir les 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) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
        var msgCoinbase = coinbase.read(-1)
        if(msgBinance){
            // 此时币安有数据返回
        }
        if(msgCoinbase){
            // 此时coinbase有数据返回
        }
        Sleep(1) // 可以休眠1ms
    }
}

4.断线重连问题:

Cette partie est plus gênante, car les données peuvent être interrompues, ou le délai de push est extrêmement élevé, même si la réception du heartbeat ne signifie pas que les données sont toujours en cours de push, un intervalle d'événement peut être défini, une reconnexion est effectuée si aucune mise à jour n'est reçue au-delà de cet intervalle, et il est préférable de comparer les résultats de retour avec rest pour voir si les données sont exactes.

5.使用websocket的一般程序框架:

Étant donné que les données de boost sont déjà utilisées, le programme doit naturellement être écrit comme un pilote d'événements, en prenant soin de booster les données fréquemment, sans trop de requêtes entraînant une fermeture.

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

6.总结:

La connectivité des websockets des différents échanges, la manière dont les données sont envoyées, le contenu à souscrire et le format des données sont souvent différents, de sorte que la plate-forme n'est pas enveloppée et nécessite une connexion automatique à l'aide de la fonction Dial. Cet article couvre essentiellement quelques précautions de base.

PS. Certains échanges, bien qu'ils n'offrent pas de marché de websocket, utilisent en fait une fonctionnalité de mise en mode pour accéder à leur site Web.


Relationnée

Plus de

- Je ne sais pas.Après un certain temps de fonctionnement de la connexion wss, json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) s'affiche.

Je vous en prie.Pourquoi le contrat de perpétuité de Binance est-il connecté, les informations du compte sont modifiées, et après une minute, le read revient à zéro?

- Je ne sais pas.Bien reçu, merci.

Le foinPour résoudre les erreurs, imprimer le message, faire une erreur, c'est tout.

Le dévouement est quantifiéComme Binance le prévoit, les messages ne sont renvoyés que si les informations sur les comptes changent.