Para resumir el funcionamiento, pongo el ejemplo que viene en la ayuda, e intentaré explicarlo. Puede que me pierda algo, por eso invito a los que programen en NT a que me corrijan o complementen la información.
Código: Seleccionar todo
// Asumimos que esta estrategia se ejecutará sobre un gráfico ES 12-06 con barras de 1 minuto
protected override void Initialize()
{
// Añadimos una segunda línea temporal de 5 minutos: Cuyo índice "BarsInProgress" será "1". La línea principal es la del gráfico (1 minuto), será Barsinprogress=0
Add(PeriodType.Minute, 5);
}
protected override void OnBarUpdate()
{
// Comprobamos a qué línea temporal está llamando el método "OnBarUpdate()"
if (BarsInProgress == 0)
{
// Un valor de cero representa la línea principal del gráfico ES 12-06, en este caso 1 minuto
// Aquí pondríamos las intrucciones a ejecutar sobre las barras de 1 minuto
}
else if (BarsInProgress == 1)
{
// Un valor de uno representa la línea secundaria, en este caso 5 minutos
// Aquí pondríamos las intrucciones a ejecutar sobre las barras de 5 minutos
}
}
http://www.ninjatrader-support.com/vb/s ... rid&t=6652
Este es el ejemplo que ponen:
Código: Seleccionar todo
protected override void Initialize()
{
/* Añadimos una segunda línea temporal al sistema.
MUY IMPORTANTE: debe ser menor que la principal
Nota: En este ejemplo partiremos de que el gráfico principal es de 5 minutos, y ahora añadiremos una línea temporal de 1 minuto */
Add(PeriodType.Minute, 1);
// Añadimos dos indicadores EMA
Add(EMA(Fast));
Add(EMA(Slow));
/* Ajustamos el color de los indicadores */
EMA(Fast).Plots[0].Pen.Color = Color.Blue;
EMA(Slow).Plots[0].Pen.Color = Color.Green;
CalculateOnBarClose = true;
}
/// <summary>
/// Called on each bar update event (incoming tick)
/// </summary>
protected override void OnBarUpdate()
{
/* Cuando se llama a "OnBarUpdate()" siempre se llamará primero a la primera línea temporal, la principal, seguida de las otras series secundarias.
En este caso el orden sería el siguiente:
12:00PM 5min
12:00PM 1min
12:01PM 1min
12:02PM 1min
12:03PM 1min
12:04PM 1min
12:05PM 5min
12:05PM 1min
Cuando OnBarUpdate() sea llamado por la línea de tiempo principal (5min en este ejemplo), haz lo siguiente:*/
if (BarsInProgress == 0)
{
// Cuando la media rápida cruce al alza a la lenta... lanza la orden para ser ejecutada en la línea de tiempo secundaria:
if (CrossAbove(EMA(Fast), EMA(Slow), 1))
{
/* La condición de entrada es lanzada en la línea de tiempo primaria, pero es enviada y ejecutada en la secundaria (1 minuto)
La forma de determinar sobre que serie se lanzará la orden es por el primer parámetro: 0 = línea primaria, 1 = secundaria, 2 = terciaria, etc. */
EnterLong(1, 1, "Long: 1min");
}
// Si se cruza a la baja, entra en corto en la segunda línea de tiempo (1 minuto)
else if (CrossBelow(EMA(Fast), EMA(Slow), 1))
{
/* Exáctamente lo mismo de antes */
EnterShort(1, 1, "Short: 1min");
}
}
// Cuando OnBarUpdate() sea llamado por la línea de tiempo secundaria, no hagas nada.
else
{
return;
}
}
La clave para lanzar la orden sobre la segunda línea de tiempo es la instrucción:
EnterLong(1, 1, "Long: 1min");
Si fuera "0" la lanzaría sobre la linea de tiempo principal. Para órdenes limitadas se utiliza la nomenclatura:
EnterLongLimit(int barsInProgressIndex, bool liveUntilCancelled, int quantity, double limitPrice, string signalName)
de forma que para comprar un contrato limitado al mínimo de la barra, a ejecutar sobre la segunda línea temporal, sería:
EnterLongLimit(1, true, 1, Low[0], "Venta Limitada");
.................
A ver si mejoramos de esta forma los backtests.
Saludos!
Edito: Gracias por el enlace, Wave!