Filtro de precio con el Strategy Wizard del Ninja

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
Responder
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Filtro de precio con el Strategy Wizard del Ninja

Mensaje 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.
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje 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
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje 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!
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje 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 :?
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje por Jose »

¿Hay alguna forma de que para girar ponga una sola orden de dos contratos en vez de dos órdenes de uno?

wave
Mensajes: 210
Registrado: 26 Nov 2007 23:21
Ubicación: Londres

Mensaje 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
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje 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 :wink:
wave
Mensajes: 210
Registrado: 26 Nov 2007 23:21
Ubicación: Londres

Mensaje 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
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje 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?
wave
Mensajes: 210
Registrado: 26 Nov 2007 23:21
Ubicación: Londres

Mensaje 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
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje por Jose »

claro, yo sólo entro con stops y limitadas :?
Avatar de Usuario
Jose
Mensajes: 805
Registrado: 22 Mar 2006 14:01

Mensaje por Jose »

resultó ser un fallo del ninja, con la nueva versión está solucionado :D
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Software”