Entradas NT
Entradas NT
Hola.
Tengo la misma estrategia corriendo con 2 tipos de órdenes de entrada distintas.
La condición es: If ( Close[1]<Open [1] && Close [0]> Open[0] ) && ...
{
enterlong
}
Estoy diciéndole que si la barra anterior es roja y la actual es verde: Comprar. (Pretendo que entre solo en la 1ª barra verde de una onda)
Con EnterLongLimit(Close[0]); cumple la condición.
Pero con EnterLong(); a veces entra al close de la 2ª barra verde si las demás condiciones de entrada se cumplen en la 2ª barra verde.
Esta es la única diferencia entre las 2 estrategias.
¿A que puede deberse?
Gracias.
Tengo la misma estrategia corriendo con 2 tipos de órdenes de entrada distintas.
La condición es: If ( Close[1]<Open [1] && Close [0]> Open[0] ) && ...
{
enterlong
}
Estoy diciéndole que si la barra anterior es roja y la actual es verde: Comprar. (Pretendo que entre solo en la 1ª barra verde de una onda)
Con EnterLongLimit(Close[0]); cumple la condición.
Pero con EnterLong(); a veces entra al close de la 2ª barra verde si las demás condiciones de entrada se cumplen en la 2ª barra verde.
Esta es la única diferencia entre las 2 estrategias.
¿A que puede deberse?
Gracias.
Re: Entradas NT
Hola,
si trabajas a cierre de barra (CalculateOnBarClose == true) todas las órdenes a mercado enviadas dentro del OnBarUpdate con EnterLong o EnterShort se enviarán efectivamente en el cierre de barra y serán filled en el Open de la siguiente.
Las limitadas serán filled cuando el precio las toque (o las supere) y las Stop serán enviadas cuando el precio las toque (y en backtesting también filled a ese precio salvo que indiques deslizamiento).
si trabajas a cierre de barra (CalculateOnBarClose == true) todas las órdenes a mercado enviadas dentro del OnBarUpdate con EnterLong o EnterShort se enviarán efectivamente en el cierre de barra y serán filled en el Open de la siguiente.
Las limitadas serán filled cuando el precio las toque (o las supere) y las Stop serán enviadas cuando el precio las toque (y en backtesting también filled a ese precio salvo que indiques deslizamiento).
Re: Entradas NT
Gracias cls.
Lo que me está sucediendo con EnterLong (ídem con Short) es que cuando se cumplen todas las condiciones de entrada en la 2ª vela verde, la estrategia entra en el close de esa 2ª vela verde, contraviniendo en estas ocasiones la condición ( Close[1]<Open [1] && Close [0]> Open[0] ), que debería impedir que entrase en esa 2ª vela alcista.
Con las "EnterLimit" siempre cumple la condición indicada.
Efectivamente tengo CalculateOnBarClose == true
Lo que me está sucediendo con EnterLong (ídem con Short) es que cuando se cumplen todas las condiciones de entrada en la 2ª vela verde, la estrategia entra en el close de esa 2ª vela verde, contraviniendo en estas ocasiones la condición ( Close[1]<Open [1] && Close [0]> Open[0] ), que debería impedir que entrase en esa 2ª vela alcista.
Con las "EnterLimit" siempre cumple la condición indicada.
Efectivamente tengo CalculateOnBarClose == true
Re: Entradas NT
Hola agtlgtar,agtlgtar escribió:Gracias cls.
Lo que me está sucediendo con EnterLong (ídem con Short) es que cuando se cumplen todas las condiciones de entrada en la 2ª vela verde, la estrategia entra en el close de esa 2ª vela verde, contraviniendo en estas ocasiones la condición ( Close[1]<Open [1] && Close [0]> Open[0] ), que debería impedir que entrase en esa 2ª vela alcista.
Con las "EnterLimit" siempre cumple la condición indicada.
Efectivamente tengo CalculateOnBarClose == true
Close[1] < Open[1] : estás chequeando que la barra anterior sea bajista.
Close[0] > Open[0]: estás chequeando que la barra corriente sea alcista.
si se dan esas dos condiciones más las otras que tengas en el if se ejecutará el código.
Algo estará mal escrito en la condición. Pega todo el código de la condición a ver.
Re: Entradas NT
Gracias cls.
Adjunto un pantallazo donde se puede ver lo que hablamos.
He marcado una operación.
Dos operaciones antes se vende al cierre aprox. de la vela roja [0]. Ok
Una operación antes de la señalada se vende al open de la vela siguiente a [0]. Todo ok incluído draw.
En la operación marcada: Se vende al Close de la vela siguiente a [0]. Y dibuja drawtriangle también ahí. Ambas cosas en contra del código.
Index 2 está bajista todo el rato. Index 1 se pone bajista a 10.09.45 (como puedes ver, justo el momento en que se dibuja drawtriangle y se ejecuta la venta.)
También puedes ver operaciones en el pantallazo donde se dibujan 2 drawtriangle en la misma vela, o 1 en la 1ª y otra en la 2ª vela, etc. Todo ello parece en contra del código.
En el ejemplo de NT en help para multi time con CCI, los períodos de los bar object son 1,3 y 1 min. De esa forma los cierres coinciden en el tiempo. Si los períodos fueran 2,3 y 5 min (o con range, o con renko) no tienen porque coincidir. Veo que muchos de estos errores se producen cuando index 1 ó 2 no está en la dirección adecuada, cuando index 0 si lo está. En ocasiones index 1 ó 2 se ponen a favor al close de una vela suya y en ese momento se entra (aunque sea a mitad de una vela de index 0).
protected override void Initialize()
{
CalculateOnBarClose = true;
TraceOrders = true;
AddRenko("$EURUSD",4,MarketDataType.Last);
AddRenko("$EURUSD",5,MarketDataType.Last);
}
protected override void OnBarUpdate()
{
if (CurrentBars[0] <= BarsRequired || CurrentBars[1] <= BarsRequired || CurrentBars[2] <= BarsRequired)
return;
if (BarsInProgress == 0)
{
if ( (Closes [2][0]< (HMA(BarsArray[2],25)[0] ))
&& (Closes [1][0]< (HMA(BarsArray[1],25)[0] ))
&& ( (this.Close [0]< Open[0]) && (this.Close[1]>Open [1] ) ) )
{
DrawTriangleDown ("2"+CurrentBar, true, 0, High[0]+10 * TickSize, Color.Red);
Print("nt1es2");
EnterShort("nt1es2");
entry = Close[0];
}
if (Position.MarketPosition == MarketPosition.Flat)
{
SetProfitTarget("nt1es2",CalculationMode.Ticks, profittargetticks);
}
else if (Position.MarketPosition == MarketPosition.Short)
{
if ( Close[0]>=HMA(25)[0])
{
Print("nt1sp2");
SetProfitTarget("nt1es2",CalculationMode.Price,Close[0]);
}
}
if (Position.MarketPosition == MarketPosition.Flat)
{
SetStopLoss("nt1es2",CalculationMode.Ticks, stoplossticks,true);
}
else if (Position.MarketPosition == MarketPosition.Short)
{
if (Close[0]>= (entry+9*TickSize))
{
Print("nt1ss2");
SetStopLoss("nt1es2",CalculationMode.Price,Close[0],true);
}
}
}
}
De momento no me deja adjuntar pantallazo. Sigo intentándolo.
Adjunto un pantallazo donde se puede ver lo que hablamos.
He marcado una operación.
Dos operaciones antes se vende al cierre aprox. de la vela roja [0]. Ok
Una operación antes de la señalada se vende al open de la vela siguiente a [0]. Todo ok incluído draw.
En la operación marcada: Se vende al Close de la vela siguiente a [0]. Y dibuja drawtriangle también ahí. Ambas cosas en contra del código.
Index 2 está bajista todo el rato. Index 1 se pone bajista a 10.09.45 (como puedes ver, justo el momento en que se dibuja drawtriangle y se ejecuta la venta.)
También puedes ver operaciones en el pantallazo donde se dibujan 2 drawtriangle en la misma vela, o 1 en la 1ª y otra en la 2ª vela, etc. Todo ello parece en contra del código.
En el ejemplo de NT en help para multi time con CCI, los períodos de los bar object son 1,3 y 1 min. De esa forma los cierres coinciden en el tiempo. Si los períodos fueran 2,3 y 5 min (o con range, o con renko) no tienen porque coincidir. Veo que muchos de estos errores se producen cuando index 1 ó 2 no está en la dirección adecuada, cuando index 0 si lo está. En ocasiones index 1 ó 2 se ponen a favor al close de una vela suya y en ese momento se entra (aunque sea a mitad de una vela de index 0).
protected override void Initialize()
{
CalculateOnBarClose = true;
TraceOrders = true;
AddRenko("$EURUSD",4,MarketDataType.Last);
AddRenko("$EURUSD",5,MarketDataType.Last);
}
protected override void OnBarUpdate()
{
if (CurrentBars[0] <= BarsRequired || CurrentBars[1] <= BarsRequired || CurrentBars[2] <= BarsRequired)
return;
if (BarsInProgress == 0)
{
if ( (Closes [2][0]< (HMA(BarsArray[2],25)[0] ))
&& (Closes [1][0]< (HMA(BarsArray[1],25)[0] ))
&& ( (this.Close [0]< Open[0]) && (this.Close[1]>Open [1] ) ) )
{
DrawTriangleDown ("2"+CurrentBar, true, 0, High[0]+10 * TickSize, Color.Red);
Print("nt1es2");
EnterShort("nt1es2");
entry = Close[0];
}
if (Position.MarketPosition == MarketPosition.Flat)
{
SetProfitTarget("nt1es2",CalculationMode.Ticks, profittargetticks);
}
else if (Position.MarketPosition == MarketPosition.Short)
{
if ( Close[0]>=HMA(25)[0])
{
Print("nt1sp2");
SetProfitTarget("nt1es2",CalculationMode.Price,Close[0]);
}
}
if (Position.MarketPosition == MarketPosition.Flat)
{
SetStopLoss("nt1es2",CalculationMode.Ticks, stoplossticks,true);
}
else if (Position.MarketPosition == MarketPosition.Short)
{
if (Close[0]>= (entry+9*TickSize))
{
Print("nt1ss2");
SetStopLoss("nt1es2",CalculationMode.Price,Close[0],true);
}
}
}
}
De momento no me deja adjuntar pantallazo. Sigo intentándolo.
Re: Entradas NT
Tanto clickar al final se ha enviado 2 veces (no busquéis diferencias entre los 2 pantallazos que no las hay!!!!).
- Adjuntos
-
- Pantallazo nt1.doc
- (121.5 KiB) Descargado 155 veces
-
- Pantallazo nt1.doc
- (121.5 KiB) Descargado 173 veces
Re: Entradas NT
Buenas,
tienes errores de concepto en estas sentencias:
SetProfitTarget("nt1es2",CalculationMode.Price,Close[0]);
SetStopLoss("nt1es2",CalculationMode.Price,Close[0],true);
No tiene sentido que las hayas puesto en el OBU y al mismo precio que el Close corriente. Si p.ej. la barra corriente cierra en 2100 no voy a poner un stoploss en 2100 ó un takeprofit en 2100, y si la siguiente barra abre con gap ya tienes todas las papeletas para que te queden órdenes sin cerrar o que hacen cosas extrañas.
En vez de usar los métodos SetProfitTarget y SetStopLoss usa los métodos Exit para salir. Al menos hasta que tengas claro cómo se programan las salidas.
Como ya te dije debes empezar por cosas sencillas para ir asimilando los fundamentos y poco a poco aumentar la complejidad. Si de entrada pretendes programar una estrategia multitimeframe sin tener los fundamentos bien asentados sólo conseguirás que las cosas no te salgan y te desmotives.
Además usas barras renko que como sabrás no son reales y en los backtestings SIEMPRE arrojan resultados falsos.
S2
tienes errores de concepto en estas sentencias:
SetProfitTarget("nt1es2",CalculationMode.Price,Close[0]);
SetStopLoss("nt1es2",CalculationMode.Price,Close[0],true);
No tiene sentido que las hayas puesto en el OBU y al mismo precio que el Close corriente. Si p.ej. la barra corriente cierra en 2100 no voy a poner un stoploss en 2100 ó un takeprofit en 2100, y si la siguiente barra abre con gap ya tienes todas las papeletas para que te queden órdenes sin cerrar o que hacen cosas extrañas.
En vez de usar los métodos SetProfitTarget y SetStopLoss usa los métodos Exit para salir. Al menos hasta que tengas claro cómo se programan las salidas.
Como ya te dije debes empezar por cosas sencillas para ir asimilando los fundamentos y poco a poco aumentar la complejidad. Si de entrada pretendes programar una estrategia multitimeframe sin tener los fundamentos bien asentados sólo conseguirás que las cosas no te salgan y te desmotives.
Además usas barras renko que como sabrás no son reales y en los backtestings SIEMPRE arrojan resultados falsos.
S2
Re: Entradas NT
Gracias cls. Estoy con ello.
Si te ha gustado este hilo del Foro, ¡compártelo en redes!