En la carga de los recursos... Cargando...

Una plantilla de estrategia le permite utilizar WebSocket Market sin problemas

El autor:FMZ~Lydia, Creado: 2024-10-30 14:23:04, Actualizado: 2024-11-05 17:44:35

img

Esta es una plantilla de mercado de WebSocket desarrollada oficialmente por FMZ.https://www.fmz.com/strategy/470349

¿Por qué necesitamos WebSocket?

En la actualidad, la estrategia FMZ se basa principalmente en la encapsulación tradicional de la API REST. Cada paso del acceso a la API requiere establecer una conexión de red y obtener datos de mercado a través de encuestas.

Sin embargo, el protocolo REST tiene un problema de retraso inherente. Cuando se requieren múltiples pares comerciales y estrategias de intercambio múltiples, el problema de retraso se magnificará. Aunque la función Go de la plataforma se puede ejecutar simultáneamente, el problema de retraso todavía existe, lo que dificulta satisfacer las necesidades de la estrategia de comercio de frecuencia relativamente alta. Además, si hay demasiados pares comerciales y la frecuencia de votación es demasiado rápida, se encontrará con el límite de frecuencia de acceso de la plataforma de comercio.

Actualmente, los servidores de los intercambios también están bajo una carga pesada. Todos ellos proporcionan un protocolo WebSocket completo y lo recomiendan a los usuarios de API. En comparación con el protocolo REST, WebSocket proporciona un método de conexión bidireccional persistente, que permite a los intercambios enviar datos al cliente en tiempo real, evitando solicitudes y respuestas frecuentes, lo que reduce enormemente la latencia. En términos generales, si el retraso en el acceso al API REST es de alrededor de 20 ms, el retraso en el envío de datos a través del WebSocket es de aproximadamente 2 ms. Además, el enlace al protocolo WebSocket no está limitado por la frecuencia de acceso a la plataforma, y es posible suscribirse a docenas de pares comerciales a la vez.

Introducción a la plantilla de ticker de WebSocket

La plataforma FMZ Quant Trading ha apoyado el protocolo WebSocket durante mucho tiempo, y es relativamente conveniente para llamar, pero para los usuarios novatos, todavía es demasiado complicado manejar múltiples suscripciones, suscribirse a múltiples tickers de intercambio e integrarlos de manera eficiente y conveniente en todo el proceso de estrategia. Esta plantilla pública de aceleración de datos de ticker en tiempo real de WebSocket resuelve este problema. Es muy fácil de usar y es totalmente compatible con la llamada de API encapsulada actual. Para la mayoría de las estrategias REST originales, simplemente puede modificarlas y usarlas directamente para acelerar su estrategia.

Características clave:

  • Apoyo para intercambios múltiples: Esta estrategia admite conexiones WebSocket de múltiples intercambios, como Binance, OKX, Bybit, Bitget, etc. Los usuarios pueden seguir el método de empaquetado de esta plantilla para admitir más intercambios por sí mismos.
  • Suscripciones personalizables: Permite la suscripción a canales de mercado específicos (como profundidad, operaciones, etc.) y el procesamiento eficiente de los datos recibidos para su uso inmediato en las estrategias comerciales.
  • Manejo avanzado de errores: Seguimiento de errores incorporado y mecanismo de reconexión de WebSocket para garantizar la confiabilidad y la continuidad del flujo de datos.

Una breve introducción al principio de aplicación

Tenga en cuenta que esta estrategia utiliza TypeScript. Si solo está familiarizado con JavaScript, puede parecer un poco extraño. TypeScript introduce un sistema de tipos y características de lenguaje más ricas basadas en JavaScript. Para aplicaciones como el comercio cuantitativo que necesitan manejar lógica compleja, el uso de TypeScript puede reducir errores potenciales y mejorar la legibilidad y la capacidad de mantenimiento del código. Por lo tanto, se recomienda aprenderlo brevemente.

Además, la estrategia utiliza el mecanismo asincrónico de la plataforma FMZ. El hilo hijo puede enviar mensajes al hilo principal a través de la función __threadPostMessage. Este método es asincrónico y es adecuado para notificar al hilo principal de las actualizaciones de datos generadas en el hilo hijo. El hilo principal y el hilo hijo pueden compartir datos a través de las funciones __threadGetData y __threadSetData. Este método permite a los hilos acceder y modificar los estados compartidos. Si desea aprender sobre multithreading, combinado con la documentación de la plataforma, esta estrategia también es un buen ejemplo de aprendizaje.

El principio principal de esta estrategia es conectarse a los principales intercambios de divisas digitales a través de WebSocket y recibir datos de mercado (como información de profundidad e información de transacciones) en tiempo real para proporcionar soporte de datos para decisiones comerciales cuantitativas.

1. Configuración de conexión WebSocketLa funciónsetupWebsocketSe utiliza para iniciar una conexión WebSocket y recibir datos de mercado.main_exchanges, indicando el intercambio para conectarse.

  • MyDial Función: Crear una conexión WebSocket, registrar el tiempo de conexión, y la salida de la hora de cierre al cerrar la conexión.
  • updateSymbols Función: Compruebe regularmente si hay nuevas solicitudes de suscripción y actualice la lista actual de pares de negociación según sea necesario.

Procesamiento de datosEl objetosupportsdefine los intercambios soportados y su función de procesamiento (comoBinanceLa función de procesamiento de cada intercambio es responsable de analizar el mensaje recibido y extraer los datos pertinentes.

  • processMsg Función: Procesar mensajes de los intercambios, identificar diferentes tipos de datos (como actualizaciones de profundidad, transacciones, etc.) y formatearlos en un objeto de evento unificado.

3. Datos de suscripciónEn cada conexión, el sistema se suscribirá a los canales de datos de mercado pertinentes basados en el par de operaciones actual.

  • getFunction FunciónObtener la función de procesamiento correspondiente de acuerdo con el nombre del intercambio.
  • this.wssPublic Función: Inicie la conexión WebSocket y comience a recibir datos.

4. Gestión del hiloInicie un hilo para cada intercambio, reciba datos en tiempo real y procese los datos a través de funciones de devolución de llamada.

  • threadMarket Función: Recibe datos en un hilo hijo, analiza y almacena la información de profundidad y transacción más reciente.

5. Reescribir el método de adquisición de datosReescribir los métodos para obtener información de profundidad y comercio para cada intercambio, dando prioridad a devolver datos que se actualizan en tiempo real.

Cómo usar la plantilla

  1. Iniciación: Uso$.setupWebsocket()para iniciar la conexión WebSocket del intercambio de destino.
  2. Suscripción: El sistema se suscribirá automáticamente a los canales relevantes (como profundidad, comercio, etc.) para los productos que usted comercia.
  3. Adquisición de datosPor medio de la llamadaGetDepth()yGetTrades()Las funciones, la profundidad del mercado y los registros de transacciones se devuelven automáticamente utilizando datos WebSocket en tiempo real.
  4. Manejo de errores: La estrategia incluye un mecanismo de seguimiento para registrar errores de conexión y de datos, e intenta volver a conectarse automáticamente si se pierde la conexión.

Si se agrega la función EventLoop() a la estrategia, se cambiará a un mecanismo de activación. Cuando hay una actualización de datos wss, se obtendrá automáticamente de inmediato, y esperar si no hay datos más recientes. Es equivalente a una función de sueño inteligente. Por supuesto, también puede usar Sleep directamente.

function main() {
    $.setupWebsocket()
    while (true) {
        exchanges.map(e=>{
            Log(e.GetName(), e.GetDepth())
            Log(e.GetName(), e.GetTrades())
        })
        EventLoop(100) // trigger by websocket
    }
}

Consulte mi anterior guía de estrategias de negociación de monedas múltiples:https://www.fmz.com/bbs-topic/10508, que se puede modificar fácilmente para soportar WebSocket:

function MakeOrder() {
    for (let i in Info.trade_symbols) {
        let symbol = Info.trade_symbols[i];
        let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
        let buy_amount = 50 / buy_price;
        if (Info.position[symbol].value < 2000){
            Trade(symbol, "buy", buy_price, buy_amount, symbol);
        }
    }
}

function OnTick() {
    try {
        UpdatePosition();
        MakeOrder();
        UpdateStatus();
    } catch (error) {
        Log("loop error: " + error);
    }
}

function main() {
    $.setupWebsocket()
    InitInfo();
    while (true) {
        let loop_start_time = Date.now();
        if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
            OnTick();
            Info.time.last_loop_time = Date.now();
            Info.time.loop_delay = Date.now() - loop_start_time;
        }
        Sleep(5);
    }
}

Más.