Vamos a construir un sistema automático con el Strategy Builder de NinjaTrader 8, basado en el cruce de dos medias.
Será un sistema continuo, es decir que siempre estará en mercado. Utilizará dos medias, una larga de mayor período o media lenta, y otra corta de menor período o media rápida. Si la media rápida está por encima de la media lenta, el sistema estará largo o comprado. Y si está por debajo, la posición será corta o vendida.
Tipo de media
La biblioteca de indicadores de NinjaTrader 8 aloja muchos tipos de medias: SMA, EMA, TMA, DEMA, KAMA, HMA, etc. El objetivo de este artículo no es diseñar un sistema ganador, sino ejemplificar el uso del Strategy Builder para construir un sistema automático, por lo tanto elegiré un tipo de media cualquiera ya que por ahora no me preocupan los resultados que pueda conseguir. Voy a usar la SMA.
En la siguiente imagen se señalan las zonas de compra-venta que detectaría el sistema de cruce de medias utilizando dos SMA.
Creación de la estrategia
Consulte el artículo dedicado al Strategy Builder si aún no está familiarizado con este asistente. El primer paso es abrir el Strategy Builder desde el menú New / Strategy Builder.
Welcome
En el desplegable Strategy seleccionar New strategy… y pulsar en Next para ir al siguiente paso del asistente.
General
En esta ventana introducir un nombre válido para la estrategia y una descripción. Pulsar en Next.
Default Properties
En este paso Default Properties no cambiar nada.
Additional Data
En la ventana Additional Data tampoco hay que realizar cambios.
Inputs and Variables
En este paso de Inputs and Variables tenemos que configurar los parámetros de entrada que el sistema va a necesitar. En este caso son dos: uno para el período de la media lenta, y otro para el período de la media rápida. Estos parámetros serán personalizables por el usuario en la ventana de carga de la estrategia, y también podrán ser optimizados desde el Strategy Analyzer.
En la sección Inputs, pulsamos en la etiqueta add para añadir los parámetros uno a uno.
Primero creamos un parámetro para el período de la media lenta, rellenando los siguientes campos:
- Name: es el nombre del campo. Introducir un nombre identificativo, como por ejemplo PerioSMASlow.
- Type: el tipo de datos que alojará el campo. Al tratarse de un período almacenará números enteros
- Default: valor por defecto que queramos informar. Por ejemplo 90.
- Min: valor mínimo que puede tomar el campo. Para los períodos es 1.
- Description: un texto informativo que se mostrará al pasar el mouse sobre el campo.
Y del mismo modo añadimos un segundo parámetro para el período de la media rápida.
El aspecto final de la ventana Inputs and Variables debe quedar como en la imagen siguiente. Y pulsamos en el botón Next para ir al siguiente paso.
Conditions and Actions
El siguiente paso del asistente es el de Conditions and Actions y es el más complejo ya que aquí vamos a dotar a nuestra estrategia de los algoritmos de comportamiento para tomar decisiones y ejecutar órdenes. El comportamiento del sistema será como sigue:
- Si la media rápida está por encima de la media lenta, la posición de la estrategia debe ser larga.
- Si la media rápida está por debajo de la media lenta, la posición de la estrategia debe ser corta.
Por razón de sencillez he decidido que sea un sistema continuo, así que siempre estaré comprado o vendido. Cuando las medias se crucen al alza, compraré, y cuando se crucen a la baja, venderé.
Añadir primera condición
Para añadir condiciones, pulsar en la etiqueta add del panel de condiciones.
En la ventana que aparece hay que configurar la condición. La primera condición que voy a crear es el cruce al alza de la media rápida sobre la media lenta.
En el panel de la izquierda hacemos doble clic sobre la carpeta Indicator.
Se despliega el contenido con todos los indicadores disponibles. Navegamos en la lista hasta encontrar la entrada SMA. Ésta será la media rápida.
En el campo Parameters/Period del panel inferior configuraremos el período. Por defecto figura un 14, pero no queremos un período fijo, sino que lo elija el usuario cuando ejecute la estrategia. Desplazamos el mouse sobre el campo Period y pulsamos sobre la etiqueta set que aparece. A continuación se abrirá un nuevo diálogo para seleccionar el parámetro del cuál obtener el período.
Hacemos doble clic sobre la carpeta User input y seleccionamos el parámetro que alojará el período para la media rápida PerioSMAFast que creamos anteriormente en el paso Inputs and Variables. Pulsamos en OK para regresar a la ventana anterior.
Ya tenemos configurada la media rápida.
Repetimos los mismos pasos en el panel de la derecha para configurar la media lenta, pero eligiendo esta vez el parámetro PerioSMASlow para el período.
Operador de comparación
El último paso para configurar la condición es establecer el tipo de comparación. Como queremos evaluar el cruce al alza, seleccionamos en el desplegable de la columna central la opción Cross above.
El campo Look back period informa del número de barras hacia atrás que queremos incluir para localizar el cruce. Sólo buscaremos el cruce en la barra corriente, así que asignamos un 1 al campo. Para cerrar la ventana pulsamos en el botón OK.
Añadir primera acción
En el panel superior se puede observar que la condición ha quedado registrada. Ahora hay que configurar la acción a ejecutar cuando se cumpla dicha condición. En el panel inferior pulsamos en la etiqueta add para abrir el diálogo de acciones.
Hacemos doble clic en la carpeta Order Management y seleccionamos Enter long position. Y pulsamos en OK.
Añadir segundo grupo de condición + acción
Ya hemos registrado la primera condición junto con su acción: cuando la media rápida cruce al alza a la media lenta, se enviará una orden de compra a mercado. Ahora tenemos que configurar lo mismo pero para el cruce a la baja. Pulsamos en el botón +.
Se creará una nueva pestaña Set 2 donde poder configurar un nuevo grupo de condición y acción. Simplemente repetimos los mismos pasos que hemos seguido para configurar el cruce al alza, pero esta vez para hacerlo a la baja, de modo que cuando la media rápida cruce a la baja a la media lenta, se enviará una orden de venta.
La primera diferencia con el Set anterior del cruce al alza es que hay que elegir Cross below para la condición.
Y la segunda diferencia es la elección de Enter short position para la acción.
Y así queda registrado el segundo Set para el cruce a la baja. Para ir al siguiente paso pulsamos en el botón Next.
Stops and Targets
El sistema va a entrar y salir por los cruces de las medias, así que no hay que configurar órdenes de stop-loss ni de take-profit en la ventana de Stops and Targets. Pulsamos en Next.
Finish
Para terminar pulsamos en el botón Finish. Esta acción supone una compilación interna que puede dejar al sistema sin respuesta durante unos breves instantes. Cuanto más potente sea su hardware y menor tamaño tenga la biblioteca de NinjaScripts de su instalación, menor será el tiempo de espera en la compilación.
Ejecución de la estrategia
Una vez que ha finalizado el asistente y la estrategia está compilada, ya podemos utilizarla en la plataforma como cualquier otra estrategia NinjaScript.
Por ejemplo, podemos activarla desde la pestaña Strategies del ControlCenter, también podemos cargarla en un chart, o bien testearla y optimizarla desde el Strategy Analyzer.
En la siguiente imagen se recoge un test realizado en el Strategy Analyzer con el fin de comprobar que la estrategia funciona correctamente y que las entradas y salidas se realizan donde deben, que es en las barras de cruce de las dos medias.
Aviso de riesgo !
Este artículo tiene una finalidad didáctica y divulgativa acerca de sus contenidos. En ningún caso se pretende ofrecer al lector un vehículo de inversión o especulación mediante las pautas que aquí se explican, y se desaconseja encarecidamente usar los ejemplos propuestos en un entorno productivo con cuenta real. Observe la claúsula de riesgo a pie de página y el Aviso Legal.
10 respuestas a «Sistema Cruce Medias»
Agradecido por tan detallada explicación, aunque yo opero en Ninja7 la explicación es perfectamente entendible para mi caso, solo que tengo una consulta, que pasa o como haría si después de realizar el cruce las medias, en vez de entrar en el cruce quiero que entre en el retroceso del precio solo si toca a la media lenta, como colocaría la condición para ello, muchas gracias.
Hola Arturo. Se me ocurre lo siguiente para cruce al alza y orden de compra:
El StrategyBuilder comprueba y ejecuta el código de condiciones+acciones en cada barra.
Si en la barra n se cumplen las dos condiciones ejecutará la acción y colocará la orden limitada.
Pero si el precio no retrocede en la barra n+1 hasta la media lenta, la orden no será filled y se cancelará al término de la barra.
En la siguiente barra n+1 volverá a ejecutarse el código de condiciones+acciones y aquí ya no hay cruce de medias y no se enviará la orden.
Si quieres que la orden se vaya enviando en cada barra hasta el filled, tendrías que evaluar el cruce de medias no sólo en la barra actual sino en un lookback.
Cuando crees la condición para el cruce de medias, en el centro del diálogo, donde pone ‘Look back period’ introduce el número de barras hacia atrás en que quieres buscar el cruce.
Añade también otra condición para entrar sólo si estás FLAT; en el diálogo elige:
[Strategy.Current market position] EQUALS [Strategy.Market position.Flat].
A medida que vayas avanzando te surgirán más problemas. Por ejemplo, cómo impedir reentradas en señales fallidas. Si el lookback es de 30, entras en
la barra n+5 y te salta el stop-loss en la n+20, a lo mejor ya no quieres volver a entrar en esa señal. Conseguirlo con el strategy builder sería más complicado. Tendrías que usar variables.
Cuando se llega a un determinado nivel de complejidad lo más aconsejable es pasar a la programación a medida desde el Editor de código.
Saludos
Hola de nuevo yo por acá, le comento; lo que hice fue ponerle un umbral para las Emas para que cumplan la condición de no entrar en lateral y en cualquier momento, aparte de ello también le puse que cumpla un número mínimo de volumen de contratos, hasta ahora los resultados van a favor, seguiré testeando, tengo una curiosidad, quiero entender porque me sugirió utilizar [Strategy.Current market position] EQUALS [Strategy.Market position.Flat] es una condición que se aplica tanto para largos como para cortos?
Gracias.
Hola Arturo. Esa sugerencia es una condición que puedes añadir para entrar sólo cuando no tienes posición abierta; es decir, cuando estás Flat. Simplifica mucho el diseño de sistemas.
En caso contrario conllevaría hacer SCALE-IN (si la señal es a favor de la posición actual, lo que provocaría añadir más contratos a la posición abierta. Y siempre que en la configuración hayas permitido más de una entrada por dirección), o bien hacer REVERSE (si la señal es en contra de la posición actual, lo que provocaría cerrar la posición corriente y abrir una nueva en sentido contrario).
Muchas gracias por darte el tiempo en contestar mi consulta, efectivamente tengo otra condición para evitar las entradas no deseadas, esa condición esta ligada al volumen de contratos, voy a poner en práctica tu sugerencia y comentaré como me fue.
Muchas gracias.
Amigo buenas noches, disculpa la molestia pero tengo 3 preguntas y no se si puedas ayudarme, súper agradecido de todas formas, 1era: hay forma de programar para identificar un lateral y que la estrategia no me ejecute ninguna entrada Durante el lateral ? 2da: según mi sistema programé una entrada cuya salida se ejecuta cuando una vela cierra por debajo o por encima de una ema determinada según sea El caso largo o corto, a esto le coloque un stop loss de una cantidad específica,si la salida se da por el cierre de vela en la ema, el stop me queda abierto así ya no haya una entrada activa en el mercado, como puedo hacer para que al cerrarse la posición según mi sistema el stop loss desaparezca ? 3era: yo puedo programar (sets) distintos tipos de entradas en largo dentro de la misma estrategia ? Hay limitaciones ? Gracias de antemano por tu ayuda
Hola Luis, sobre tus preguntas:
Saludos
Muchas gracias amigo por tus respuestas, ya voy a intentarlo
Buen día amigo, disculpa la molestia pero sabrás cómo puedo colocarle un breakeven a una estrategia ?
No hay una manera sencilla de hacerlo con el StrategyBuilder. Podrías usar una variable para informar del recorrido a favor para mover el stoploss a breakeven, y cuando se alcance ese valor enviar la orden stoploss al precio de entrada. Para calcular el recorrido tendrías que editar el código ya que el StrategyBuilder no admite operaciones aritméticas, sólo comparaciones. Consulta el artículo de Variables en el StrategyBuilder donde hay un ejemplo de edición de código.
Y después tendrías que enviar el stoploss al precio de entrada con una orden Exit. Pero entonces tendrías que prescindir de la gestión automática del SetStopLoss y gestionar tú los stoploss con órdenes Exit. Mucha complicación.
Lo más aconsejable es programar todo el sistema desde el editor y prescindir del StrategyBuilder. Sabiendo programar, colocar un breakeven es sencillo.