Duda con StopLoss

Foro dedicado a esta excelente herramienta de desarrollo e implementación de sistemas de trading
Responder
JKK
Mensajes: 10
Registrado: 04 Nov 2009 20:29

Duda con StopLoss

Mensaje por JKK »

Hola,
Soy nuevo con el NinjaTrader y me he encontrado con un comportamiento que no sé ni explicar ni manejar, y agradecería alguna sugerencia ...
1) Creo una estrategia cualquiera que abra posiciones según se crucen dos EMA's con la única condición de que position.MarketPosition == MarketPosition.Flat y además se programa un SetStopLoss.
2) Abro un chart de un instrumento cualquiera, p.ej. ES y lanzo la estrategia.
3) En determinado momento se dan las condiciones y la estrategia abre una posición (p.ej.) larga. Se genera la orden de compra a mercado, y pasa a filled.
4) Inmediatamente se lanza la orden de stop loss a un determinado precio y queda pendiente en estado de "accepted".
5) La pestaña "Strategies" muestra la estrategia activa con el importe "unrealized" según va variando el precio de mercado.
6) La pestaña "Positions" muestra mi posición y el mismo importe anterior se va actualizando en la columna "PnL".
Hasta aquí todo bien ...
Ahora viene el problema...
7) Cierro la estrategia en el gráfico y la orden de stop loss se cancela. Sin embargo la posición sigue abierta...
8) Abro el "Chart Trader" y cierro la posición o lo hago directamente en la pestaña "Positions" con "Close Position"
9) Si ahora vuelvo a cargar la estrategia, me lanza una orden de stop loss como si tuviese la posición abierta cuando en realidad no la hay. Esta orden de stop loss hace que position.MarketPosition no sea "Flat" y no deja que la estrategia trabaje como debe. La única forma de que no haga esto es evitar que el gráfico cargue las velas donde "se cree" que abrió la posición, dándole menos antiguedad al gráfico...

A que se debe este comportamiento ?

Un saludo a todos y desde ya muchas gracias.
JKK
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Duda con StopLoss

Mensaje por cls »

Hola JKK,

si mezclas ejecución automática con ejecución discrecional desincronizas la posición entre la estrategia y la cuenta.
La propiedad Position.MarketPosition se refiere a la posición de la estrategia y no a la cuenta.

Busca en la ayuda: Ninjascript / Developing Custom Strategies / Strategy Position vs Account Position.

S2
JKK
Mensajes: 10
Registrado: 04 Nov 2009 20:29

Re: Duda con StopLoss

Mensaje por JKK »

Hola cls,

La cuestión me queda clarísima. He de estudiar cómo manejar esto si se me presenta en el entorno real.

Muchas gracias cls
JKK
JKK
Mensajes: 10
Registrado: 04 Nov 2009 20:29

Re: Duda con StopLoss

Mensaje por JKK »

Hola cls,
He creado un truco para poder volver a resincronizar el strategy.position con el account.position.
El tema es que si por error cierro una estrategia mientras tengo una posición abierta me interesa que al volver a lanzarla procese todos los OnBarUpdate() desde el principio para que al final la posición virtual de la estrategia coincida con la posición en que quedó la cuenta y quede sincronizada.
Pero si por alguna razón he cerrado la posición abierta por la estrategia manualmente y he dejado la cuenta Flat, me interesa que al volver a lanzar la estrategia no procese ningun evento OnBarUpdate() y llegue a la vela actual sin hacer nada.
El truco consiste en definir una variable parametrizable que puede valer 1 u otro valor. Con 1 procesará las velas y con otro valor pasará de ellas. La segunda parte del truco consiste en que en el evento OnBarUpdate() evaluo el timestamp del Bar entrante y lo comparo con el reloj del sistema. Si es una vela antigua y la variable de control vale 1 proceso la estrategia, de lo contrario paso de ella. Cuando el timestamp de la vela entrante es igual a la del sistema, trabaja normal :

private int doOrders = 1; //1 = procesa órdenes , otro valor las inhibe

protected override void OnBarUpdate()
{
if (ToDay(Time[0]) < ToDay(DateTime.Today)){
//este código se ejecuta al cargar la estrategia con las velas de dias anteriores...
if( currPosition == "Flat" && DoOrders == 1 ){
//procesar la estrategia
}
}else{
if (ToTime(Time[0]) < ToTime(DateTime.Now)){
//este código se ejecuta al cargar la estrategia con las velas del dia actual pero de hora anterior a la actual...
if( currPosition == "Flat" && DoOrders == 1 ){
//procesar la estrategia
}
}else{
//este código se ejecuta cada vez que entra una vela en tiempo real (timestamp = hora sistema)
if( currPosition == "Flat" ){
//procesar la estrategia
}
}
}
}


public int DoOrders
{
get { return doOrders; }
set { doOrders = Math.Max(0, value); }
}


Puede parecer una chorrada pero sin esta posibilidad la resincronización la veo complicada...

Un saludo
JKK
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Duda con StopLoss

Mensaje por cls »

JKK escribió: Pero si por alguna razón he cerrado la posición abierta por la estrategia manualmente y he dejado la cuenta Flat, me interesa que al volver a lanzar la estrategia no procese ningun evento OnBarUpdate() y llegue a la vela actual sin hacer nada.
Como sólo quieres procesar el tiempo real hay una manera más sencilla:

Código: Seleccionar todo

if ( Historical )
return;
S2

JKK
Mensajes: 10
Registrado: 04 Nov 2009 20:29

Re: Duda con StopLoss

Mensaje por JKK »

Vaya , sí que me falta conocer la referencia del lenguaje.

Muchas gracias
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Ninja Trader”