
Aprenda la estrategia comercial de construcción de módulos visuales (capítulo de introducción) y adquiera una comprensión conceptual de la construcción y unión de módulos visuales. Luego es fácil aprender a utilizar otros módulos. Se pueden combinar algunas funciones más complejas.
En estudios y pruebas anteriores, hemos entrado en contacto con varios módulos de “categoría de transacción”. Por ejemplo: Módulo “Cotizaciones de Bolsa” Módulo “Intercambio de obtención de línea K” …
No entraré en detalles sobre los que ya se han utilizado.

Al escribir una estrategia para operar con un robot, puede agregar más de un objeto de intercambio, por ejemplo, una estrategia de cobertura. O bien es necesario recorrer (recorrer significa visitar uno por uno) los objetos de intercambio para acceder a las condiciones del mercado. En este momento es necesario utilizar un módulo para obtener el número de intercambios.
Primero podemos utilizar una estructura simple para imprimir el número de intercambios configurados actualmente:

De hecho, es como llamar al siguiente código de política de JavaScript:
function main () {
Log(exchanges.length)
}
Veamos los resultados de ejecutar este módulo combinado:

Puede ver que hemos agregado 3 objetos de intercambio, que representan tres cuentas de intercambio diferentes, y el resultado de salida del registro de backtest es 3.

Al agregar tres objetos de intercambio, el cuadro desplegable mostrará tres opciones.
Aprenda un módulo de bucle con antelación, en el tipo de bucle.

Aprendamos de antemano un módulo de juicio condicional:
La condición de juicio se puede escribir como:

Usamos el módulo de bucle para iterar sobre los nombres de intercambio agregados Utilice el módulo de juicio condicional para determinar si el recuento de bucle actual corresponde al nombre de intercambio que se va a imprimir.

Resultados de la ejecución de backtest:

Al igual que el código de estrategia de JavaScript:
function main () {
for (var i = 1 ; i <= exchanges.length ; i++) {
if (i == 1) {
Log(exchanges[0].GetName())
} else if (i == 2) {
Log(exchanges[1].GetName())
} else {
Log(exchanges[2].GetName())
}
}
}

Un ejemplo simple obtiene el par comercial del primer objeto de intercambio configurado actualmente y lo asigna a la variable de texto (creada en la categoría de variable de antemano).
Resultados del backtesting:

Si llama al código de política de JavaScript:
function main () {
var text = exchange.GetCurrency()
Log(text)
}
Este módulo es muy importante y se utiliza para realizar pedidos. La variable de precio se inserta en la primera posición de la espiga (ranura) para especificar el precio del pedido. También se puede introducir directamente un valor fijo.
La segunda posición de espiga (punto) incorpora la variable de cantidad de pedido, que se utiliza para especificar la cantidad de pedido.
Por ejemplo, crearemos un ejemplo de colocación de una orden de compra basada en el último precio de los datos del mercado de ticks actual, con un deslizamiento de 10 yuanes, estableciendo la cantidad de la orden en 0,1 monedas e imprimiendo el ID de la orden.

Resultados de la ejecución de backtest:

Como el siguiente código de política de JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last + 10, 0.1)
Log(id)
}

Este módulo devolverá todas las órdenes pendientes para el par de operaciones actual. La estructura devuelta es una lista (matriz), que puede procesarse mediante módulos de tipo lista (operaciones de recorrido, etc.). Por ejemplo: modificamos ligeramente el ejemplo del módulo de pedido [4] anterior y cambiamos el precio de 10 yuanes agregado al realizar un pedido a una resta de precio de 10 yuanes. La orden no se ejecutará inmediatamente, sino que quedará pendiente en la profundidad de compra y venta (es decir, en un nivel determinado entre Comprar 1, Comprar 2 y Comprar N), de modo que la orden se encuentra en una orden pendiente esperando su ejecución. Luego utilizamos el módulo “Obtener la orden de encomienda del par comercial actual” para obtener una lista de órdenes en estado PENDIENTE (esperando ejecución). Para evitar la ejecución de órdenes en condiciones de mercado posteriores y afectar la observación final del backtest, después de que se ejecuta el módulo “Obtener la orden de encomienda del par comercial actual” y se imprime la lista de órdenes, utilizamos inmediatamente la opción “Lanzar excepción”. “ módulo para detener el programa.

Las pruebas retrospectivas muestran:

El precio de la orden de compra es 10 yuanes más bajo que el último precio en ese momento, por lo que la transacción no se completará de inmediato. Luego obtenga las órdenes que están esperando ser ejecutadas e imprímalas. Finalmente, se lanza una excepción para detener el programa.
Todo el módulo ensamblado es como llamar a una estrategia de JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
Log(exchange.GetOrders())
throw "stop"
}

Este módulo se utiliza para cancelar un pedido.
Hay muchos escenarios en los que esto es necesario al escribir políticas:
Cancelar todos los pedidos actualmente pendientes.
Sin duda, esto requerirá el uso del “módulo de cancelación de órdenes”. Mientras aprendemos el módulo de cancelación de órdenes, podemos usar [5] para obtener el módulo de la orden de encargo del par comercial actual y combinarlos para lograr esta función.
Primero, para probar la cancelación de todos los pedidos, realizar un pedido no es muy obvio, comenzamos realizando dos pedidos con diferentes precios y cantidades para distinguir los dos pedidos.

Utilice el módulo “Recorrer cada elemento de la lista” en el módulo de tipo bucle para recorrer los pedidos en la lista de pedidos pendientes actual.
Durante el recorrido, cada orden recuperada se asigna al módulo variable orden (creado en el tipo de módulo variable, como se muestra a continuación:)
Utilice el módulo de tipo de herramienta:
Saque el ID del pedido y páselo a la posición de espiga (cóncava) del módulo de cancelación de pedido, y el módulo de cancelación de pedido ejecuta el pedido de cancelación.
Ejecución de backtest:

Usando la descripción de la política de JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
var id2 = exchange.Buy(_C(exchange.GetTicker).Last - 12, 0.2)
Log(id2)
var orders = exchange.GetOrders()
Log(orders)
for (var i in orders) {
var order = orders[i]
Log(exchange.CancelOrder(order.Id))
}
}

Este módulo puede devolver información detallada del pedido conectando un módulo de variable de identificación de pedido a la posición de mortaja y espiga.

Preste atención al pedido devuelto después de ejecutar:

En comparación con los resultados de ejecución en el ejemplo [5], se puede encontrar que el pedido impreso es una información de pedido separada.[] Envuelto entre corchetes.
Dado que el ejemplo [5] devuelve una lista, este ejemplo devuelve una única información de orden (obtenida en función de la variable de ID del módulo en la posición de espiga pasada por el módulo).
El ejemplo anterior es equivalente a ejecutar una política de JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(exchange.GetOrder(id))
}
Estudiaremos los módulos anteriores uno por uno y configuraremos el intercambio de prueba para futuros de materias primas.
Configuración de backtesting:
El siguiente ejemplo prueba retrospectivamente esta configuración.

Los futuros de materias primas tienen horarios de apertura y cierre. Cuando el mercado está cerrado, no es posible conectarse.

Cuando el objeto de intercambio está configurado como un intercambio de futuros, si no establece el contrato y obtiene directamente la información del mercado, se informará un error:

Fijamos el contrato en MA909, que es el contrato principal actual para el metanol.
De esta manera, se obtiene el último valor del precio en el mercado de ticks actual del contrato MA909.
En el módulo de orden de ejecución

Es necesario especificar la dirección de la orden porque los futuros tienen:
comprar: abrir una posición larga
vender: abrir una posición corta
closebuy: cerrar posición larga
closesell: cerrar posición corta
Cuatro direcciones (los futuros de materias primas tienen dos direcciones más: closebuy_today cierra posiciones largas hoy, closesell_today cierra posiciones cortas hoy).
Por ejemplo, si el módulo de órdenes está configurado para comprar, entonces hay dos significados: abrir una posición larga y cerrar una posición corta, lo que crea ambigüedad. Por lo tanto, es necesario el módulo “Establecer dirección de orden de negociación de futuros” para establecer una dirección de orden clara.

Las pruebas retrospectivas muestran:

Al igual que el código de estrategia de JavaScript:
function main () {
while (true) {
if (exchange.IO("status")) {
exchange.SetContractType("MA909")
Log(exchange.GetTicker().Last)
exchange.SetDirection("buy")
Log(exchange.Buy(1000, 1))
throw "stop"
} else {
Log("未连接商品期货前置机")
}
Sleep(1000)
}
}
El uso de futuros de moneda digital es básicamente el mismo que el uso de futuros de materias primas en [8] arriba.
Tomando OKEX como ejemplo, el código del contrato puede ser:
BitMEX :
Configuración del módulo de apalancamiento

Se utiliza para establecer el apalancamiento para futuros de monedas digitales.
# 注意 : 回测不支持。
Como en la estrategia de JavaScript:
function main () {
exchange.SetMarginLevel(10)
}
Ejemplo de estrategia de visualización:
Hay más estrategias disponibles en: https://www.fmz.com/square
Otros artículos de esta serie