Orden enterlonglimit o enterlongstop al llegar un precio.

Foro dedicado a esta excelente herramienta de desarrollo e implementación de sistemas de trading
Responder
tibetillo
Mensajes: 8
Registrado: 28 Feb 2016 16:30

Orden enterlonglimit o enterlongstop al llegar un precio.

Mensaje por tibetillo »

Buenas estoy intentando que dado una condición , incorpore una orden de entrada de stop o limit cuando llegue a un punto pero no lo consigo con un simple bucle while y dentro una condición. No sé que estoy haciendo mal.

I=0
While i<1
If (close(0) == precio concreto)
Enterlongstop (precioconcreto -1)
I = i+1


Es decir si llega a un punto mete una orden en otro punto que puede que el precio llegue y ejecute la orden o no y no lo haga.

Gracias.
tibetillo
Mensajes: 8
Registrado: 28 Feb 2016 16:30

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por tibetillo »

He estado haciendo pruebas, y a pesar de tener puesto onbarclose en valor false que indicaría que se evalua tick por tick ...le he metido print antes del if para ver que valores va evaluando en la condición y el close(0) solo me lo muestra una vez.

Es como si no lo actualizara constantemente tick por tick.

Quité el while porque se quedaba bloqueado.

Alguna sugerencia?
Avatar de Usuario
Rafa7
Mensajes: 4924
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por Rafa7 »

Hola, tibetillo.



Yo no conozco Nija Trader, pero tu código lo encuentro extraño.

Supongo que o tu lenguaje tiene sintaxis dentada o le faltan endif y wend, para indicar final de if y final de while.
Otra cosa, ¿tu lenguaje es sensible a minúsculas? Ojo, que si lo és, I e i son dos variables diferentes.

Voy a suponer que tu lenguaje no es sensible a minúsculas (y, por lo tanto "I" e "i" son lo mismo) y que tu lenguaje requiere de endif y de wend. Entonces tu código es este:

Código: Seleccionar todo

I = 0
While I < 1
   If (close(0) == precio concreto)
      Enterlongstop (precioconcreto - 1)
   endif
   I = I + 1
Wend
El While es absurdo porque el bucle se te ejecutará una vez (sólo una vez):
Mira, primero I = 0, entonces si el precio de cierre es exactamente igual al precio concreto, el sistema tendrá precio de activación de stop loss a largos de el precio del precio concreto menos 1.
Pero entonces I pasa a valor 1, ya que se ejecuta el I = I + 1. Y, por lo tanto salimos del bucle del While (tanto si la condición del IF se cumple, como si no se cumple) ya que entonces ya no se cumple I < 1 (la condición del While).

Por lo tanto tu código es equivalente a:

Código: Seleccionar todo

If (close(0) == precio concreto)
      Enterlongstop (precioconcreto -1)
endif
O sea, no necesitas el While, ni necesitas la variable I. (Eso o te estás haciendo un lío)

Pero, de todas maneras, la condición de que el precio de cierre sea exactamente un precio concreto, lo veo ilógico.
Lo lógico sería lo siguiente:

Código: Seleccionar todo

If (close(0) > precio concreto)
      Enterlongstop (precioconcreto - 1)
endif
Es decir, que no modificas el stop loss de largos hasta que el precio no supere un precio concreto.

No sé exactamete que quiere decir Enterlongstop(x). No sé si x es el precio de activación del stop loss de largos o si x es el precio límite del stop loss de largos. Yo supongo que es lo primero. Pero si fuera lo segundo entonces el código lógico sería:

Código: Seleccionar todo

If (close(0) < precio concreto)
      Enterlongstop (precioconcreto - 1)
endif
Espero que otro forista que sí conozca Ninja Trader, te responda mejor.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por cls »

Una orden EnterLongStop es una orden para entrar comprado. No tiene que ver con stoploss. Cuando el mercado llegue al precio stop indicado en la orden, se enviará una orden a mercado de compra. Como orden a mercado que es no se garantiza que el precio filled coincida con el precio de la orden.

El precio de stop de la orden siempre debe estar por encima del precio al que se esté negociando en el momento de enviar la orden. Si no, o bien la orden será rechazada o bien se enviará a mercado en ese mismo momento; eso ya depende de tu bróker.

Entonces tu código EnterLongStop( precioconcreto - 1 ) siempre enviará la orden por debajo del Close[0] que es lo que vale precioconcreto y por tanto fallará. Mira en la pestaña Log de Ninja, o abre la ventana Output, que si éste es el fallo ahí lo verás detallado (si en el Output no te sale el detalle, pon el Initialize : TraceOrders = true;. Esto hará que en la ventana Output se muestre un log con todo lo que le ocurre a tus órdenes y los estados por los que pasan).

Como te ha explicado Rafa, el while no tiene sentido.

Si lo que quieres es entrar comprado por debajo del precio pero sólo cuando antes se haya tocado un precio x, usa órdenes EnterLongStopLimit.

Saludos.
Avatar de Usuario
Rafa7
Mensajes: 4924
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por Rafa7 »

Una curiosidad, cls.
En Ninja, las instrucciones condicionadas ¿se cierran por indentación (como en el Python) o se cierran por palabras clave (endif, wend, endfor, etc ...)?
En Ninja, ¿el lenguaje es sensible a minúsculas?
No es que vaya a aprender Ninja, solo es por curiosidad, para seguir mejor el código. El saber no ocupa lugar.
Gracias.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com

tibetillo
Mensajes: 8
Registrado: 28 Feb 2016 16:30

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por tibetillo »

En primer lugar daros las gracias a los dos por las respuestas ya que se agradece cualquier tipo de ayuda.

En segundo lugar os voy a comentar el caso de forma mas concreta ya que quizás no me he explicado muy bien ni en código ni en la funcionalidad concreta.

Imaginemos que estamos en un momento en el que el precio está en 1000 entonces previamente se ha cumplido una condición entre dos velas , y entonces debe colocar una orden de entrada una vez que toque el punto 989. Una vez tocado ese punto meterá una orden de compra en el punto 990. Esta orden de compra puede ser tocada o no.

Lo que no consigo es:

Tener en una variable el precio actual de forma que se vaya actualizando o si lo consigo no estoy haciéndolo de forma correcta ya que en teoría close(0) debe darme el precio actual pero no se actualiza en cada tick ya que cuando pongo delante del if un print close(0) me lo muestra por consola 1 vez en esa vela pero no todos los ticks de esa vela. A pesar de tener puesto onbarclose false.

El código que estoy colocando es el siguiente:

EN ONBARUPDATE

Código: Seleccionar todo

				test2 = precioestablecido;
					Print("Comparacion1" + Close[0]);
					Print("Comparacion2" + test2 );
					
					if(Close[0] == precioestablecido) ---Esto sería 989
					       {
					        entryShort = EnterShortStop(0, false, numContracts, tradePrice,"Short"); tradePrice sería 990
				        	}
Cuando hago la comparativa para ver por donde van los tiros, inicia vela me sale el close (0) correcto y el elemento de comparación2 correcto, pero debería volver al if constantemente para evaluar cada tick y el close(0) ir cambiando hasta que llegara a ser igual que la comparación2

A ver si podéis ayudarme, muchas gracias.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por cls »

Rafa7 escribió:Una curiosidad, cls.
En Ninja, las instrucciones condicionadas ¿se cierran por indentación (como en el Python) o se cierran por palabras clave (endif, wend, endfor, etc ...)?
En Ninja, ¿el lenguaje es sensible a minúsculas?
No es que vaya a aprender Ninja, solo es por curiosidad, para seguir mejor el código. El saber no ocupa lugar.
Gracias.
Sí Rafa. El lenguaje de Ninja es C# (realmente Ninja son un conjunto de librerías escritas en C#. Y lo que se conoce como NinjaScript son las clases que Ninja expone públicamente para que los usuarios las utilicen y programen indicadores, estrategias, etc. Pero todo es C#).

Los bloques (if, for, while, ...) normalmente llevan llaves pero si dentro del bloque sólo va una instrucción, las llaves se pueden obviar. También es sensible a minúsculas. Si conoces Java es prácticamente idéntico en la sintaxis.

Saludos.
Avatar de Usuario
Rafa7
Mensajes: 4924
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por Rafa7 »

tibetillo,



Usas la condición "Close[0] == precioestablecido". Pero, ¿no sería mejor la condición "Close[0] < precioestablecido"? ¿o la condición "Close[0] <= precioestablecido"?

Ten en cuenta una cosa, puede ocurrir que el close(0) cruze por debajo del precioestablecido sin que en ningún momento coincida con el precioestablecido. En otras palabras, puede suceder que el precio pase de estar por encima del precioestablecido a estar por debajo del precio establecido sin que "toque" el precio establecido. No sé si me explico.

No puedo ayudarte más porque no conozco Ninja.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
tibetillo
Mensajes: 8
Registrado: 28 Feb 2016 16:30

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por tibetillo »

Si, sería mejor con <= porque así lo puede tocar o si ya lo pasa también entra. Gracias Rafa7

Rafa y en qué sueles programar, en que plataforma de bolsa.

A ver si CLS puede ayudarnos con la otra cuestión que es la importante para que vaya cambiando el precio tick por tick con el close 0.

No soy con la tecla.
Avatar de Usuario
Rafa7
Mensajes: 4924
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por Rafa7 »

tibetillo,



Yo programo en ProRealTime.

ProRealTime está programado en Java, pero no tienes que saber nada de Java porque usa un lenguaje sencillisimo.
Y la ventaja de que esté programado en Java es que es multiplataforma (puede correr en Windows, Mac OS X, Linux, etc ...).
Con datos de fin de día es gratuito. Con datos en tiempo real es de pago.

Además tienes la posibilidad de programar sin saber programar gracias a un programa asistente que te genera el código, el cual puedes retocarlo a mano, si quieres.

Vamos, que el ProRealTime es adecuado hasta para torpes en programación, jejeje

Lo que no me gusta de ProRealTime es su programa de BackTesting, porque aunque te permite optimizar por parámetros, no te permite elegir la diana, y porque no puedes backtestear estrategias multivalores.



Saludos.
Última edición por Rafa7 el 01 Mar 2016 09:19, editado 1 vez en total.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por cls »

tibetillo escribió:Si, sería mejor con <= porque así lo puede tocar o si ya lo pasa también entra. Gracias Rafa7

Rafa y en qué sueles programar, en que plataforma de bolsa.

A ver si CLS puede ayudarnos con la otra cuestión que es la importante para que vaya cambiando el precio tick por tick con el close 0.

No soy con la tecla.
tibetillo,

dentro del OnBarUpdate el Close[0] se refiere siempre al precio del tick entrante. No tienes que hacer nada.


Con este sencillo código puedes probar el lanzamiento de órdenes en tiempo real. Este código en concreto te coloca un stop de compra 6 ticks por encima del precio corriente del mercado. Pruébalo y en la pestaña Log verás los datos de la orden.

Puedes cambiar EnterLongStop por otro tipo de órdenes. Y ten en cuenta sumar o restar ticks según el tipo de orden, por lo que te dije en el post anterior. Y con esto verás cómo funcionan todas las órdenes en ninja.

Puedes probarlo en el simulador, no tiene que ser un datafeed real.

Código: Seleccionar todo

private bool once = true;

protected override void OnBarUpdate()
        {
			if( Historical )
				return;
			
			if( once )
			{
				EnterLongStop( Close[0] + 6.0 * TickSize, "Compra en stop" );
				once = false;
			}
		}
tibetillo
Mensajes: 8
Registrado: 28 Feb 2016 16:30

Re: Orden enterlonglimit o enterlongstop al llegar un precio

Mensaje por tibetillo »

Buenos días chicos,

En primer lugar daros las gracias por las respuestas así como por la ayuda y disculpad por la tardanza en responder.

He conseguido lo que pretendía, muchas gracias.

Es curioso porque estaba cometiendo un error con los tipos de ordenes y con su intrepretación , luego el close[0] efectivamente marcaba el precio actual tick por tick.

Ahora me surge otra problemática que voy a plantear en otro post.

Gracias CLS y RAFA7.


cls escribió:
tibetillo escribió:Si, sería mejor con <= porque así lo puede tocar o si ya lo pasa también entra. Gracias Rafa7

Rafa y en qué sueles programar, en que plataforma de bolsa.

A ver si CLS puede ayudarnos con la otra cuestión que es la importante para que vaya cambiando el precio tick por tick con el close 0.

No soy con la tecla.
tibetillo,

dentro del OnBarUpdate el Close[0] se refiere siempre al precio del tick entrante. No tienes que hacer nada.


Con este sencillo código puedes probar el lanzamiento de órdenes en tiempo real. Este código en concreto te coloca un stop de compra 6 ticks por encima del precio corriente del mercado. Pruébalo y en la pestaña Log verás los datos de la orden.

Puedes cambiar EnterLongStop por otro tipo de órdenes. Y ten en cuenta sumar o restar ticks según el tipo de orden, por lo que te dije en el post anterior. Y con esto verás cómo funcionan todas las órdenes en ninja.

Puedes probarlo en el simulador, no tiene que ser un datafeed real.

Código: Seleccionar todo

private bool once = true;

protected override void OnBarUpdate()
        {
			if( Historical )
				return;
			
			if( once )
			{
				EnterLongStop( Close[0] + 6.0 * TickSize, "Compra en stop" );
				once = false;
			}
		}
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Ninja Trader”