FMZ Plataforma cuantitativa de criptomonedas Guía de uso de WebSocket (explicación detallada de la función de marcado mejorada)

El autor:- ¿ Por qué?, Creado: 2023-07-13 14:03:32, Actualizado: 2024-01-03 21:05:36

img

FMZ Plataforma cuantitativa de criptomonedas Guía de uso de WebSocket (explicación detallada de la función de marcado mejorada)

La mayoría de los intercambios de criptomonedas admiten el envío de datos de mercado a través de WebSocket, y algunos intercambios también admiten la actualización de la información de la cuenta a través de WebSocket.

Este artículo presentará principalmente el uso de la función Dial, que se encapsula en la plataforma FMZ Quant utilizando el lenguaje JavaScript. Las instrucciones y parámetros específicos se pueden encontrar en la documentación buscando Dial. Para lograr varias funcionalidades, la función Dial ha sufrido varias actualizaciones, que se cubrirán en este artículo. Además, también se discutirá la estrategia basada en eventos basada en WebSocket Secure (wss) y el tema de la conexión a múltiples intercambios.

1. Conexión con el Websocket:

Una conexión directa suele ser suficiente, como obtener un ticker de seguridad de monedas:

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

Cuando los datos devueltos están en formato comprimido, debe especificarse durante la conexión. compress se utiliza para especificar el formato de compresión, y mode representa qué parte de los datos (envío o devolución) debe comprimirse. Por ejemplo, al conectarse a OKEX, se puede usar lo siguiente:

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

La función Dial admite la reconexión, que es manejada por el lenguaje Go subyacente. Se reconecta automáticamente cuando se detecta que una conexión está desconectada. Para los casos en que los datos de la solicitud ya están incluidos en la URL, como el ejemplo anterior con Binance, es muy conveniente y se recomienda usar. Sin embargo, para los casos en que se requiere enviar mensajes de suscripción, se recomienda mantener el mecanismo de reconexión manualmente.

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

Suscríbete a los mensajes de wss, algunos intercambios tienen solicitudes en la url, y también hay canales a los que necesitas enviar tus propias suscripciones, como coinbase:

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

2. Leer el soporte web

En general, se puede leer continuamente en un bucle infinito.

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 velocidad de empuje de datos wss es muy rápida. La capa inferior de Golang almacenará en caché todos los datos en la cola, y cuando el programa lea las llamadas, los datos serán devueltos a su vez. Sin embargo, operaciones como la colocación de un pedido en el bot causarán demoras, lo que puede resultar en la acumulación de datos. Para información como el empuje de ejecución de operaciones, el empuje de cuenta e interpolación de profundidad, necesitamos los datos del historial. Para los datos del mercado de cotizaciones, en la mayoría de los casos, solo nos preocupamos por los datos más recientes, no por los datos del historial.

Si read() no agrega parámetros, devolverá los datos más antiguos y bloqueará hasta que no haya datos. Si desea los datos más recientes, puede usar client.read(-2) para devolver los datos más recientes inmediatamente, pero cuando no hay datos, devolverá null, que debe ser juzgado antes de la referencia.

Dependiendo de cómo manejar los datos almacenados en caché y si se bloquean cuando no hay datos, read tiene diferentes parámetros, como se muestra en la tabla a continuación, lo que parece complicado, pero hace que el programa sea más flexible.

img

3. Conexión con múltiples plataformas por Websocket

En este caso, es obvio que simplemente usar read() no funciona en el programa, porque una plataforma bloqueará los mensajes en espera, y otra plataforma no recibirá incluso si hay nuevos mensajes.

    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. Problemas de desconexión y reconexión

Esta parte del procesamiento es más problemática, ya que los datos de empuje pueden ser interrumpidos, o el retraso de empuje es extremadamente largo. Incluso si se puede recibir el latido del corazón, no significa que los datos todavía estén siendo empujados. Puede establecer un intervalo de eventos; si no se recibe ninguna actualización después del intervalo, vuelva a conectar; es mejor comparar los resultados devueltos por rest después de un período de tiempo, para ver si los datos son exactos. Para los casos especiales de Binance, puede establecer directamente la reconexión automática.

5. Utilizando el marco de programa general de Websocket

Para los datos de empuje se ha utilizado, el programa se escribirá naturalmente como evento desencadenado; prestar atención a la frecuencia de datos de empuje, porque las solicitudes de alta frecuencia conducirá a ser bloqueado; en general se puede escribir:

    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. Conclusión

El método de conexión, el método de transmisión de datos, el contenido suscrito y el formato de datos del websocket en cada plataforma a menudo son diferentes, por lo que la plataforma no lo encapsula y necesita usar la función Dial para conectarse por sí misma.

PS: Aunque algunas plataformas no proporcionan citas de websocket, de hecho, cuando inicia sesión en el sitio web para usar la función de depuración, encontrará que todos están usando el empuje de websocket.


Más.