Esta es una plantilla de mercado de WebSocket desarrollada oficialmente por FMZ.https://www.fmz.com/strategy/470349
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.
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:
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ónsetupWebsocket
Se 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 objetosupports
define los intercambios soportados y su función de procesamiento (comoBinance
La 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.
$.setupWebsocket()
para iniciar la conexión WebSocket del intercambio de destino.GetDepth()
yGetTrades()
Las funciones, la profundidad del mercado y los registros de transacciones se devuelven automáticamente utilizando datos WebSocket en tiempo real.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);
}
}