Categorías
Strategy Builder

Strategy Builder

Tutorial acerca del Strategy Builder, explicación de las propiedades y pasos a seguir para crear sistemas automáticos.

Asistente para crear sistemas automáticos sin escribir código

En NinjaTrader los sistemas automáticos de trading se llaman estrategias. El modo más versátil y potente de crear estrategias es mediante programación a medida en lenguaje C#, escribiendo el código desde el NinjaScript Editor. Pero si no sabemos programar podemos utilizar el asistente llamado Strategy Builder para construir estrategias sin escribir código. Este asistente se abre desde el menú New / Strategy Builder.

Abrir Strategy Builder

Microsoft.NET y NinjaScript

NinjaTrader está basado en el framework Microsoft .NET que es una librería de clases de Microsoft que permite a los programadores realizar cualquier tarea en el entorno Windows. NinjaTrader por su parte ofrece una librería de clases especializada en trading con muchos tipos públicos y accesibles a los programadores, conocida como NinjaScript.
Las clases de .NET y de NinjaScript se pueden combinar mediante programación en lenguaje C# para dotar a la aplicación de cualquier funcionalidad imaginable: tipos de barra a medida, estilos de chart personalizados, nuevas herramientas de dibujo, comunicación con redes sociales, servicios web, bases de datos propias, Add-Ons, etc.
Un Add-On es una aplicación Windows embebida en NinjaTrader. Cualquier herramienta que se pueda programar en Windows con el framework .NET – independientemente de su aspecto y funcionalidad – se puede incluir en NinjaTrader.
También podemos personalizar el aspecto y comportamiento de la parte pública de algunas herramientas propias de NinjaTrader como el Market Analyzer, el DOM o el Strategy Analyzer.

A continuación explico los apartados del Strategy Builder. Algunos pueden resultar complejos o contener mucha información técnica, y refiero al link de la ayuda oficial para encontrar todos los datos al respecto.

Tras abrir el asistente, en la lista de la izquierda aparecen todos los pasos. Para ir a cualquiera de ellos sólo hay que pulsar sobre él. Pulsando en el botón Next se pasaría al siguiente paso de la lista.


Welcome

El primer paso del asistente del Strategy Builder es la bienvenida. En el campo Strategy se muestra una lista desplegable con todas las estrategias que hayamos creado con anterioridad desde el asistente. Si es la primera vez que usamos el asistente el desplegable estará vacío. Por defecto aparece la opción de New strategy … para crear una estrategia nueva.

Strategy Builder Welcome

Todas las estrategias de la lista desplegable pueden editarse en cualquier momento. Pero si alguna de ellas se modificara desde el NinjaScript Editor – para incluir código personalizado por ejemplo – ya no podría abrirse desde el Strategy Builder y desaparecería de esa lista. En este tutorial no vamos a ver el NinjaScript Editor ya que es un editor para escribir en lenguaje de programación C#.

Pulsando el botón Next pasamos al siguiente apartado General.


General

En el campo Name introduciremos un nombre para la estrategia, que debe comenzar por una letra mayúscula y no puede contener caracteres especiales. En el campo Description podemos incluir una descripción breve del sistema. Pulsamos en Next para ir al siguiente apartado Default Properties.

Strategy Builder General

Default Properties

En este apartado estableceremos el funcionamiento por defecto de la estrategia. Sin embargo, todos estos valores son configurables por el usuario cuando ejecute la estrategia. Si el subapartado More properties no está desplegado, haz click en el triángulo a su izquierda. En la imagen se muestran los valores por defecto. A continuación explico cada una de las propiedades del Strategy Builder, pero si no quiere entrar en detalles puede ir al siguiente paso Additional Data.

Strategy Builder Default Properties

Calculate

Es un desplegable para elegir la frecuencia con la que se ejecuta el método OnBarUpdate. Hay tres modos posibles.

  1. On bar close: hasta que la barra corriente no cierra, el código funcional de la estrategia no se ejecuta. Si estuviéramos trabajando en timeframe de 1 hora, el código del método OnBarUpdate sólo se ejecutaría una vez por cada hora.
  2. On each tick: es el modo más intensivo ya que el código se ejecutaría con cada 1-tick entrante. En productos muy negociados y en determinados momentos de la sesión se pueden recibir cientos de ticks por segundo y cada uno de ellos provocaría la ejecución del código. Con el hardware actual esto no debe preocuparnos, incluso si tuviéramos varios sistemas On each tick corriendo simultáneamente.
  3. On price change: el código funcional de la estrategia se ejecuta sólo si se recibe un precio diferente del anterior. Es menos intensivo que On each tick.

Entries per direction

Informa sobre el número máximo de órdenes permitido por posición abierta. Si por ejemplo vale 2, puedo entrar largo y más adelante volver a comprar con otra orden nueva antes de cerrar la primera. Pero ya no podría enviar una tercera orden de compra. Se refiere a las veces que se entra en la misma dirección, no al tamaño o volumen de esas entradas que puede ser cualquiera. A esta técnica de ir aumentando progresivamente la posición también se le llama scale-in.

Entry Handling

Admite dos valores: AllEntries y UniqueEntries.

  • AllEntries: el número máximo de órdenes de entrada que se pueden enviar para aumentar la posición viene dado por EntriesPerDirection. No importa el nombre de las órdenes.
  • UniqueEntries: la restricción se aplica por nombre de orden. Si por ejemplo EntriesPerDirection vale 1 y he entrado largo con una orden a la que he llamado ComprarSoporte, mientras no cierre esta orden no podré comprar con otra llamada igual, pero sí podré abrir un nuevo largo con otra orden de compra de diferente nombre, como por ejemplo ComprarSoporte99. De hecho podré abrir todos los largos que quiera siempre que el nombre de la orden de entrada sea único. Sin embargo si EntryHandling se hubiera establecido a AllEntries, sólo podría tener un largo abierto sin importar su nombre.

Exit on session close

Si al llegar al fin de la sesión estamos abiertos, la posición se cierra automáticamente y se cancelan las órdenes pendientes.

Exit on session close seconds

Informa de los segundos que deben faltar antes del cierre de sesión, para cerrar automáticamente la posición abierta. Sólo es útil si se marca la opción Exit on session close. Su utilidad es establecer un margen temporal de seguridad para no esperar al cierre del mercado para cerrar la posición abierta.

Fill limit orders on touch

Si se marca, las órdenes limitadas serán filled cuando el precio las toque. Esto sólo afecta al backtesting; en tiempo y cuenta reales las órdenes limitadas serán filled cuando les llegue su turno en la cola del libro de órdenes.

Maximum bars look back

Afecta a la cantidad de datos que se guardan en memoria y eventualmente al rendimiento. Si la estrategia no necesita preguntar por valores de barras pasadas más allá de 256 barras previas, es conveniente establecer el valor del parámetro a 256, y si no, a Infinite.

Minimum bars required

Número de barras históricas que deben existir antes de que la estrategia comience a funcionar.

Order Fill Resolution

Modo en que se produce el filled histórico de las órdenes intrabarra. Sólo afecta al backtesting y por extensión al procesamiento de barras pasadas, no reales.

Order Fill Resolution

Supongamos que una estrategia envía una orden de compra a mercado al cierre de la barra A; en histórico el filled teórico se logrará en el precio Open de la siguiente barra B que se corresponde con el 2.789,50 en la imagen – en real puede que no sea filled en el Open, ya que dependerá de la liquidez en el lado Ask del libro de órdenes y de lo rápido que llegue la orden al Exchange-.

Inmediatamente después del filled se envía una bracket de salida compuesta por una orden de take-profit a 4 ticks por encima de la entrada, en el 2.790,50, y una orden de stop-loss a 2 ticks por debajo en el 2.789,00.

Al cierre de la barra B las dos órdenes de salida habría logrado el filled, pero la cuestión es saber cuál de las dos lo hace en primer lugar. En tiempo real será la primera que haya sido alcanzada por el precio. Pero para averiguar en histórico qué orden de salida logró el filled en primer lugar hay que analizar cada tick de esa barra hasta encontrar el primer tick que toca el precio de alguna de las dos órdenes de salida.

Para analizar en detalle los ticks intrabarra hay que elegir la opción Order fill resolution = High. Esta opción obliga a cargar el histórico de 1-tick lo que repercutirá en el rendimiento del backtest. La otra opción Order fill resolution = Standard (Fastest) interpreta el filled en función de los precios OHLC de la barra; es menos precisa que la otra, pero a cambio mucho más rápida ya que no precisa de cargar todo el histórico de 1-tick. Puede encontrar más información en la ayuda oficial del programa: Understanding Historical Fill Processing

Realtime Error Handling

Establece cómo debe comportarse la estrategia cuando una orden es rechazada. Puedes encontrar más información en la siguiente página de la ayuda oficial: Real-time Error Handling.

Slippage

Deslizamiento expresado en ticks que sufrirán las órdenes históricas en su filled. Su finalidad es penalizar los resultados del backtesting para aproximarlos a la realidad.

Start Behavior

Establece el comportamiento de la estrategia en el arranque, basado en el estado de la cuenta. Puede encontrar más información de las distintas opciones en la página oficial Syncing Account Positions.

Stops and Targets

En el mismo instante en que se consigue un filled de una orden de entrada, se puede enviar automáticamente una bracket de salida compuesta por una orden de take-profit más otra de stop-loss. No es necesario que se ejecute el método OnBarUpdate (el filled de una orden de entrada no depende de cuándo se ejecute el código. Desde código – ya sea generado por el Strategy Builder o escrito a medida por nosotros – sólo se pueden enviar órdenes pero no decidir cuándo serán filled).

Las dos opciones de gestión de estas órdenes bracket de salida son:

  • ByStrategyPosition: sólo hay una orden bracket por todo el tamaño de la posición. Si por ejemplo una orden de entrada de 10 contratos termina teniendo tres filleds parciales de 3, 5 y 2 contratos, sólo habrá una orden de take-profit de 10 contratos y otra orden de stop-loss de 10 contratos.
  • PerEntryExecution: en este caso, cada filled parcial tendrá su correspondiente bracket.

Time in force

Establece qué hacer con las órdenes en espera al llegar al fin de la sesión. Una orden en espera puede ser por ejemplo una orden limitada de compra para entrar largo.

  • Day: las órdenes en espera se cancelarán al cerrar la sesión.
  • GTC: las órdenes no se cancelan nunca, salvo por petición expresa del usuario.
  • GTD: las órdenes se cancelan cuando se llega a la fecha determinada.

Trace orders

Si se marca, la estrategia escribirá en la ventana Output – a la que se accede desde New / NinjaScript Output – mensajes de log referentes al envío y gestión de órdenes.


Additional Data

En este paso podemos añadir series de barras adicionales a aquélla para la que se ejecutará la estrategia. Así conseguimos construir estrategias multi-timeframe (cuando todas las series son del mismo instrumento pero con diferente timeframe) o multi-instrumento (las series pueden ser de varios instrumentos y con iguales o diferentes timeframes). Pulsando en add se abre una pequeña ventana para seleccionar el instrumento y timeframe de la nueva serie de barras a añadir.

Strategy Builder Additional Data

En el subapartado Custom Series podemos añadir series personalizadas para que cada barra guarde un dato calculado. Sobre esas series personalizadas podríamos aplicar indicadores para extraer información operativa.


Inputs y Variables

Aquí creamos los parámetros de entrada para el sistema que podrá personalizar el usuario cuando cargue la estrategia. Por ejemplo los períodos para las medias, los ticks de beneficio y pérdida, los intervalos de tiempo prohibidos para operar, etc.

Si lo necesitáramos para nuestros cálculos, también podríamos añadir variables.

Strategy Builder Inputs & Variables

En el artículo Sistema Cruce Medias encontrará un ejemplo de cómo crear parámetros de entrada para el período de unas medias.

En el artículo Variables en el Strategy Builder encontrará un ejemplo detallado para crear variables.


Condiciones y Acciones

Este apartado es fundamental ya que es donde se proporciona la lógica funcional a la estrategia. En el bloque superior es donde se indican las condiciones que deben cumplirse para ejecutar las acciones correspondiente que se configuran en el bloque inferior. Por ejemplo una condición podría ser “… cuando se crucen dos medias al alza …” y su acción podría ser “… comprar a mercado …”.

Strategy Builder Conditions & Actions

En el artículo Sistema Cruce Medias encontrará un ejemplo de cómo crear condiciones y acciones para detectar los cruces de dos medias y actuar en consecuencia.


Stops y Targets

Pulsando en add se abre un diálogo para establecer las órdenes de take-profit y de stop-loss. Hay diferentes modalidades para elegir. Las más elementales son Profit target para establecer un beneficio a un número fijo de ticks con respecto a la entrada, Stop loss para establecer una pérdida máxima en ticks con respecto a la entrada, y Trailing stop para establecer un stop loss de tipo trailing que se va ajustando con respecto al movimiento del precio.

Strategy Builder Stops & Targets

Trailing Stop. Ejemplo y configuración.

A continuación detallo un ejemplo de configuración de un trailing-stop.
Vamos a suponer que nuestro sistema trabaja a cierre de barra, en cuyo caso el precio de la orden de stop-loss se recalculará al cierre de barra. Y si el nuevo precio calculado resulta más ventajoso que el existente, entonces se actualizará el precio de la orden de stop-loss.
Para recalcular el precio del stop-loss se usa como precio de referencia el High o el Low de la barra recién cerrada, dependiendo de si la entrada es compra o venta.
Por ejemplo si se ha comprado un contrato de un instrumento cuyo TickSize es la unidad y con un trail stop-loss fijado en 10 ticks. Y tras el cierre de la barra corriente el High queda en 2.710, se recalcularía el stop-loss a 2.700. Si el stop-loss actual está por debajo de 2.700 se subiría automáticamente a 2.700. Si no, se dejaría sin modificar la orden de stop-loss al precio que estuviera.
En cambio, si el sistema funciona al Tick, el precio de la orden de stop-loss se recalcula con cada tick entrante. Si el nuevo precio calculado es más ventajoso que el existente, se actualiza la orden de stop-loss. Para recalcular el precio del stop-loss se usa como precio de referencia el Close del tick entrante. Siguiendo con el ejemplo anterior, si se ha comprado un contrato en 2710 con un trail stop-loss fijado en 10 ticks; el stop-loss quedaría en 2.700. Si el siguiente tick entra con un precio de 2.711 el stop-loss se subiría automáticamente a 2.701.
En el video siguiente comparto los pasos para configurar un trailing-stop como el que acabo de explicar.

Finish

Pulsando en el botón Finish se concluye la asistencia del Strategy Builder. Acto seguido la estrategia se compilará automáticamente, y en unos segundos estará disponible para utilizarse.

Strategy Builder Finish

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.

55 respuestas a «Strategy Builder»

Hola gerardo, no necesitas añadir un campo específico para el número de contratos en el Strategy Builder. Ya viene implementado por defecto.
Si cargas la estrategia en el Strategy Analyzer o desde el Control Center/pestaña Strategies, y vas abajo a «Order Properties» y en el desplegable «Set order quantity» seleccionas «Default quantity», aparecerá un nuevo campo «Default Quantity» para que introduzcas el número de contratos para las órdenes.
Saludos

Hola gracias por responder, la pregunta puntual va dirigida a que no sé cómo colocar los valores al usar el trailing stop, en el strategy builder ya q no logro hacer que el stop siga al precio, gracias

Buenas tardes:

Quisiera saber como programar el target profit para una estrategia en la que entro con dos contratos y quiero salir al llegar a los 4 y los 8 ticks.

Muchas gracias

Hola Felipe,
El modo más rápido sería tener dos órdenes de entrada con distinto nombre, una para trades con TP=4ticks y otra con TP=8ticks.
Por ejemplo: EntradaTP4 y EntradaTP8.
Desde el StrategyBuilder puedes hacerlo.
El parámetro Entries per direction tienes que ponerlo = 2.
Stops and Targets = Per entry execution
En el Actions, cada vez que se den las condiciones para entrar lo haces dos veces; una para EntradaTP4 y otra para EntradaTP8.
Al configurar los Profits y StopLoss lo haces para cada una de las órdenes por separado, rellenando correctamente la etiqueta ‘From Entry Signal’ para que cada salida esté vinculada a su entrada por el nombre.
Saludos

Las salidas sí me las vincula, pero solo me hace una entrada.
He puesto dos entradas en sets separados y he probado también en el mismo set, pero solo me coge una entrada.
Los parámetros por defecto también están como me has dicho: «El parámetro Entries per direction tienes que ponerlo = 2. Stops and Targets = Per entry execution»

Hola Gerardo, arriba en el artículo, en el apartado «Stops y Targets» se enumeran las diferentes opciones para configurar de manera estándar el target y el stop, y una de ellas es mediante un «Trailing stop». Sólo tienes que configurar los ticks que quieres para el trailing.
De todos modos, he ampliado el contenido de la sección Stops y Targets para incluir un ejemplo de cómo configurar un Trailing-Stop. Espero que te ayude. Saludos.

Muy buenas,

una pregunta, ¿sabes si con el strategy builder se puede ordenar a un sistema que compre o venda si un indicador pasa de color rojo a azul o viceversa.?

Y por otro lado, ¿se puede hacer un sistema de divergencias con el estrategy builder entre un indicador con una sola línea y el precio?

Muchas gracias de antemano

Hola Miguel,

sobre la primera pregunta, la respuesta es que sí. El único requisito es que el indicador no oculte esa información y se pueda preguntar desde fuera si para una barra determinada está rojo o azul.

Sobre la segunda pregunta, lamentablemente con el Strategy Builder no sería posible. Los sistemas de divergencias se basan en la geometría de las curvas (normalmente entre un precio y un indicador). Para determinar la geometría hay que calcular pívots y almacenarlos en colecciones especiales (Listas o Diccionarios); y este almacenamiento no se puede conseguir con el Strategy Builder.
Para construir un buen sistema de divergencias habría que programar a medida la estrategia.

Saludos

Muchas gracias por la respuesta.

Eso me imaginaba. El indicador que pasa de rojo a azul no sólo tiene oculta esa información, sino que ni siquiera aparece listado cuando abres el ninja script para crear un indicador.

Efectivamente tendré que empezar a pensar en meterme con el asunto de la programación.

Aprovecho para comentarte otra cuestión. Quiero crear estrategias usando order flow, concretamente con el delta acumulado. Como dijiste, si tienen la información oculta o no aparece en la lista de indicadores del ninja script, no puedo ordenar al strategy builder nada de eso. Por ejemplo el order flow cumulative delta que trae el ninja trader 8 en la versión lifetime es uno de esos que tienen todo oculto.
Mi pregunta es, ¿se puede programar desde el ninja script editor de ninja trader 8 asuntos sobre order flow, delta acumulado, bid ask…?.

Un ejemplo sería:

– compra o vende cuando el delta acumulado de la barra actual sea x veces más grande o más pequeño en porcentaje que el de la barra anterior.

Gracias de antemano, un saludo

Hola Miguel Ángel,

efectivamente, todos los indicadores protegidos ocultan su código y no se listan en el NinjaScript Editor.
Todos los Plots de un indicador son públicos y están en la colección Values, de modo que aunque no conozcas el nombre exacto del Plot siempre puedes obtener su valor en el código a través de la sintaxis Values[i]. Pero tendrías que programar un poco para conseguirlo. Comparando los valores extraídos con las lecturas que te da el DataBox en el chart, puedes identificar cada Plot con su Values[i] y entonces sí podrías incluirlo en tu estrategia.

Sobre el OrderFlow, sí pueden utilizarse los indicadores de ninja para el orderflow en estrategias. El problema del Strategy Builder es que está muy limitado para incluir personalizaciones, como la que comentas del porcentaje de
la barra anterior. Y la mejor opción es programar en el NinjaScript Editor, donde ya puedes hacer cualquier cosa. El sistema que propones sí puede progamarse sin problemas en el editor; en el builder sería más complicado aunque
también podría lograrse.

Saludos

Muy buenas,

acabo de leerme el articulo sobre sistemas semiautomáticos y e ha quedado más claro aquello que te preguntaba.

Mucha gracias y un saludo.

Buenos dias,

Antes que nada agradecerte por el material que publicas ya que me ha ayudado a iniciarme desde cero en este mundo.

Estoy tratando de realizar una estrategia usando las barras heikin ashi, comprando cuando esta por encima de una media y vender cuando este por debajo de la media, es decir, siempre estar en una direccion de mercado pero al momento de cierre de la orden creo que me toma el cierre de la vela con los parametros de las velas heikin ashi y no los reales del precio, como debo configurar la orden para que tome los datos del precio real.

Gracias a ti Eduardo por participar.

Efectivamente, todas las referencias al OHLC de la barra será a precios calculados, que pueden no coincidir con la realidad (p.ej. te puede dibujar un High al que nunca se llegó en el intervalo temporal de esa barra).

No es algo que haya verificado pero puedes intentar estas dos posibilidades. Aunque también depende de cómo esté programada la estrategia.

1.- En el Strategy Analyzer selecciona ‘Order fill resolution’ = «High» en el apartado ‘Historical fill processing’.
(Esto penaliza el rendimiento al tener que cargar el histórico de 1-tick)

2.- Si con lo anterior no consigues el filled correcto, prueba lo siguiente:
En ‘Tools/Options/Market data’ marca la opción [X] ‘Show Tick Replay’.
Después ve al Strategy Analyzer, en Data Series marca [X] ‘Tick Replay’ y ‘Order fill resolution’ = «High».
(Esto penaliza el rendimiento al tener que cargar el histórico del Time&Sales – y dependiendo del instrumento no todos los proveedores de datos lo tienen.)

En ambos casos tienes que estar conectado (al menos una vez, para poder descargar esos históricos).

Buenos días,

Muy buena la forma tan detallada como explicas cada función del Strategy Builder. Felicitaciones por compartir tus conocimientos a los nuevos traders.

Una consulta, te agradecería por favor si me puedes explicar como puedo configurar en el Strategy Builder para hacer que a cierta hora (ejemplo: 2:15pm) de cada dia de la semana (solo de lunes a viernes) se valide si el precio sube o baja X cantidad de Ticks. En el caso de que el valor llegase a subir a los X ticks ejecutar una orden de compra, y si llegase a bajar los X ticks, entonces ejecutar una orden de venta.

Quedo atento a tus comentarios.

Hola Edinson,

el StrategyBuilder es una herramienta generalista de introducción al desarrollo de sistemas. En el momento que se precisan de ajustes más particulares puede ser incapaz de resolver el problema.

Si el código necesita cálculos aritméticos, a fecha de hoy no puede resolverse desde el Strategy Builder, como es tu caso donde habría que calcular la diferencia entre el precio corriente y el precio de referencia donde se inició el seguimiento del movimiento.

Con el Strategy Builder podemos establecer mediante parámetros de entrada, la hora ‘Desde y la hora ‘Hasta’ de la ventana temporal para el seguimiento, así como obtener el precio de referencia en el instante ‘Desde’ y compararlo con el precio corriente.

Pero quedaría por resolver el cálculo de la diferencia entre los dos precios para saber si se alcanza el umbral requerido para disparar las órdenes. Para salvar este último escollo hay que editar el código que genera el Strategy Builder.

Cuando lo tenga listo compartiré un video con la solución completa.

Hola, buen día

Mil gracias, estaré muy atento a tu video para ver como se puede editar el Strategy Builder para cuando se requiere cálculos aritméticos. Espero ver pronto ese video, ya que me será de mucha ayuda para crear otras estrategias y que también le servirá a otros traders que visitan este magnifico blog.

En vez del video y para aprovechar y dotar de más contenido al blog, he añadido dos artículos más acerca del Strategy Builder. Uno sobre cómo crear intervalos horarios. Y otro para trabajar con variables y editar código. Espero que te resulten útiles Edinson, y en general a todos los lectores interesados. Saludos.

Hola, muchas gracias por todo lo que publicas en relación a Ninjatrader. Quisiera saber cómo se puede aumentar el numero de Condiciones y Acciones en Ninjatrader 7, por sobre los 10 «sets» que aparecen. Gracias

De nada Esteban. En NinjaTrader 7 parece que existe ese límite de 10 Sets. En el tema de la ayuda «Operations/Strategy Wizard/Wizard Screens», en el apartado «Understanding the Conditions and Actions screen» dicen lo siguiente:
«Via the wizard, you can have up to ten different condition sets with related actions. If you require more than ten condition sets, then you should self code your strategy via the NinjaScript Editor».
Por lo tanto, si se quieren añadir más condiciones y acciones habría que editar el código. Pero en tal caso, la estrategia ya no podría abrirse desde el asistente y todas las modificaciones posteriores tendrían que hacerse desde el NinjaScript Editor, escribiendo código.

hola como estas?

tengo un problema con mi estrategia automatica la cual pongo una orden limitada de compra por debajo del precio pero al activar la estrategia me dice que mi orden ha sido rechazada por que no ha podido ser llenada o algo así, pero no tiene sentido por que al querer hacer una compra es logico que la orden limitada de compra se ponga por abajo del precio, me puedes ayudar con eso por favor

Hola Johan,
hay muchas causas que pueden provocar el rechazo de órdenes. Lo primero es averiguar en qué barra ocurre el error para analizar el escenario concreto. Justo antes de cada envío de orden añade en el código un Print(CurrentBar) y así, en la ventana Output, quedará escrito en qué barra ha fallado. Y ya tendrás una pista para empezar a buscar la causa del error.
También en el método OnStateChange, dentro del bloque IF State.Defaults, añade TraceOrders = True. Esto activa el log de órdenes y vuelca más información en la ventana Output, que te puede ayudar a encontrar el motivo del error.
Ayuda del TraceOrders

Dependiendo del error que encuentres, a veces puede resultar útil analizar un único tipo de barras: o históricas, o en tiempo real. Para procesar sólo barras en tiempo real escribe como primeras líneas de código en el OnBarUpdate lo siguiente:
if(State==State.Historical)
return;
Y si no quieres procesar tiempo real, sólo histórico, sería:
if(State==State.Realtime)
return;
Ayuda del State

Hola buenos días. Tengo un problema con mi estrategia. La idea es que el precio una vez cruce una media en un tick compré o venda según el caso, pero está esperando que cierre la barra o compra mucho después del cruce. Cómo configurar para que esta condición se cumpla.

Hola Franklin, si quieres que la estrategia trabaje tick a tick, tienes que establecer la propiedad Calculate = OnEachTick. Para tu caso concreto también te serviría con Calculate = OnPriceChange. Consulta las opciones de la propiedad Calculate.

Franklin un gusto saludarte tengo la misma inquietud quisiera que abra una compra o una venta al superar por 1 tick o al tocar una media, haz logrado resolver esto? solo lo logro al cierre de cada barra pero a veces esto supera por mucho la media.

Hola que tal? agradecerte por tus respuestas, cuando uno analiza la estrategia en ninjaTrader y obtiene los diferentes resultados en la optimización, que es lo que tenemos que tomar en cuenta de esos resultados? o que resultado toma importancia para decir que el bot podría tener una buena expectativa.
Muchas gracias.

De entre todos, el Profit Factor es el más determinante.
Pero aparte, mejor que una optimización, hay que hacer un Walk Forward Optimization para tener una idea más aproximada de cómo se puede comportar el sistema en el futuro. Saludos

Hola, muy bueno tu articulo, quisiera saber si existe una forma de que se coloque una orden automática cuando el precio toque una media móvil? he tratado de hacerlo y no lo logro al toque solo al cierre de la barra.

Hola Gustavo, cuando ejecutes la estrategia en el Strategy Analyzer prueba lo siguiente:

  1. La propiedad Calculate hay que establecerla a On each tick.
  2. En el apartado Historical fill processing‘ asigna estos valores:
    • Order fill resolution = High. La explicación la puedes consultar aquí.
    • Fill limit orders on touch: marca esta casilla si quieres que las órdenes limitadas sean filled al tocarlas el precio, en caso contrario, el precio tendría que superarlas.

Espero que te sirva. Saludos.

GRACIAS POR ESTE ARTICULO DE VERDAD ME HA SACADO DE UNA DUDA, PERO TENGO OTRA PREGUNTA, EN EL VIDEO QUE HICISTE SOBRE EL TRAILING STOP NO PUSISTE TARGET ES ASI QUE SE USA O SOLO LO HICISTE A MODO DE PRUEBA.

El Trailing-Stop es un stoploss dinámico que se va moviendo a medida que el precio se mueve a favor de la entrada. En esencia es una orden de pérdidas aunque dará ganancias si se mueve más allá del precio de entrada, y el mercado se gira y lo toca. Si quieres un target de beneficio propiamente dicho, tendrías que enviar también una orden de take-profit.

si eso lo entiendo lo que pasa es que tengo una estrategia y le puse un trailing stop pero cada vez que se ejecuta una operacion me salta un mensaje de error y desactiva la estrategia por eso pregunto, porque quiero saber la forma correcta de programarlo o configurarlo para que no pase eso, mi ejecuta primero una orden limite y cuando el precio vuelve entra a mercado pero no se porque el trailing stop no me funciona.

Para identificar la causa del error establece el parámetro TraceOrders a True para que se vuelquen los mensajes a la ventana Output. Y cuando ejecutes la estrategia en el Analyzer ten siempre abierta la ventana Output. Si hay errores, se imprimirán en el Output, y te dará pistas para investigar.
Mi consejo es que crees un sistema muy simple por ejemplo un cruce de medias. Con un takeprofit muy lejano para que el trailing tengo espacio de sobra para moverse y puedas comprobar que funciona bien consultando el Output. Y lo pruebas con la conexión ‘Simulated Data Feed’ donde puedes dirigir el movimiento del precio y así comprobar que el trailing se mueve bien.

Saludos ¿Como configuro mis entradas al 61.8% del retrocso fibonacci?
¿Como determino que ya estoy en una tendencia? hay algún indicador?

Hola Dagnia,
sobre la tendencia puedes consultar este artículo del indicador PowerTrend. Pero por supuesto no es infalible y en períodos laterales entregará muchas señales falsas.
Para entrar a un % de retroceso, primero habría que delimitar el impulso previo. Necesitas dos «picos» A y B. Una vez conocida la «recta AB» puedes saber en qué precio se encuentra el x% de retroceso y colocar ahí tu orden limitada de entrada. Necesitarías un indicador que hiciera todo el trabajo: que calculara los impulsos (tramo entre A y B) y el precio para el % de fibo que quieres y que se introduciría en el indicador por parámetro. Así la estrategia sólo tiene que leer a qué precio está el retroceso esperado y colocar ahí la orden. No conozco ningún indicador que haga esta tarea y tendrías que programarlo tú. No sería sencillo.
Por otro lado, para trading discrecional puedes dibujar un fibo en un chart y ordenar una entrada en el porcentaje que quieras. Sin programar nada.
Saludos

hola cordial saludo;

muchas gracias por cada aporte que realizan a la comunidad es muy grato aprendo un montón cada aporte, les escribo por que tengo una inquietud y es que realice una estrategia con el buldier pero no se como hacer para agregar 2 botones al panel de ninja una que diga activar largos y otro que diga activar cortos(click para activarlo y click para desactivarlo) he visto que algunas estrategias lo tienen y la verdad he buscado como hacerlo pero no logro encontrar como, si pudieran poner un correo para enviar imágenes estaría estupendo, mil gracias

Hola Freddy,

en NinjaTrader se pueden agregar botones a un elemento WPF, como el chart, la barra de menús del chart y en general cualquier otro elemento que pueda ser contenedor.
Si eres programador C# y conoces de WPF (Windows Presentation Fundation) no te costaría hacerlo. Pero si no, sería una tarea muy compleja y tendrías que recurrir a alguna plantilla de código. En el foro de soporte de NinjaTrader hay varios hilos que hablan de cómo añadir botones a un chart, y en los que se ha compartido el código fuente. Ese código podrías copiarlo y adaptarlo a tu estrategia.

Desde el Strategy Builder no se pueden añadir automáticamente botones ni ningún otro elemento WPF. Tendrías que editar el código generado por el Strategy Builder e incluir tú mismo el código para insertar los botones en el chart, y además modificar la lógica del programa para que reaccionara a la pulsación de los botones.

Para tu problema concreto de activar largos o cortos, un «apaño» muy rudimentario que quizás pudiera servirte sería construir dos estrategias independientes, una sólo para compras y otra sólo para ventas. Y activarlas/desactivarlas desde su checkbox en la pestaña Strategies.

Saludos

Mil gracias, de todos a los que he preguntado eres el único que me respondió muy amablemente, la verdad no soy programador C# por lo que me tocará recurrir a una plantilla de código en el foro de ninjatrader, seguiré con mi investigación enserio muchas muchas gracias si me pudieras recomendar algún otro sitio donde investigar te agradecería.

De nada Freddy. Realmente el mejor sitio es el foro de NinjaTrader. Busca por «Add Button Chart» o términos semejantes y encontrarás código para insertar botones en el chart. Después, para añadir la lógica ya tendrás que saber de programación C# + NinjaScript. Saludos

Hola que tal, he creado una estrategia interesante, buenos resultados y otros colegas les gustaría probarla, como puedo limitar los tiempos, por así decirlo… que solo puedan usar la estrategia por 10 días, como prueba, eso es posible? Como podría limitar ese tiempo?

Hola Jesús,
La respuesta a tu pregunta daría para escribir mucho sobre el tema y lamentablemente una respuesta de comentario no es lo más apropiado, pero intentaré ayudarte. Hay un gran cantidad de artículos, blogs, libros, etc donde se habla largo y tendido de las protecciones de código en .NET.

Simplificando al máximo tu problema, necesitas resolver dos escenarios:

  1. Proteger tu código fuente mediante algún tipo de «encriptación» (en .NET se llama «ofuscación»).

    Si el código de tu estrategia es visible, simplemente haciendo copy+paste cualquiera podría crear una estrategia idéntica a la tuya y utilizarla libremente sin ninguna restricción. A efectos prácticos sería como fotocopiar un libro.

    En .NET la manera de proteger el código es mediante la ofuscación. Hay ofuscadores de pago, y otros open source (uno de los más reconocidos es ConfuserEx). Para usar alguno open source hay que saber algo/mucho de programación. La opción más práctica sería usar el que viene con NinjaTrader que es de pago (100$/año). Aquí más información Ayuda oficial de NT8.

    Si no quieres gastar dinero puedes optar por no proteger el código y simplemente compilarlo como .dll. La estrategia en el fichero .dll no será visible, pero cualquier con algo de conocimiento la podrá decompilar fácilmente y acceder al código fuente. La compilación como .dll NO es una protección.

  2. Permitir la ejecución del código durante un período de tiempo autorizado.

    Esto se consigue con las licencias. NinjaTrader incluye un gestor de licencias pero es sólo para los partners. Tienes que ser un Vendor autorizado para poder crear licencias en los indicadores/estrategias que distribuyas. Obviamente, si tu código no está protegido (ofuscado) y es accesible, cualquiera podría eliminar el chequeo de la licencia y no serviría para nada. Para distribuir un código con licencia, tienes que haberlo ofuscado antes.

    Si no eres Vendor y para tu caso concreto, lo más sencillo sería añadir un bloque de código como el siguiente, al comienzo del OnBarUpdate (es algo muy simple y no es la mejor manera de codificarlo, pero cumpliría su función de no permitir la ejecución más allá del 31 de agosto de 2020, por ejemplo):
    DateTime expiracion = new DateTime(2020, 08, 31);
    if( DateTime.Now > expiracion )
    return;

    Ese chequeo se puede saltar cambiando la hora del pc. Para evitar la ejecución en tiempo real de la estrategia se puede usar este otro código que comprueba la fecha de la barra, no la del pc:
    DateTime expiracion = new DateTime(2020, 08, 31);
    if( Time[0] > expiracion )
    return;

    Después ofusca el código y ya lo puedes distribuir. Si no ofuscas el código y sólo lo compilas como dll y lo distribuyes, cualquier con un decompilador podrá ver el código fuente, hacer un copy+paste y quitar el chequeo de fecha.

Espero que te sirva.
Saludos

Hola de Nuevo, tengo dos curiosidades:
1.- Que opciones se pueden usar para permitir que el sistema automático opere con más de un contrato?
2.- Existe la forma de que si mueva de manera manual en el chart en plena operativa el target o stop loss definidos ya en el Strategy Builder no regrese al cambio de barra a su posición inicial?
Gracias, saludos a la distancia.

Hola Arturo,

  1. En el diálogo de carga de la estrategia, en el último apartado Order properties, hay un campo llamado Set order quantity. Abre el desplegable y elige Default quantity. Entonces aparece un nuevo campo llamado Default quantity donde podrás indicar el número de contratos para las órdenes.
  2. No es posible. Los métodos de envío de orden que utiliza el Strategy Builder son llamados con cada nueva barra. Por ejemplo si mueves una orden pendiente, al cerrar la barra se vuelve a ejecutar el OnBarUpdate así como los envíos de las órdenes al precio que estuvieran calculados en el código.

Saludos

Buen dia, saludos desde Honduras

Antes que nada quisiera agradecerte por el tiempo que dedicas a instruirnos.

Mi consulta es la siguiente;

Tengo una estrategia en NinjaScript que me genera conflicto.
Dicha estrategia tiene sus respectivos SL/PT pero también la tengo programada con órdenes de salida. El conflicto se me genera cuando el precio de SL/PT coincide con el precio en la condición de salida generando una DOBLE ORDEN la cual me provoca pérdidas, ya que la orden SL/PT se ejecuta pero también se ejecuta otra orden en la misma dirección.
Hay alguna manera de solventar este inconveniente o deberé elegir eliminar mis condiciones de salida?
Cabe mencionar que dichas condiciones de salida me ayudan a reducir las pérdidas significativamente.
En espera de tu pronta atención al respecto,

¡Gracias anticipadas!

Hola Mauricio,
sí, eso te va a dar problemas: el mezclar los SL/TP (puestos con llamadas a los métodos SetStopLoss/SetProfitTarget dentro del método OnStateChange) con llamadas a métodos Exit para salir, dentro del método OnBarUpdate.
Lo que puedes hacer es que cuando se dé la condición de salida dentro del OnBarUpdate, llamar nuevamente al método SetStopLoss/SetProfitTarget, pero con un nuevo precio de salida, para así mover la orden. De este modo no necesitarías llamar a ningún método Exit.
Saludos.

Buen dia,
Gracias por tu oportuna respuesta.
Creo haber entendido el mensaje, sin embargo no me queda claro como parametrizarlo en el Strategy Builder.
Podrias brindarme una instruccion mas detallada o quizas un ejemplo de como lo harias tu?

Muchas Gracias!

Pensé que habías programado la estrategia. Lo que te proponía sólo se puede hacer desde código. Tendrías que editar el código que genera el StrategyBuilder e introducir los cambios. Pero entonces ya no podrás volver a abrir la estrategia desde el Builder.
Aquí está la ayuda de los métodos Set: SetProfitTarget y SetStopLoss. Pero hay que saber programar, aunque sea poco. Dentro de los IF’s que tengas para las condiciones de salida, tendrás que incluir los Set’s correspondientes. Siento no poder ayudarte más, pero se sale de lo que es el StrategyBuilder y se entra en el campo de la programación a medida, que es otro mundo.
Saludos

Hola que tal? yo de nuevo por aquí, es posible programar entradas con respecto a la formación de una vela anterior en Strategy Builder, por ejemplo, si la vela tiene cuerpo completo entrar al 38% del retroceso de la vela o si la la mecha de la vela no supera el 23% de su cuerpo entrar al 61%, no sé si me explico 😀 … saludos gracias.

Hola Arturo,

para lograrlo tendrías que usar variables y editar el código para añadir los cálculos aritméticos.
En el artículo de Variables en el Strategy Builder hay un ejemplo que te puede servir como guía para emplear variables y editar el código para incluir cálculos.

Pero a medida que el sistema precisa de más cálculos o adquiere complejidad, el asistente te va a servir de poco y es mejor ir a la programación a medida.
Lo que buscas sería muy sencillo de resolver con programación a medida. Te pongo un ejemplo de código que también te serviría para incluirlo en el código del Strategy Builder al editarlo.

Ejemplo de entrada corta al 61% del retroceso en una barra bajista y siempre que la mecha no sea mayor que el 23% del cuerpo:

if( Close[0] < Open[0] ) // barra bajista
{
double cuerpo = Open[0] - Close[0];
double mecha = Close[0] - Low[0];

if( mecha <= 0.23 * cuerpo )
{
// Precio de entrada al 61% del retroceso del rango:
double precioteorico = Low[0] + ( High[0] - Low[0] ) * 0.61;
double precioreal = Instrument.MasterInstrument.RoundToTickSize( precioteorico );
EnterShortLimit( precioreal );
}
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  Acepto la política de privacidad