Pregunta para programador experto
Pregunta para programador experto
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
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
bolsa1 escribió:Ostrás tío... ¿no puedes hacer preguntas sobre arrays, como todo el mundo?????
![]()
![]()
![]()
![]()
![]()
¿Has probado en el "Support Forum" del Ninja?
Saludos!

... si en el fondo es como un array


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

S2
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.
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 !
It can be done !
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
S2
- Optiondreamer
- Mensajes: 345
- Registrado: 28 Mar 2006 08:07
- Ubicación: 40.705571, -74.013432
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
). 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
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
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
Última edición por cls el 29 Oct 2009 08:52, editado 2 veces en total.
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!
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.
Aristóteles.
gracias bolsa1, edito y subo la imagen a x-trader.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.
ya estoy en el tope de gamabolsa1 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!

por incomprensibles limitaciones tenga que duplicar ejecuciones y recursos.
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 objetobolsa1 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...
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
Si te ha gustado este hilo del Foro, ¡compártelo en redes!