Como Identificar Rays

Foro dedicado a esta excelente herramienta de desarrollo e implementación de sistemas de trading
Responder
Avatar de Usuario
eryo
Mensajes: 663
Registrado: 17 Sep 2004 23:37
Ubicación: desubicado

Como Identificar Rays

Mensaje por eryo »

Hola. He hecho esta pregunta en el foro de NinjaTrader y no han sabido darme una respuesta. No se si es por el idioma o porque soy de natural torpe. Ahí va mi cuestión a ver si me puedes echar una mano:

Tengo este pseudocódigo (lo pongo así porque no estoy en el ordenador)

Si close 0 > close >1 && close 1> close 2

Drawray (dibuja una linea recta al infinito)

Hasta aquí no hay problema.

Ahora viene el problema.

La ray la tengo ya dibujada y ahora quiero que si esa ray ya dibujada es atravesada por dos barras consecutivas que cierren por encima de la ray la ray cambie de color. Básicamente quiero saber cuantas veces atraviesa el precio esa ray.

En pseudocódigo:

If close 0 && close 1 > Drawray

Drawray (cambia de color)

Y así sucesivamente.

El problema que encuentro es que no se como referirme a la Drawray en esta segunda parte.

En el foro de ninja me han dicho que haga dos variables con el punto de origen y destino de la ray (que obviamente son iguales porque no tiene inclinacion) .

Yo he hecho esto (pseudocódigo)

Y1 = punto1
Y2 = punto2

If ((Close 0 && Close 1) && (Close 0 && Close 1) > Y1) &&

((Close 0 && Close 1) && (Close 0 && Close 1) > Y2)

Drawray (con otro color)

Pero no hay forma. Me dice que no puedo usar &&. Estoy desesperado.

Gracias
Última edición por eryo el 06 Oct 2015 09:06, editado 1 vez en total.
Par est fortuna labori
Potest quia posse videtur
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Como Identificar Rays

Mensaje por cls »

Hola eryo,

eso que propones no es tan sencillo y sólo serviría para líneas horizontales. Y el pseudocódigo sería algo así:

Código: Seleccionar todo

Double yRay = 1980.00; // ordenada de la línea horizontal (no necesitas la abcisa, con la ordenada es suficiente).
if( Close[0] > Close[1] && Close[1] > Close[2] && Close[0] > yRay )
{
  // lo que sea
}
Pero supongo que yRay no la conoces a priori, sino que la quieres sacar del chart a partir de la línea dibujada. Así que tendrás que buscar esa línea dentro de la colección DrawObjects del chart (mira la ayuda de Ninja para esta colección), a partir de su propiedad Tag.

Pero si la línea no es horizontal sino que tiene pendiente, el problema se complica. Entonces sí necesitas un punto de origen y otro de fin de la recta. Y a partir de esos dos puntos calcular la ecuación paramétrica de la recta.
Conocida esa ecuación podrás extraer la ordenada de la recta para cualquier posición de barra, y por tanto compararla con los Closes de las barras que quieras.

S2
Avatar de Usuario
eryo
Mensajes: 663
Registrado: 17 Sep 2004 23:37
Ubicación: desubicado

Re: Como Identificar Rays

Mensaje por eryo »

Gracias CLS. Seria una linea horizontal al infinito. Voy a estudiarlo a ver si lo consigo. Muchísimas gracias.
Par est fortuna labori
Potest quia posse videtur
Avatar de Usuario
eryo
Mensajes: 663
Registrado: 17 Sep 2004 23:37
Ubicación: desubicado

Re: Como Identificar Rays

Mensaje por eryo »

Hola cls. No consigo hacer lo que quiero. Este es mi código

{
if(CurrentBar < 3)
return;

if (Close[0] > Close[1] &&
Close[0] > Close[2]&&
Close[0] > Close[3] &&

Close[0] > Close[-1]&&
Close[0] > Close[-2]&&
Close[0] > Close[-3])
//sé que Close[-1][-2][-3] no existe pero con ello me hace lo que
quiero y sin ello no, aunque no se por qué.

{
DrawTriangleDown(CurrentBar.ToString(), true, 0, High[0]+ ((TickSize*2)*2), Color.Blue);

DrawRay("rayH"+CurrentBar,true, 1, Close[0]+((TickSize*0)*0), 0, Close[0]+((TickSize*0)*0),Color.Yellow,DashStyle.Dash,2);
}

//Hasta aquí no hay problema y me hace lo que yo quiero.

foreach (IDrawObject drawRay in DrawObjects)


if (drawRay.Tag.StartsWith("rayH210") && drawRay is IRay)


{
ILine globalLine = (ILine) drawRay;
globalLine.Pen.Color = Color.Black;
}

//Con esto consigo pintar una sola raya de color negro.

Los problemas que tengo y no sé resolver:
-no sé como sacar automaticamente cada raya. Me pinta de negro la “rayH210” porque lo he puesto ya manualmente pero no se como sacar automaticamente cada raya.

A continuacion quiero que en cada raya si el Close[1][0]> ray esa ray cambie de color. Problemas que me plantea esto:
Tu me aconsejas crear una variable Double con el punto de origen de la raya.
El problema es que no se cual es el punto de origen. Yo he hecho esta variable:

double Y1 = ((TickSize*0)*0);

Hay que tener en cuenta que la raya siempre será horizontal al infinito.

Bien suponiendo que ese punto de origen es el correcto ahora tengo que hacer que si el cierre de [1] y [0] es mayor que la raya (que el punto de origen de la raya supongo)la raya cambie de color:

if ((Close[0] > Close[1]) && (Close[1] > Y1))

{
DrawRay("rayH"+CurrentBar,true, 1, Close[0]+((TickSize*0)*0), 0, Close[0]+((TickSize*0)*0),Color.Blue,DashStyle.Dash,2);
}

Esto no puedo hacerlo porque me dice que > no se puede aplicar a valores double.

Y a partir de ahi me quedo ya bloqueado y no se que hacer.

Si fueses tan amable de orientarme te quedaría muy agradecido. Gracias.
Par est fortuna labori
Potest quia posse videtur
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Como Identificar Rays

Mensaje por cls »

Tu problema mayor ahora mismo es reconocer todas las IRays que hay dibujados en el chart.
La solución más eficiente es dotar al chart de un botón interactivo que al pulsarlo te ejecute el código de reconocimiento; se pulsaría sólo al dibujar una nueva línea. Pero te complicaría el código también.
Aunque si trabajas a cierre de barra puedes hacer el reconocimiento en cada OnBarUpdate, que aunque sea un consumo innecesario de recursos al menos te funcionará bien.

En cualquier caso, el código de reconocimiento es como el que has puesto:
foreach( IDrawObject o in DrawObjects)
{
if( o is IRay )
{
// Has encontrado un ray, haz lo que sea.
}
}

La ordenada de cada IRay la sacas de su propiedad Anchor1Y ó Anchor2Y (deberían de valer lo mismo). Esto está en la ayuda de ninja para el IRay. Con esto ya sabrías el precio de todos los rays dibujados en el chart y no tienes más que compararlos con los Closes.

Los Close[n] los puedes comparar con las propiedades Anchor1Y ó Anchor2Y. Todos son doubles y no tiene que dar
ninguna excepción.

El siguiente problema que te encontrarás es eliminar las líneas que ya hayan sido superadas por el precio.
Lo más sencillo sería que una vez detectada la superación de un IRay por el precio lo borres con RemoveDrawObject (ver la ayuda de ninja para esta función).

Espero que te oriente.

S2

Avatar de Usuario
eryo
Mensajes: 663
Registrado: 17 Sep 2004 23:37
Ubicación: desubicado

Re: Como Identificar Rays

Mensaje por eryo »

Gracias. A trabajar :-)
Par est fortuna labori
Potest quia posse videtur
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Re: Como Identificar Rays

Mensaje por cls »

Hola eryo,

NinjaTrader8 ha incluido una funcionalidad para todos los objetos dibujados en el chart, de modo que el software te avisa con una alarma cuando el precio rompe una línea, un rectángulo o lo que hayas dibujado y sin tener que escribir nada de código. Igual te sirve.

S2

PD: por qué no cambias el título del post y pones algo así como Rotura de líneas en ninja o algo relacionado ? ;)
Avatar de Usuario
eryo
Mensajes: 663
Registrado: 17 Sep 2004 23:37
Ubicación: desubicado

Re: Como identificar Rays

Mensaje por eryo »

Gracias. Voy a mirarlo. Título cambiado
Par est fortuna labori
Potest quia posse videtur
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Ninja Trader”