La programación visual siempre ha sido un objetivo deseado para los desarrolladores de herramientas de software, incluso en el campo del comercio cuantitativo. Porque el enfoque de visualización “lo que ves es lo que obtienes” reduce en gran medida el umbral técnico para el desarrollo de programación. Los usuarios ya no tienen que lidiar con un montón de aburridos códigos. Solo necesitan usar su cerebro, su imaginación y su pensamiento lógico, y concentrarse en el negocio en sí. Puedes realizar el programa que quieras, ¿no es increíble?
¡Entremos entonces juntos en el campo de la programación visual de estrategias comerciales cuantitativas!
Después de iniciar sesión en https://www.fmz.com, registre una cuenta (si ya se ha registrado, inicie sesión directamente) y haga clic en: Centro de control->Biblioteca de políticas->Nueva política.
Podemos ver una estrategia de visualización inicial. Solo muestra la información de los activos de la cuenta del intercambio configurado de forma predeterminada (el primer objeto de intercambio agregado en la prueba retrospectiva o el robot). (Como se muestra a continuación)
## Antes de comenzar a aprender a utilizar la visualización, primero podemos comprender algunos conceptos de diseño de visualización.
Una observación cuidadosa revela que todos los módulos tienen espigas (cóncavas) y mortajas (convexas), lo que significa que los módulos se pueden “conectar” y “conectar”. Si los códigos funcionales representados por dos módulos se pueden conectar, entonces se unirán al acercar la mortaja y la espiga de los dos módulos.
Algunos módulos tienen algunas configuraciones especiales, por ejemplo:
Puede arrastrar el módulo “Proyecto” de la izquierda al módulo “Unir”, de modo que pueda agregar una posición de mortaja y espiga, agregando así una posición para unir texto. De esta manera podrás realizar algunos ajustes y configuraciones para el módulo haciendo clic en el pequeño engranaje.
Algunos módulos requieren parámetros de entrada, que pueden ser valores, cadenas, etc. Si no agrega variables como parámetros de entrada del módulo, el módulo se ejecutará de acuerdo con los parámetros de entrada predeterminados.
Un módulo de cálculo como este para encontrar raíces cuadradas genera los resultados del cálculo de este módulo.
Como puede ver, si falta el parámetro de entrada, se utiliza el valor predeterminado 9 como parámetro de entrada para calcular la raíz cuadrada de 9.
Por supuesto, si desea utilizar un módulo variable como parámetro de entrada, puede conectar directamente el módulo variable a la posición de mortaja y espiga (hueco).
Se puede hacer clic en el módulo y arrastrarlo con el botón izquierdo del ratón. Los módulos se pueden copiar usando Ctrl + C y pegar usando Ctrl + V, tan convenientemente como copiar y pegar código o texto. El área de operación se puede ampliar o reducir usando la rueda del mouse, y todos los módulos se ampliarán o reducirán. Haga clic y mantenga presionada un área en blanco en el área de operación y arrastre para mover el área de operación. La papelera de la derecha registra los módulos que se eliminaron recientemente. Lo más importante, después de ensamblar la estrategia del módulo, no olvides hacer clic en “Guardar”.
Puede ver que hay muchas categorías de módulos en el lado izquierdo del área de edición visual, y hay muchos módulos visuales disponibles en cada categoría.
Hay 11 categorías en total.
Este módulo se suele utilizar en combinación con módulos de texto, como se muestra a continuación:
Puede ingresar una cadena en el módulo de clase de texto, de modo que cuando ejecute el módulo “información de salida”, se imprimirá el contenido de la cadena en el módulo de texto.
Prueba retrospectiva:
Como el código del lenguaje JavaScript:
function main(){
Log("你好,可视化编程!")
}
Este módulo parece igual que “Información de salida”, excepto que genera información y la envía a la cuenta de WeChat vinculada a la cuenta actual.
Como el código del lenguaje JavaScript:
function main () {
Log("微信推送!@")
}
El módulo de lanzamiento de excepción permite que el programa genere un error y luego detenga la ejecución del programa (sin escribir código de manejo de excepciones).
Esto es similar a la estrategia de JavaScript donde la función throw “string to be output” se ejecuta directamente en la función principal.
function main () {
throw "第一句就抛出异常,让程序停止!"
}
Resultados del backtesting:
Generalmente se utiliza con mayor frecuencia durante la depuración, por ejemplo, cuando se desea que el programa se detenga bajo una determinada condición e imprima algunos datos en ese momento para facilitar la observación.
O puede colocar un módulo que lance excepciones en el flujo de código donde puedan ocurrir problemas, para que el programa pueda informar errores y descubrir algunos errores.
Módulo de hibernación
Como en la estrategia de JavaScript:
function main () {
Sleep(1000 * 5)
}
Pruebe el módulo de hibernación:
Resultados del backtesting:
Este módulo es similar a la función LogProfit de la API de la plataforma de comercio cuantitativo de Inventor, que imprime el registro de ganancias y dibuja automáticamente la curva de ganancias en función de los parámetros de entrada.
Por ejemplo:
La ejecución de la prueba retrospectiva se muestra a continuación:
El código de política de JavaScript correspondiente es el siguiente:
function main () {
LogProfit(1)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(3)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(5)
}
Se puede empalmar en cualquier ubicación donde desee generar información de ingresos.
El módulo de bucle puede envolver una serie de combinaciones de módulos empalmados y dejar que esta combinación de módulos se ejecute en un bucle.
prueba:
Resultados del backtesting:
Se puede observar que después de que el módulo de bucle envuelve la combinación de módulos que consta de Print Profit y Sleep, la combinación de módulos se ejecutará de forma continua.
El uso de este módulo es básicamente el mismo que el del módulo de bucle, la única diferencia es que este módulo tiene una función de suspensión incorporada.
Este módulo se puede utilizar cuando se necesita controlar con precisión módulos variables o valores numéricos. El valor numérico de la parte del parámetro de entrada se emitirá como el valor numérico de los decimales especificados según la configuración.
Por ejemplo, el número 3,1415926535897 se procesa con precisión.
Las pruebas retrospectivas muestran:
Se utiliza para borrar registros. Según los parámetros de entrada, se puede conservar una parte de los registros. Como en la documentación de la API:
LogReset()
Se utiliza para borrar el registro de ingresos. Según los parámetros de entrada, se puede conservar una parte del registro. Como en la documentación de la API:
LogProfitReset()
Este módulo de herramienta debe utilizarse junto con el módulo de mercado en el “Tipo de módulo de trading”, como se muestra en la figura:
Utilice el módulo de información de salida para generar el último precio de transacción del último mercado de tickers:
Las pruebas retrospectivas muestran:
Al igual que el código de estrategia de JavaScript:
function main () {
Log(exchange.GetTicker().Last)
}
Este módulo también debe utilizarse junto con el módulo de adquisición de datos de línea K en el “Tipo de módulo comercial”.
Primero crea un módulo variable y nómbralo: K-line.
Luego obtenga los datos de la línea K, utilice el módulo de datos de la línea K para obtenerlos y asígnelos al módulo variable: “Línea K”.
Luego, utilice el módulo de longitud de lista en el “Tipo de módulo de lista” para obtener la longitud del módulo variable de la línea K, que se utiliza para especificar de qué barra de la línea K se obtendrán los datos.
Coser juntos, como se muestra:
Cuando se ejecuta la prueba retrospectiva, se imprime la marca de tiempo de la última barra de la línea K.
También debe utilizarse junto con el módulo Obtener datos de profundidad en el “Tipo de módulo de transacción”.
Establezca el índice en 0, establezca una orden de venta y obtenga la información de la orden de venta.
Al igual que el código de estrategia de JavaScript:
function main () {
Log(exchange.GetDepth().Asks[0])
}
Este módulo debe utilizarse junto con el módulo Obtener información de activos.
Por ejemplo: imprimir el número de monedas disponibles en la cuenta corriente
Las pruebas retrospectivas muestran:
Como en la estrategia de JavaScript:
function main () {
Log(exchange.GetAccount().Stocks)
}
Este módulo se utiliza para obtener el valor de un determinado atributo en los datos de la orden, como el precio o la cantidad de la primera venta en el libro de órdenes (ejemplo número 13).
Resultados del backtesting:
Como en la estrategia de JavaScript:
function main () {
Log(exchange.GetDepth().Asks[0].Price)
}
También se puede utilizar para obtener un determinado atributo en la información del pedido devuelta por el “Módulo de consulta de detalles del pedido” (que se explicará en la sección avanzada).
De manera similar, se debe utilizar junto con el módulo “Obtener posición de futuros”. Cabe señalar que los datos de posición que devuelve el módulo Obtener posición de futuros son una matriz (lista), que es una estructura de datos que contiene posiciones de diferentes contratos y direcciones. . Por lo tanto, debe especificar el índice al utilizarlo.
Después de aprender tanto, combinemos una operación de cobertura, es decir, cubramos contratos a corto y largo plazo al mismo tiempo. Hacemos una cobertura de arbitraje positiva, es decir, abrimos un contrato forward corto, 1 contrato, y abrimos un contrato largo en el corto plazo.
Resultados del backtesting:
Ejemplo de estrategia de visualización:
Hay más estrategias disponibles en: https://www.fmz.com/square
Otros artículos de esta serie