Pregunta para programador experto

Foro dedicado a esta excelente herramienta de desarrollo e implementación de sistemas de trading
Responder
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Pregunta para programador experto

Mensaje por cls »

Tengo un pequeño problema con el objeto ChartControl del ninja. A ver si alguien puede ayudarme.

Tengo un indicador que puede graficar de dos maneras.
Una es dibujando una rejilla tipo excel y escribiendo valores (para análisis quantitativo).
Y la otra es dibujando esos valores de manera gráfica (curvas, histogramas, etc).

La rejilla se dibuja en un panel independiente.
Pero las gráficas se dibujan en el panel del precio.

Esto se puede hacer cargando dos veces el indicador, una en el panel del precio y otra en un panel propio, y eligiendo la modadilidad de graficación adecuada.
Pero se consume el doble de recursos.

Lo que quiero es cargar el indicador sólo una vez y que grafique en los dos paneles.


Aquí viene el problema ...

Para poder hacerlo necesito acceder a la colección ChartControl.Panels, que contiene los paneles cargados en el chart.
Conociendo la posición y dimensiones de cada panel ya se podría dibujar todo de una vez colocando los elementos en el panel que correspondan.

Esta colección no es pública y sólo es accesible durante el debugging.

¿Alguién sabría cómo acceder a esta colección en tiempo de diseño?

Muchas gracias
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Ostrás tío... ¿no puedes hacer preguntas sobre arrays, como todo el mundo?????

:-D :-D :-D :-D :-D

¿Has probado en el "Support Forum" del Ninja?

Saludos!
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1 escribió:Ostrás tío... ¿no puedes hacer preguntas sobre arrays, como todo el mundo?????

:-D :-D :-D :-D :-D

¿Has probado en el "Support Forum" del Ninja?

Saludos!
:D
... si en el fondo es como un array :-D pero es que está escondio el muy ca*** y no sé cómo pillarlo. :-D

en el foro de ninja ya sé lo que me van a contestar ... "Not supported" :-D

S2
Avatar de Usuario
Man Apart
Mensajes: 1284
Registrado: 11 Ene 2009 12:31
Ubicación: mi ordenador

Mensaje por Man Apart »

Estoy recien empezando con el NT y me voy leyendo el foro poco a poco. Acabo de dar con este mensaje,

Suena muy divertido lo que propones, lastima que este muy pez en esta herramienta y no te pueda ayudar.

Lo que si te advierto es acerca de utilizar cosas no publicas, sean clases, metodos , funciones , etc. Porque ? pues porque no tienen obligacion de mantenerlas o de facilitar la migración futura. Asi que te puedes encontrar en la próxima version, con un monton de trabajo tirado a la basura.
Seguro que ya lo has tenido en cuenta, pero por si acaso.
Do not believe the naysayers who say it cannot be done
It can be done !
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Pues ya que ha salido a flote el hilo, y para darle alguna utilidad aparte de la diversión que pueda encontrar alguien leyéndolo (yo por más que lo releo no le veo el lado gracioso), la respuesta es utilizar las clases del namespace Reflection. Accedes al array de paneles, a sus dimensiones, y manipulas el objeto Graphics para dibujar donde quieras.

S2

Avatar de Usuario
Man Apart
Mensajes: 1284
Registrado: 11 Ene 2009 12:31
Ubicación: mi ordenador

Mensaje por Man Apart »

Disculpa cls , me expresé mal. Por divertido quería decir , interesante de abordar, porque a mi me divierten estas cosas.

En absoluto quise decir gracioso o cualquiera de sus sinonimos.

Un saludo
Do not believe the naysayers who say it cannot be done
It can be done !
Avatar de Usuario
Optiondreamer
Mensajes: 342
Registrado: 28 Mar 2006 08:07
Ubicación: 40.705571, -74.013432

Mensaje por Optiondreamer »

No me he adentrado al nivel que tú en el Ninja, por lo que no entiendo muy bien lo que quieres conseguir, pero si me pasas lo que quieres hacer(que objetos usas, a que clases llamas, . . .), en plan esqueleto(sin la salsa), le puedo echar un vistazo.

Saludos.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Muchas gracias Optiondreamer.

al final encontré la manera de hacerlo.

El Ninja dibuja todo, el precio y todos los indicadores que cargues (creo que hasta un máximo de 10) en un control llamado ChartControl. Que es la ventana que vemos cuando abrimos un chart.

Cada vez que cargas un indicador puedes elegir dibujarlo sobre el precio o en un panel particular. Pero ese panel sigue estando dentro del ChartControl. Y así puedes tener hasta 10 paneles separados e independientes dentro del mismo ChartControl.

Cuando sobrescribimos el método Plot de un indicador el sistema nos ofrece su objeto Graphics para poder utilizar todo el entorno de programación .NET para dibujar lo que queramos y como queramos (hasta un Market Delta :wink: ). El problema es que ese objeto Graphics está referido al panel donde está el indicador. Y no hay manera de dibujar en otros paneles incluido el del precio.

La única manera de hacerlo sería redimensionar el objeto Graphics para que englobara a todo el ChartControl y luego decidir en qué coordenadas dibujar.

Pero para esto necesito saber cuántos paneles están cargados y qué dimensiones tienen.

Esa información se puede obtener de en un miembro privado de la clase ChartControl. Es una colección de objetos Panels.
Pero al ser privado no es accesibe desde fuera del objeto ChartControl.

Así que para accederle desde el indicador la única manera que he encontrado es usar las clases Reflection.

La utilidad de esto es que un indicador podría plotear en dos paneles distinta información de la misma fuente, ahorrando así la mitad de recursos que consumiría si lo cargas dos veces. Por ejemplo, arriba un market delta y abajo un resumen del market delta.

Este es un ejemplo de que es posible dibujar en dos paneles desde el mismo indicador.

S2

PD: pero para la próxima ya te pregunto directamente :wink:
Adjuntos
several_panels.png
Última edición por cls el 29 Oct 2009 08:52, editado 2 veces en total.
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

CLS, creo que sólo los que estamos registrados en el foro de Big Mike podemos ver la imagen, a los demás les va a dar error.

Sólo leerte todo lo que hay que hacer para ahorrar recursos me dan mareos... casi mejor cómprate un ordenador más potente! ;-)

Ésta forma de posicionarse dentro de la ventana del chart, incluídos indicadores, ¿se hace de forma absoluta para toda la ventana, o tienes diferentes orígenes (por ejemplo, uno en cada ventana de indicador)? Es que no me imagino para qué necesitas graficar encima de toda la ventana...

Bueno, ya nos enteraremos...

Un abrazo! ;-)
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1 escribió:CLS, creo que sólo los que estamos registrados en el foro de Big Mike podemos ver la imagen, a los demás les va a dar error.
gracias bolsa1, edito y subo la imagen a x-trader.
bolsa1 escribió: Sólo leerte todo lo que hay que hacer para ahorrar recursos me dan mareos... casi mejor cómprate un ordenador más potente! ;-)
ya estoy en el tope de gama :-D . No en serio, es por hacer las cosas bien. He invertido un montón de tiempo optimizando código para que luego
por incomprensibles limitaciones tenga que duplicar ejecuciones y recursos.
bolsa1 escribió: Ésta forma de posicionarse dentro de la ventana del chart, incluídos indicadores, ¿se hace de forma absoluta para toda la ventana, o tienes diferentes orígenes (por ejemplo, uno en cada ventana de indicador)? Es que no me imagino para qué necesitas graficar encima de toda la ventana...
Para dibujar a medida en un indicador tienes que sobrescribir el método Plot. Este método te pasa como argumento un objeto Graphics (el objeto
típico para dibujar en windows). Las dimensiones de este objeto son las de un rectángulo que se refieren al panel donde está cargado el indicador.
Por lo tanto, puedes dibujar cualquier cosa y de todas las maneras que te permite .NET dentro de esos límites.

Pero esos límites se pueden alterar. Con lo que ya no estarías limitado al panel inicial. Puedes dibujar en cualquier otro sitio del ChartControl.
Pero claro, tienes que conocer exactamente las dimensiones de todos los paneles para dibujar en el lugar correcto.

Un ejemplo de esto es la imagen que puse en big mike. Simplemente cambiando a pedal las dimensiones de Graphics. Con esto se demuestra que se puede dibujar en cualquier sitio.

El siguiente paso sería calcular con exactitud en qué coordenadas dibujar. Esto todavía no lo he aplicado a ningún indicador. He visto cómo hacerlo (con la Reflection que comenté más arriba) pero lo he dejado aparcado por ahora. Pero poder hacerse, se puede seguro.


Imagina que tienes un indicador para análisis quantitativo como el de la imagen. Es una tabla con las celdas mostrando diferente información. Se puede entender como varios indicadores mostrando cada uno su resultado en una fila.

Todos los cálculos se hacen en el mismo código y de una sola vez.
Si programaras cada indicador por separado pues 17 ejecuciones (con sus reservas de memoria, cpu, etc. Recursos malgastados).

Ahora supongamos que alguna de esta información también se pudiera graficar.
Una solución sería hacer una versión del indicador para que no dibuje la tabla sino un gráfico. Y cargar las dos versiones del indicador, la quantitativa en un panel y la gráfica en otro.
Pero no deja de ser absurdo no poder hacerlo todo al mismo tiempo pues la información ya está calculada la primera vez.

Pues de aquí surgió la idea de investigar el tema de los paneles y ver si podía modificarlos.

Exactamente lo quiero para dibujar bien el resumen del market delta. Ahora lo hago dibujándolo en el panel del precio (fíjate que la escala es la misma). Pero quiero hacerlo en su propio panel, con su escala, etc.

Un abrazo :wink:
Adjuntos
manual_english_33.png
excel01.png
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Ninja Trader”