Configuración de intercambio de la estrategia de negociación cuantitativa de criptomonedas

El autor:La bondad, Creado: 2019-09-16 14:55:26, Actualizado: 2023-11-07 20:50:11

img

Cuando un principiante diseña una estrategia de comercio cuantitativa de criptomonedas, a menudo hay varios requisitos de funciones. Independientemente de los lenguajes de programación y plataformas, todos ellos encontrarán varios requisitos de diseño. Por ejemplo, a veces se requieren múltiples variedades de rotación de operaciones, a veces se requiere cobertura multi-plataforma, y a veces se requiere que diferentes variedades de operaciones sean concurrentes.

La plataforma de aprendizaje sigue utilizando la plataforma de negociación FMZ Quant (https://www.fmz.com), y el mercado se selecciona como el mercado de criptomonedas.

Diseño de estrategias de criptomonedas múltiples

La mayoría de estas situaciones de demanda están preparadas para las estrategias de tendencia y cuadrícula de criptomonedas múltiples, que deben ejecutarse en el mercado con diferentes métodos de iteración comercial.

Por lo general diseñado así:

function Process (symbol) {
     exchange.IO("currency", symbol)
     var ticker = _C(exchange.GetTicker)
     Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
     // ...
     // ..
     // .
}

function main(){
     var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
     while (true) {
         for (var i = 0 ; i < symbols.length; i++) {
             Process(symbols[i])
             Sleep(500)
         }
     }
}

Configuraremos el robot:

img

img

Se puede ver que esto se da cuenta de que un objeto de intercambio se configura en el robot, y el par de operaciones se cambia; el mercado de diferentes pares de operaciones se obtiene, y el mercado de variedad multi-negociación se ejecuta; y se ejecuta bajo una lógica de estrategia.

Se puede ver que los tres pares de negociación que definimos: BTC_USDT, LTC_USDT, ETH_USDT, en el bucle, obtienen iterativamente la cotización del mercado, y después de obtener la información, puede detectar específicamente el mercado y activar la lógica de negociación diseñada por la estrategia.

Algunos lectores pueden preguntar: No me gusta cambiar de par de operaciones, me parece un poco problemático, y la lógica de la estrategia no es clara.

De hecho, hay otras opciones de diseño, que presentaremos a continuación.

Configuración de múltiples objetos de intercambio para el robot en la misma cuenta de intercambio

Los datos de mercado de diferentes pares de operaciones se obtienen a través de múltiples objetos de intercambio y se ejecutan en la lógica de estrategia iterativa.

Por ejemplo, configure el robot configurando tres objetos de intercambio para el robot. Los pares de negociación están configurados para BTC_USDT, LTC_USDT y ETH_USDT respectivamente.

img

El nombre es el objeto de intercambio OKEX Spot V3 Test, en la página del panel, la página de configuración de intercambio:

img

Ya está hecho.

Hemos cambiado un poco de este código, porque esta vez añadimos múltiples objetos de intercambio al robot, que son los objetos de intercambio del par de operaciones BTC_USDT, LTC_USDT, ETH_USDT.

function Process (e) {
    var ticker = _C(e.GetTicker)
    Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
    // ...
    // ..
    // .
}  

function main(){
    while (true) {
        for (var i = 0 ; i < exchanges.length; i++) {
            Process(exchanges[i])
            Sleep(500)
        }
    }
}

Enciende el robot:

img

El ejemplo que hemos descrito anteriormente, ya sea el cambio de pares de operaciones o la adición de un objeto de negociación para múltiples pares de operaciones diferentes de una cuenta de configuración.

Entonces, ¿cómo se utilizan varias cuentas de intercambio en una estrategia?

Estrategia para el uso de cuentas de cambio múltiples

Algunas estrategias, como la cobertura de mercado entre múltiples bolsas, estrategias de múltiples cuentas dentro de una sola bolsa.

  • Configuración de intercambios múltiples con intercambios diferentes

img

Por ejemplo, hemos configurado 2 intercambios en el panel -> Exchange -> Añadir Exchange página.

Podemos acceder a la información de activos de las cuentas configuradas por estos dos intercambios en la estrategia.

img

function main(){
     Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
     Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}

Por supuesto, también puedo añadir una segunda y tercera configuración de intercambio de cuentas a un intercambio.

  • Configuración de varios intercambiadores con el mismo intercambio.

Por ejemplo, añadimos otra cuenta para Huobi Futures.

img

Como pueden ver, esto configura las cuentas de las dos bolsas Huobi Futures.

img

Cuando se crea la estrategia, un objeto Huobi Futures Exchange aparece en la opción Modificar configuración del Robot para su selección.

img

Por ejemplo, esto permite que dos cuentas vendan primero y luego compren con una estrategia de red típica (hacia arriba) o compren primero y luego vendan (hacia abajo).

A través de los dos ejemplos anteriores

Aquí está la diferencia entre configurar múltiples objetos de intercambio en el robot y Configurar múltiples objetos de intercambio para la misma cuenta de intercambio para el robot:

Este ejemplo sorprendente y mencionado anteriormente de La misma cuenta de intercambio tiene múltiples objetos de intercambio para el robot es algo similar, pero hay diferencias.

La diferencia es que el ejemplo anterior es una configuración de intercambio, es decir:

img

Cuando el robot configura el objeto de intercambio, siempre utiliza:

img

Esta configuración.

Es sólo que cuando se agrega un objeto de intercambio, las configuraciones de los pares comerciales son diferentes.

Si se llama la función GetAccount, siempre se accede a la información del activo de la misma cuenta.

sin embargo:

img

Los dos objetos de intercambio de futuros huobi así configurados, aunque todos son futuros huobi, representan cuentas de intercambio diferentes.

  • El uso de la configuración de intercambio facilita el diseño de la estrategia de futuros de criptomonedas.

A veces, en la estrategia de cobertura de contratos de criptomonedas, para aprovechar las oportunidades comerciales fugaces, muchos escenarios deben colocarse simultáneamente. Sin embargo, debido a que el contrato es diferente, debe cambiar al contrato correspondiente cuando obtenga la cotización del mercado y realice un pedido.exchange.Gola función para ejecutar una función de orden de colocación o obtener la cotización, hay un problema con la sincronización, no muy rápido. y el diseño del contrato de cambio también hace que la lógica no sea tan simple.

Por supuesto que hay, podemos añadir dos objetos de intercambio al robot siguiendo el Configurar múltiples objetos de intercambio para el robot en la misma cuenta de intercambio.

img

Luego use esta configuración de intercambio para agregar otro objeto de intercambio.

¡Se abrirá una caja de aviso!

img

Una configuración de cuenta de intercambio, no se pueden añadir objetos de intercambio de la misma moneda o par de operaciones.

¿Qué debo hacer? Parece que el robot de estrategia no puede utilizar dos objetos de intercambio, y el objeto de intercambio está vinculado a un número de cuenta de intercambio?

¡Todavía hay una manera!

Vamos a ir a Dashboard -> Exchange, y luego añadir una configuración de cambio de futuros OKEX.

img

Haga clic en Guardar cuando esté configurado.

img

De esta manera tenemos dos configuraciones de intercambio, pero se utiliza la misma información de configuración API KEY.

img

¿Cuáles son los beneficios de esto?

¡Cuando escriba una estrategia, el diseño será muy simple!

function main(){
    exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
    exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
    
    while (true) {
        var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
        var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
        var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
        
        var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
        var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
        var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
        
        if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
            var diff = tickerA.Last - tickerB.Last // calculate the difference
            $.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
            if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
                // Hedging
                rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
                rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
                
                var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
                var idB = rB.wait() // ...
            }
            
            // ...
        }
        
        LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
        Sleep(500)
    }

¿Es esta estrategia de diseño mucho más sencilla y clara?

Funcionamiento real del mercado:

img

Como pueden ver, sólo se necesitan unos 50 milisegundos para obtener el precio de dos contratos cada vez.


Relacionados

Más.