En el artículo de hoy explicaré cómo construir un sistema sencillito con el asistente del NinjaTrader 7 para los lectores que aún no tengan el NT7 decirles que con el NT6.5 también se puede replicar, quizás la única diferencia sea el aspecto visual de las pantallas que intervienen durante el proceso de automatización.
La mayoría de herramientas de automatización como Visual Chart y Ninja Trader disponen de asistentes que ayudan a “fabricar” sistemas, esto es importante para aquellos lectores que no tienen conocimientos de programación previos pues mediante estos asistentes es posible crear sistemas sin saber nada de programación. Vamos a ello, utilizando el asistente de NT7 nuestro primer sistema será automatizar un método sencillo basado en el cruce de medias.
Este método tiene la principal característica de estar siempre en mercado, es decir, siempre tenemos una posición abierta en mercado ya sea larga o corta.
Criterios de entrada
Como ya he mencionado siempre estamos en mercado, por eso los criterios de entrada se ceñirán a determinar cuándo nos ponemos largos y cuándo nos ponemos cortos.
Posición larga o compra: cuando el precio de cierre del instrumento corte hacia arriba la media de su cotización.
Posición corta o venta: cuando el precio de cierre del instrumento corte hacia abajo la media de su cotización.
Criterios de salida
Básicamente cuando estamos largos y pasamos a cortos se cierra la posición y se abre la contraria, por tanto, en cada cruce del cierre de la cotización con su media se saldrá de la posición actual y se abrirá una nueva posición en dirección contraria, lo que comúnmente se llama Reverse de la posición.
Proceso de automatización
Vamos a ver paso a paso cómo construimos este sistema con el asistente:
- Paso 1- Iniciamos el asistente pulsando la opción Tools > New NinjaScript > Strategy nos tiene que aparecer la siguiente pantalla
- Paso 2 - Pulsamos sobre el botón Next
- Paso 3 - La siguiente pantalla que nos encontramos se utiliza para definir el sistema que vamos a crear, tenemos que asignarle un nombre y una descripción como podéis ver en nuestro caso:
La opción “Calculate on bar close” habilitada por defecto significa que nuestro sistema se ejecutará solo cuando se cierre la barra de la dimensión elegida en nuestro gráfico, es decir, si abrimos un gráfico con un instrumento cualquiera y con la dimensión 5 minutos, se ejecutará nuestro sistema cada 5 minutos coincidiendo con el cierre de la barra actual. Si en cambio deshabilitamos esta opción se ejecutará con cada movimiento del instrumento por tanto cada Tick, esta opción consume mucho proceso de CPU.
- Paso 4 - Pulsamos sobre el botón Next y nos aparece la pantalla de definición de parámetros de entrada a nuestro sistema, aquí definiremos el nombre, tipo y valor por defecto de aquellos parámetros que consideremos útiles para nuestro sistema, como por ejemplo el número de contratos para las órdenes enviadas a mercado o fechas de inicio, horas de activación, etc…
El nombre del parámetro debe empezar obligatoriamente con el primer carácter en mayúscula, el “Type” o tipo del parámetro deberá ser cualquiera de los que se muestran en el desplegable bool es booleano y solo puede tomar dos valores true o false, double para aquellos parámetros numéricos y con decimales como por ejemplo el precio de la cotización, string para aquellos parámetros que contienen información alfanumérica como el nombre del instrumento “ES 06-10”, int o entero para parámetros enteros como podría ser una fecha u hora, conviene aclarar el formato que utiliza NT para las variables o parámetros que almacenan fechas o horas:
- Fecha utiliza el formato AAAAMMDD o sea que el día 15 de Abril del 2010 se almacenará como 20100415 y esto es un entero o int.
- Hora utiliza el formato HHMMSS o sea que las 15:30:25 lo representará como 153025 y esto es un entero o int.
“Default” nos permite especificar el valor por defecto que tomará nuestro parámetro para que no estemos introduciendo siempre el mismo valor en cada ejecución del sistema.
- Paso 5 - Cuando hayamos definido los parámetros pulsamos sobre el botón Next y pasaremos a definir los criterios de entrada y salida de nuestro sistema:
Como podéis ver hay hasta 10 pestañas que nos permiten definir hasta 10 criterios diferentes de entrada/salida, la lógica aquí es pensar que cuando se cumplan las condiciones introducidas en una de las pestañas se ejecutará la acción o acciones introducidas en esa misma pestaña, por lo tanto si tenemos 2 posibles criterios de entrada diferentes deberemos rellenar 2 pestañas aun cuando la acción a realizar sea la misma, como por ejemplo comprar 1 contrato. Lo mismo ocurrirá para los criterios de salida.
Tened en cuenta que un criterio de entrada puede tener más de una condición, como nuestro sistema de hoy, para entrar largo en mercado hemos dicho que el precio de cierre debe cruzar o cortar hacia arriba la media, como la imagen siguiente:
La línea punteada azul es la media, y como podéis ver esta media ha sido cruzada por la barra con la etiqueta “Buy” de la operación de compra y también por la barra anterior, pero lo realmente importante es entender y ver las condiciones que se tienen que dar para que se haya producido un cruce hacia arriba de la media, básicamente son 2:
- Condición 1: El precio de cierre de la barra anterior debe estar por debajo de la media
- Condición 2: El precio de cierre de la barra actual debe estar por encima de la media
Con estas 2 condiciones determinamos nuestro criterio de entrada para la compra puesto claramente sabemos que si se cumplen a la vez habremos cruzado de abajo a arriba la media. Veamos cómo introducimos estas condiciones desde el asistente
- Paso 6 - Pulsamos sobre el botón ADD del cuadro etiquetado como “When the following conditions are true” nos aparece la siguiente pantalla
Es lo que yo llamo el constructor de condiciones, vamos por partes, a la izquierda de la pantalla tenemos una lista idéntica a la de la derecha y justo en el centro tenemos el operador, los operadores más utilizados son == (igual), < (menor), > (mayor), <= (menor o igual) , >= (mayor o igual), != (diferente) y alguno más.
Las listas nos permiten escoger los elementos implicados en la condición a construir, de nuestro sistema, ¿cuáles creéis que son? Pues muy fácil: la media y el precio de cierre de la cotización pues así lo hemos definido en los criterios de entrada.
La media en cualquier herramienta se caracteriza por ser un elemento del tipo “indicador” y por lo tanto lo podremos localizar en el desplegable “Indicators” y el precio de cierre lo encontraremos dentro del desplegable “Price data” por el momento todo muy intuitivo, no?
Pues vamos a construir la condición 2 de nuestro sistema
- Paso 7 - Seleccionando en la lista derecha el Indicador SMA (Simple Moving Average) y seleccionando en la lista izquierda el Precio Close, nos aparecen los parámetros de cada elemento seleccionado en la parte inferior del constructor:
Para el indicador tenemos Input series donde hay que asignar sobre qué se calculará la media, puesto podríamos calcularla sobre otro indicador, pero en nuestro caso lo dejamos tal y como viene por defecto, o sea DefaultInput, que en nuestro caso particular será el precio de cierre, puesto que así lo configuraremos en el gráfico. Period equivale al número de barras a considerar para calcular el indicador, en nuestro caso la media inicialmente la haremos sobre 14 barras. Bars ago equivale a qué barra queremos hacer referencia en nuestra condición, sabiendo que 0 equivale a la barra actual o última e incrementando 1 accedemos a la anterior y así sucesivamente, como estamos configurando la condición 2 y ésta es sobre la barra actual dejaremos 0. Offset y Offset type nos permitirán especificar una distancia sobre el valor devuelto por el indicador seleccionado, imaginaros que queremos que nuestra condición se cumpla sólo si el precio de cierre ha superado la media en determinado porcentaje, con esta opción podríamos especificar Offset Type= Percent y Offset el porcentaje deseado. Plot on chart solo puede tomar 2 valores: true o false, en caso de que asignemos true veremos pintado el indicador en nuestro gráfico cuando habilitemos el sistema.
Para el precio de cierre tenemos el Bars ago y el Offset y Offset type ambos tienen la misma equivalencia que en el caso de los indicadores, para construir la condición 2 nos bastará la barra actual que es 0.
El operador que tenemos que seleccionar es (>) “mayor” por lo tanto si leemos de izquierda a derecha del constructor tenemos:
Si el Close (cierre) de la barra actual es mayor a Indicador SMA (media) de la barra actual…. (hemos construido la condición 2)
- Paso 8 - Pulsamos el botón Ok y nos aparecerá una línea con la condición, ahora solo nos queda definir la condición 1 de la misma manera pero teniendo en cuenta que la barra sobre la que construimos la condición es la barra anterior y por tanto el parámetro bars ago debe ser 1 para ambos elementos y el operador debe ser el contrario (<) o mejor (<=) porque de lo contrario podría ser que si el precio de cierre fuera igual al valor de la media (cosa rara) no se cumpliría la condición y por tanto nuestro sistema no detectaría el cruce.
- Paso 9 - Cuando tenemos definidas las 2 condiciones de 1 criterio de entrada, hay que indicarle las acciones que realizará nuestro sistema, para el caso que nos ocupa tenemos que entrar largos, procedamos a construir la acción:
- Paso 10 -Pulsamos sobre el botón Add del cuadro etiquetado como “Do the following” y se nos mostrará la siguiente pantalla:
Los elementos que podemos seleccionar son básicamente tres: Drawing por si queremos dibujar algo en el gráfico, comúnmente utilizado en la construcción de indicadores, Misc o “varios” por si queremos que haga algún sonido o escriba un mensaje de alerta, etc… y Order management o gestión de órdenes, el más importante desde donde elegiremos cómo enviar la orden a mercado, como en nuestro sistema queremos entrar largos elegiremos Enter Long position de la lista (1) y abajo nos aparecerán los parámetros
En Quantity, tenemos que indicar el número de contratos que queremos comprar, acordaros aquí que definimos en el paso 4 el parámetro “Contratos” que persigue dicho objetivo, por lo tanto para seleccionarlo deberéis pulsar sobre el botón “…” puntos suspensivos que aparece al lado del parámetro Quantity, lo podéis ver en la imagen anterior etiquetado con (2) , al pulsarlo se abrirà la ventana “Value” y deberemos seleccionarlo bajo el elemento “User defined Inputs”(3) y finalmente pulsar el botón Ok (4) creo que no es necesario detallarlo más pues todo es muy intuitivo.
- Paso 11 - Ya tenemos definido el primer criterio de entrada y debería parecerse a la siguiente imagen
Ahora solo nos faltará crear en otra pestaña el criterio de entrada 2, o sea para entrar cortos en mercado que es muy parecido al que acabamos de hacer. Os lo dejo como ejercicio, si alguien no se aclara que me lo diga.
- Paso 12 - Si pulsamos Next nos aparecerá una pantalla donde podemos especificar otros criterios de salida como el stop loss o el target profit ya comentados en otro artículo. En nuestro caso como es un sistema que está siempre en mercado no añadiremos nada, pero es igual de intuitivo.
- Paso 13 - Pulsamos sobre Next y aparece la última pantalla del asistente
Veamos en este punto los botones que aparecen en la parte inferior. Help nos presentará el manual de ayuda donde se explica en inglés el funcionamiento del asistente. View code nos permite ver el código que ha creado el asistente por nosotros y sin tener que saber nada de programación!. Unlock code permite desbloquear el código para modificarlo, esta opción solo la aconsejo si sabéis programar algo o queréis aprender trasteando el código, una vez desbloqueado ya no podréis utilizar el asistente para modificar o añadir criterios. Compile nos permite compilar el código para ver si lo que ha generado el asistente es correcto o no, en principio no es necesaria su utilización. Back nos permite retroceder por si queremos cambiar algo. Finish termina el asistente y genera el sistema para ser utilizado en nuestros gráficos. Cancel desestima todo lo que hayamos hecho hasta el momento y sale del asistente.
- Paso 14 - Bien pues para terminar hay que pulsar el botón Finish y ya podremos utilizar el sistema que hemos creado.
Ahora os voy a poner algunos deberes, una vez terminado el sistema me gustaría que lo ejecutarais sobre el instrumento ES 06-10 en un período de 100 días y vierais sus resultados.
Acto seguido modificáis el sistema desde la opción Tools > Edit NinjaScript > Strategy y cambiáis los parámetros para que la media se calcule sobre 30 barras en lugar de las 14 que mostramos en el ejemplo, y ejecutáis de nuevo el sistema sobre el mismo gráfico (Pulsando F5)
El resultado o ganancias son mucho mejores ¿no? Los resultados obtenidos deberían parecerse a los siguientes:
Venga, ya podéis empezar a trastear y a crear vuestros propios sistemas, aconsejo que una vez creado le echéis un vistazo al código para que os vaya sonando o veáis cómo se traduce en código la fabricación delsistema, es bastante intuitivo también y poco a poco iréis aprendiendo un poco de programación…
En nuestro caso el código del sistema es el siguiente:
Se lee bastante bien, ¿no? seguro que si hacéis algún cambio en el sistema y miráis las diferencias vais a seguir aprendiendo mucho.
Si alguien me quiere pedir el sistema de ejemplo, puede solicitarlo desde este enlace.
Un saludo!!