Cómo romper el límite de recepción de ticks de futuros de materias primas

El autor:el rubí, Creado: 2018-08-27 15:58:30, Actualizado:

¿Qué es Tick? Por ejemplo, los datos de transacción se pueden imaginar como un río, y Tick es los datos de una sección del río.

¿Cómo obtiene Tick la mayoría de los programas domésticos (en este artículo, China)?

Entonces a menudo hay más de una transacción en 500 milisegundos, y la situación específica en ella es completamente una caja negra.

La mayoría de los marcos de negociación en el mercado utilizan un modo de devolución de llamada, lo que significa que hay como máximo un Tick en 500 milisegundos en la situación ideal. En la situación real de onBar/onTick, es bueno no perder el Tick. ¿Por qué? Porque usted tiene que lidiar con toda la lógica de código en la función onBar/onTick, lo que cuesta mucho tiempo.

img

Mecanismo más avanzado

La plataforma de negociación cuantitativa FMZ no adopta este mecanismo de devolución de llamada hacia atrás, sino que adopta el mecanismo de función principal que no interrumpe la lógica de la estrategia, lo que permite a los usuarios controlar el flujo de la estrategia de manera más natural.

No digas que el lenguaje de scripting es lento, a menos que lo uses para el entrenamiento de redes neuronales, incluso si lo fuese, se puede usar en cualquier ocasión después de agregar Jit hot compilation. La estrategia de nivel de entrada no está escrita aquí, y hablemos sobre la síntesis de futuros de alta frecuencia Tick. Por ejemplo, si nos conectamos a una compañía de futuros, solo podemos recibir el mercado de esta compañía de futuros. La velocidad y calidad de nuestra recepción están relacionadas con nuestra propia red, y también están relacionadas con la carga de la máquina front-end de la compañía de futuros.

Entonces, ¿cómo podemos obtener datos de ticks de futuros más precisos más rápido? Bajo el modelo de estrategia de FMZ Quant, puede operar fácilmente las cuentas de diferentes compañías de futuros y combinar sus precios para procesar órdenes a la velocidad más rápida. En circunstancias normales, podemos obtener dos ticks por segundo de la compañía de futuros, pero a través de la tecnología de combinación de mercado, tomando el MA801 como ejemplo, podemos obtener un tick con hasta seis veces por segundo y sin repetición.

img

Demo de código

Este código sólo se puede utilizar en el mercado real y no puede ser probado. Al agregar el intercambio, se pueden agregar muchas compañías de futuros para llevar a cabo el procesamiento simultáneo de la fusión del mercado.

img

El código es el siguiente:

img

Efecto demo

img

Como se muestra anteriormente, a las 21:24:44, los datos de la primera compañía de futuros son anteriores a la segunda. Agregar dos compañías de futuros puede mostrar el efecto, si agrega más de 5 compañías de futuros para fusionarse, entonces básicamente no tiene posibilidad de perder Tick; si está desarrollando una estrategia de negociación de alta frecuencia, ha resuelto un paso muy importante y decisivo, a saber, la velocidad y estabilidad de la recepción de Tick.

Obtenga el código completo:

function main() {
    log("Prepare to connect to the exchange and subscribe to the market")
    //step 1:All futures front-end machines are starting to subscribe to the variety
    _.each(exchanges, function(e){
        /*Waiting to connect to the exchange. The strategy is running without 
          interruption, and it is not the logic of the event callback. */
        while(!e.IO("status"))Sleep(1000);
        /*Use _C function to troubleshoot network errors. If subscribe to the market just 
        after connecting to exchanges, there may be a CTP unprepared error. */
        _C(e.SetContractType, "MA801")
        /*Switch the market receiving mode to the immediate return mode instead of the 
          event trigger mode. Refer to the API documentation on FMZ website. */
        e.IO("mode", 0)
    })
    Log("start fusing the data")
    //step 2: the important part begins
    var preVolume = 0
    while (true) {
        var ts = new Date().getTime()
        //Return if any exchanges occur tick event
        var ret = exchange.IO("wait_any")
        //Reset Volume at the right time
        if (ret.Nano/1000000 - ts > 60000) {
            preVolume = 0
        }
        //Target the exchange where the event occurred
        var e = exchanges[ret.Index]
        //Get ticker,  because of switching mode as return before, so here is the updated market, and GetTicker won't fail
        //Only the Tick with increasing volume is displayed. It no need to compare actual process, just process it.
        var ticker = e.GetTicker()
        if (ticker.Volume >= preVolume){
            Log(ret,ticker.Last, ticker.Volume)
            preVolume = ticker.Volume
        }
    }
}   



Más.