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
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.
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"]}')
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,
Dans ce cas, il est évident que le simple fait d'utiliser
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
}
}
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
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)
}
}
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.