18

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!!

  1. en respuesta a yolimon
    #20
    14/08/15 00:15

    Hola, he seguido estos pasos y he creado la estrategia. Pero al buscarla en Strategies no la veo. ¿Cómo la encuentro? Gracias

  2. #19
    15/05/13 12:51

    GRACIAS por tus explicaciones, me han sido muy útiles.
    Me gustaría seguir trabajando la programación, pero no se donde dirigirme. Existen mas tutoriales como este?
    Me surgen muchas preguntas, y no se donde buscar.
    Como añado un horario para limitar el sistema?
    como encadenar "programillas"?
    como conseguir que las entradas no se efectúen al final de la vela?
    Como hacer las condiciones en un TF y poder hacer las entradas en otro?
    etc......
    De antemano gracias.
    Saludos

  3. #17
    04/05/11 12:04

    Rescato este post antiguo, pero me ha sido de mucho utilidad y me surge una duda. Como pongo las comisiones?. Ahora he estado probando y como remedio casero le he metido un split igual a las comisiones, pero claro no es lo mismo. En que momento se establecen las comisiones.

    Gracias por el post.

  4. en respuesta a Kostalazo
    #16
    10/02/11 19:32

    Correcto Kostalazo, muy bien visto.

    Saludos

  5. en respuesta a Joanmarcel
    #15
    10/02/11 19:20

    ¡Ya se porqué no funciona! El problema viene al usar la barra actual para la toma de datos de la segunda condición. Al ser el cierre de esta siempre superior al máximo del periodo que hemos establecido, nunca produce entradas. En cambio usando cualquiera de estas dos condiciones:
    Close[0] > MAX(High, x)[1]
    Close[0] => MAX(High, x)[0]

    si que proporciona entradas. Gracias en cualquier caso por las molestias que te has tomado ayudándome y por el trabajo que haces acercando esta excelente plataforma a los novatos como yo.

    Un gran saludo.

  6. en respuesta a Kostalazo
    #14
    07/02/11 17:08

    Pues así no se me ocurre nada, has mirado en la pestaña Log del Ninja a ver si te está dando algún error cuando ejecutas el backtest? otro método bueno para ver si está haciendo lo que debe el código es añadir líneas del tipo:

    Print ("variable x:" + x);

    para que con la herramienta Output window puedas ver los valores que toman las diversas variables en tiempo de ejecución del backtest y así poder ver por dónde entra y que valores obtiene.

    Saludos

  7. en respuesta a Joanmarcel
    #13
    07/02/11 16:52

    No. Siempre le pongo un número de entradas más elevado. También pongo el número de barras necesarias a uno, para que no de problemas. Efectivamente, lo pruebo con el strategy analizer.

  8. en respuesta a Kostalazo
    #12
    07/02/11 16:28

    Kostalazo,

    has mirado las estadísticas del backtest? a ver si es que sólo te ha ejecutado una entrada pues tienes limitado el número máximo de posiciones abiertas (entries per direction=1), lo pruebas con el strategy analizer?

    saludos

  9. en respuesta a Joanmarcel
    #11
    07/02/11 14:30

    Gracias por tu respuesta, pero, algo debo de hacer mal, porque al hacer el backtest no produce entradas, a pesar de que en el periodo analizado hay varias.

    El caso es que no sé que puede ser, el código me ha quedado igual al que tú indicas.

    Un saludo.

  10. en respuesta a Kostalazo
    #10
    05/02/11 10:50

    Hola Kostalazo,

    En el condition builder dentro de las funciones tipo Price Data esgoge Close en el panel izquierdo, y en el panel derecho selecciona bajo indicators la función MAX, el parámetro Input series debe ser High y el parámetro Period de esta función es tu X, si quieres puedes parametrizarlo, entonces deberás asignarle la variable que hayas creado para tu sistema.

    el código debería ser el siguiente:
    Close[0] > MAX(High, x)[0]

    espero haberte ayudado.

    Saludos

  11. #9
    04/02/11 18:07

    Buenísimo tutorial, me ha ayudado mucho en mis primeros pasos con el NT. He estado intentando introducir un nuevo criterio de entrada, que es que para abrir un largo, el cierre esté por encima del máximo de las últimas X sesiones, pero no consigo configurarlo. A ver si me podéis echar una mano.

    Saludos.

  12. en respuesta a Jabs35
    #8
    16/04/10 17:42

    Hola Jabs35,

    no te aparece la línea 35 porque en el paso 7 no has puesto el parámetro "Plot on chart" a true, por defecto es false. Modifica el sistema y en solo una de las condiciones cambia el valor de este parámetro, de esta manera al aplicar el sistema a tu gráfico aparecerá también pintado el valor del indicador y por lo tanto verás dibujada la media.

    Muchas gracias

  13. en respuesta a Joanmarcel
    #7
    16/04/10 17:12

    Gracias por las respuestas.
    Lo he probado sobre Apple a diario con yahoo y funciona sin problemas.
    Veo una diferencia en el código ejemplo respecto al mio (no me aparece tu linea 35) es normal?
    El post es tremendamente instructivo y muy claro a la hora de exponer los conceptos.
    Saludos

  14. en respuesta a Jabs35
    #6
    16/04/10 12:13

    Hola Jabs35,

    te respondo:
    1.- Yahoo solo proporciona datos de acciones en su dimensión diaria, por lo que podrías probar el sistema con otro instrumento que puedas visualizar en el propio yahoo. Si quieres datos sobre el ES puedes abrir una cuenta demo con ZenFire o AMP.
    2.- NT hace automáticamente ese trabajo para nosotros, si hay una posición larga y generas su contraria, primero cierra la posición y luego abre la contraria, eso lo puedes ver en el 5º gráfico del artículo que en la barra donde se produce la compra o Buy también hay otra etiqueta con la orden Close.

    Saludos

  15. en respuesta a Orion
    #5
    16/04/10 12:09

    Muchas gracias a ti Orion por el comentario.

  16. #4
    16/04/10 01:14

    Siguiendo los pasos del post me surgen dos problemas:

    1. No consigo cargar los datos correspondientes al instrumento sobre el que quieres que ejecutemos el sistema, lo he intentado con yahoo y google; hace falta tener algún proveedor de datos?

    2. Si el sistema esta todo el tiempo en mercado no deberiamos cerrar posición larga para luego abrir la corta? (o abrir dos cortos uno para cerrar el primer largo y otro para posicionarnos? Lo mismo para el lado corto pero al reves.

    Enhorabuena por el blog, suena muy interesante
    Saludos

  17. #3
    15/04/10 20:59

    Así parece sencillito. Gracias por este lujo de detalles.
    Un saludo

  18. #1
    15/04/10 13:55

    Buen post,

    creo que tu blog puede ser de gran ayuda,

    un saludo

Cookies en rankia.com

Utilizamos cookies propias y de terceros con finalidades analíticas y para mostrarte publicidad relacionada con tus preferencias a partir de tus hábitos de navegación y tu perfil. Puedes configurar o rechazar las cookies haciendo click en “Configuración de cookies”. También puedes aceptar todas las cookies pulsando el botón “Aceptar”. Para más información puedes visitar nuestra política de cookies.

Aceptar