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.

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.

26 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

Deja un comentario

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

  Acepto la política de privacidad