Lectura de los búferes de los indicadores fijados en el gráfico

 

Se coloca un indicador en el gráfico. Es redibujado por los eventos Timer, ChartEvent y Calculate.

Necesito que un script lea los valores actuales de sus buffers de indicadores(INDICATOR_DATA) que se pueden ver con CTRL+D. ¿Es posible hacer esto en MT4?

 

La solución a través de la DLL se da en el artículo"Transferencia de datos entre indicadores - una solución sencilla". Pero hay que añadir la llamada deGetPtr externa al código fuente del indicador, lo que no siempre es posible.

¿Sin DLL es posible realizar sólo lectura (sin escritura, que también se hace en el artículo) de los buffers? ¿Ha cambiado algo en este tema desde que se escribió el artículo (2010)?

 
iCustom() le ayudará.
iCustom - Технические индикаторы - Справочник MQL4
iCustom - Технические индикаторы - Справочник MQL4
  • docs.mql4.com
iCustom - Технические индикаторы - Справочник MQL4
 
Alexey Viktorov:
iCustom() le ayudará.

Por desgracia, en este caso

redibujar por loseventos Timer, ChartEvent y Calculate.

no ayudará.

 
¿Cuántos valores necesita? Que el propio indicador guarde duplicados de estos valores en las variables globales del terminal, en las propiedades de los objetos del gráfico, en los archivos
 
Alexander Puzanov:
¿Cuántos valores necesita? Que el propio indicador guarde los duplicados de estos valores en variables globales del terminal, en propiedades de objetos del gráfico, en ficheros

Necesito un script para obtener los valores de los buffers (al menos uno) de un indicador en un gráfico. Volcar los búferes de un indicador a un archivo no es un script que lee búferes.

En el artículo anterior, hay una buena solución a través de punteros que le permite no sólo leer, sino incluso sobrescribir los búferes de otros indicadores en los gráficos. Esto es lo que se llama una lectura en el buffer. Pero es una DLL.

Como ves, podemos aplicar el siguiente esquema

  • el indicador espera a que una variable global escriba sus búferes en el archivo.
  • El script crea dicha variable en tiempo de ejecución y recibe los archivos correspondientes.
Pero esto no es ni siquiera una muleta. No está leyendo los buffers.

A juzgar por el silencio, más de siete años desde que este problema se anunció públicamente en el cuarto foro (google recuerda), los desarrolladores no han creado un funcional.

¡Por alguna razón todavía no pueden hacer una lectura humana de los datos del indicador desde el gráfico! Suena delirante, pero lo es.

 
comp:

Por desgracia, en este caso

no va a ayudar.

¿Por qué no? iCustom() lee el buffer del indicador independientemente de cómo se llene este buffer. Después de todo, el buffer se declara a nivel de variables globales en cualquier caso.
 
Alexey Viktorov:
¿Por qué no? iCustom() lee el buffer del indicador, independientemente de cómo se llene este buffer. Después de todo, el buffer se declara a nivel de variables globales en cualquier caso.

Porque iCustom no sabe nada de los eventos Timer y ChartEvent.

Por ejemplo, el indicador en el gráfico cada segundo (evento Timer) llena su único buffer con números aleatorios (o aplica EMA a los valores del buffer anterior). Son bastantes líneas de código. iCustom en este caso nunca devolverá lo que se verá en el gráfico.

 
comp:

Porque iCustom no sabe nada de los eventos Timer y ChartEvent.

Por ejemplo, el indicador en el gráfico cada segundo (evento Timer) llena su único buffer con números aleatorios (o aplica EMA a los valores del buffer anterior). Son bastantes líneas de código. Entonces, iCustom nunca devolverá lo que verá en el gráfico.

Comprendo mi error de concepto, gracias.
 
Alexey Viktorov:
¿Por qué no? iCustom() lee el buffer del indicador, independientemente de cómo se llene este buffer. Después de todo, el buffer se declara a nivel de variables globales en cualquier caso.

iCustom no lee los buffers del indicador en el gráfico, sino que crea su propia copia del indicador en la memoria y lee de ella, sólo que las copias de los buffers no se muestran en el gráfico. Pero si el indicador dibuja algo en el gráfico de forma independiente, se dibujará cuando se llame a través de iCustom que crea problemas, por cierto

Por ejemplo, si el indicador tiene el siguiente código, se dibujará al llamar a iCustom, y el texto se superpondrá al texto del indicador en el gráfico

ObjectSetString(0, ShortName, OBJPROP_TEXT, "какой-то текст");
ChartRedraw();
 
Alexey Volchanskiy:

iCustom no lee los buffers del indicador en el gráfico, sino que crea su propia copia del indicador en la memoria y lee de ella, sólo que las copias de los buffers no se muestran en el gráfico. Pero si el indicador dibuja algo en el gráfico de forma independiente, se dibujará cuando se llame a través de iCustom que crea problemas, por cierto

Por ejemplo, si el indicador tiene el siguiente código, se dibujará al llamar a iCustom, y el texto se superpondrá al texto del indicador en el gráfico

Es extraño. He leído en alguna parte de la guía que si el indicador ya está lanzado, no se crea ninguna copia. Tal vez no entienda algo.