Página 1 de 1
Filtro de precio con el Strategy Wizard del Ninja
Publicado: 12 Jun 2008 11:26
por Jose
Llevo unos días intentando ponerle un filtro de precio por puntos a un sistema con el strategy wizard y no hay manera, siempre me da errores. Creo que es demasiado fácil como para que haya que aprender a programar para hacerlo, debería bastar con el wizard. Por desgracia, casi no he encontrado información sobre el strategy wizard, ni en la ayuda ni en los foros de NT.
Para verlo más fácilmente, lo he probado sobre un sistema muy sencillo: cruce de la cotización sobre la media simple. Cuando una barra cierra por encima de la media, se pone orden de compra stop a un precio igual al cierre +2 puntos, y si la barra cierra por debajo se pone stop de venta a cierre -2.
Más abajo explico cómo he creado el sistema, por si alguien se da cuenta de dónde está el fallo, pero antes voy a decir qué problema tiene al ejecutarse.
Imaginemos que estamos aplicando este sistema sobre el dax y que ahora estamos cortos, con la cotización por debajo de la media. Si la última barra del dax cierra por encima de la media, el ninja pone dos órdenes de compra en stop: una para cerrar el corto y otra para abrir un largo. Hasta aquí funciona correctamente, y si se ejecuta la orden no hay ningún problema.
El fallo viene si no se llega al stop de compra y la siguiente barra cierra otra vez por debajo de la media, por lo que deberían anularse las dos órdenes y seguir vendidos. Sin embargo, el ninja sólo anula la última orden que puso, la de abrir un largo, dejando en el mercado la de cerrar corto, y a partir de ahí ya se fastidia todo.
Yo preferiría que en vez de poner dos órdenes, una para cerrar y otra para abrir, pusiera una sola orden de dos contratos, como en el Vchart. Tampoco me molesta que ponga dos, pero lo que no entiendo es porqué una de las órdenes no se anula. Si alguien pudiera decirme dónde está el fallo le estaría muy agradecido.
Publicado: 12 Jun 2008 11:29
por Jose
Así es como he hecho el sistema:
En el strategy wizard pongo el único parámetro (input) de la estrategia, que será el periodo de la media simple.
En la primera pestaña de “Condición – Acción”, pongo que cuando el cierre de la barra cruce al alza a la media, se cree una variable “Variable 0” que sea igual al cierre de la barra + 2 puntos (hago el offset por precio). Ése será el precio del stop de compra.
En la siguiente pestaña pongo que siempre que el cierre de una barra esté por encima de la media se introduzca una orden en stop de compra a un precio = Variable 0.
En las pestañas 3 y 4 pongo las condiciones-acciones equivalentes para vender cuando una barra cierre de la media con un stop de venta cierre – 2 puntos.
// This namespace holds all strategies and is required. Do not change it.
namespace NinjaTrader.Strategy
{
/// <summary>
/// Cruce de una media simple con el precio con filtro = 2 puntos
/// </summary>
[Description("Cruce de una media simple con el precio con filtro = 2 puntos")]
public class Crucemediaprecioconfiltro : Strategy
{
#region Variables
// Wizard generated variables
private int periodo = 10; // Default setting for Periodo
// User defined variables (add any user defined variables below)
#endregion
/// <summary>
/// This method is used to configure the strategy and is called once before any strategy method is called.
/// </summary>
protected override void Initialize()
{
Add(SMA(Periodo));
Add(SMA(Periodo));
Add(SMA(Periodo));
Add(SMA(Periodo));
CalculateOnBarClose = true;
}
/// <summary>
/// Called on each bar update event (incoming tick)
/// </summary>
protected override void OnBarUpdate()
{
// Condition set 1
if (CrossAbove(Close, SMA(Periodo), 1))
{
Variable0 = Close[0] + 2;
}
// Condition set 2
if (Close[0] > SMA(Periodo)[0])
{
EnterLongStop(DefaultQuantity, Variable0, "");
}
// Condition set 3
if (CrossBelow(Close, SMA(Periodo), 1))
{
Variable0 = Close[0] + -2;
}
// Condition set 4
if (Close[0] < SMA(Periodo)[0])
{
EnterShortStop(DefaultQuantity, Variable0, "");
}
}
#region Properties
[Description("Periodo media simple")]
[Category("Parameters")]
public int Periodo
{
get { return periodo; }
set { periodo = Math.Max(1, value); }
}
#endregion
}
}
#region Wizard settings, neither change nor remove
Publicado: 12 Jun 2008 12:05
por bolsa1
Modifica las instrucciones de compra y venta:
EnterLongStop(0,false,DefaultQuantity, Variable0, "");
y
EnterShortStop(0,false,DefaultQuantity, Variable0, "");
el cero es para identificar la línea temporal principal (en este caso, la única que existe), y el "false" es para cancelar la orden en caso de que no se cumpla en esta misma barra.. a ver si te sirve.
Saludos!
Publicado: 13 Jun 2008 12:45
por Jose
gracias bolsa1. A ver si no lo he hecho mal: le doy a "Unlock Code", cambio esas líneas que dices y después compilo, me sale que la estrategia ha sido generada con éxito.
Sin embargo sigue pasando lo mismo, si no se llega al stop y después una barra cierra al lado contrario de la media, en vez de anularse las dos órdenes se anula sólo una

Publicado: 13 Jun 2008 12:56
por Jose
¿Hay alguna forma de que para girar ponga una sola orden de dos contratos en vez de dos órdenes de uno?
Publicado: 16 Jun 2008 10:47
por wave
Jose,
creo que lo que tienes que hacer es cancelar las ordenes antes de enviar una nueva. Mira el siguiente link
http://www.ninjatrader-support.com/Help ... ancelOrder
Antes del EnterLongStop y EnterShortStop pondria un Cancel.
S2
Publicado: 16 Jun 2008 11:56
por Jose
Gracias Wave. He intentado modificarlo poniendo
CancelOrder; encima de
EnterLongStop(0,false,DefaultQuantity, Variable0, ""); pero no me deja compilarlo.
Creo que tendré que estudiarme un poco lo de programar

Publicado: 16 Jun 2008 12:05
por wave
Pero seguramente es porque no le has puesto lo que quieres cancelar.
Esto es lo complicado de las ordenes limitadas. No se como lo hace el VC pero lo que por un lado es flexibilidad en el NT tambien puede ser complejo.
Mira el ejemplo:
protected override void OnBarUpdate()
{
// Submit an entry order at the low of a bar
if (myEntryOrder == null)
{
myEntryOrder = EnterLongLimit(0, true, 1, Low[0], "Long Entry");
barNumberOfOrder = CurrentBar;
}
// If more than 5 bars has elapsed, cancel the entry order
if (CurrentBar > barNumberOfOrder + 5)
CancelOrder(myEntryOrder);
}
Ahi le da un nombre a la orden de entrada = myEntryOrder y luego el cancel es contra esta.
Lo que podrias hacer es darle un nombre a las largas otro a las cortas y poner 2 CancelOrder antes de la orden.
Creo que tambien hay un CancelAll pero me parece que se usa algo distinto.
Dime si esto te funciona.
S2
Publicado: 16 Jun 2008 14:22
por Jose
me costó un poco, porque para que no me diera errores tuve que meter un par de líneas como en el ejemplo y no sabía muy bien dónde ponerlas, jeje.
Sigue sin funcionar. La cosa es que se cancela correctamente la orden de abrir largo o corto, pero no la de cerrar posición, que no la tengo puesta en el sistema sino que la pone el NT.
Voy a probar a hacer el sistema introduciendo una orden específica para cerrar las posiciones.
Me gusta más el Vchart, que pone una sola orden. Si por ejemplo el sistema está comprado de un dax y hay que girar a corto, se introduce una orden de venta de 2 contratos, en vez de poner una orden para cerrar el largo y otra para abrir el corto... ¿hay alguna forma de hacerlo así en el NT?
Publicado: 16 Jun 2008 14:49
por wave
Es que si entras a mercado no tienes esos problemas y la gestion es mas facil. El tema son las ordenes limitadas ya que tal vez tu las quieras ir dejando abiertas y esa flexibilidad dificulta su gestion.
s2
Publicado: 16 Jun 2008 15:53
por Jose
claro, yo sólo entro con stops y limitadas

Publicado: 07 Ago 2008 09:57
por Jose
resultó ser un fallo del ninja, con la nueva versión está solucionado
