Lectura de los búferes de los indicadores fijados en el gráfico - página 2

 
Yuriy Asaulenko:
Es extraño. He leído en alguna parte de la ayuda que si un indicador ya está en marcha, no se crea ninguna copia. No lo entiendo.

Debo haber entendido algo mal. Comprobé esta hipótesis, hice un indicador con dos buffers, uno se llena desde OnCalculate() y el otro desde OnTimer(), script, Expert Advisor... Usé iCustom() para imprimir el valor del buffer llenado en OnCalculate() y el valor vacío se deduce de OnTimer(). Al mismo tiempo el indicador está en el gráfico donde coloco el script o EA.

Conclusión: al llamar al indicador mediante iCustom(), el evento OnTimer() no se ejecuta en el indicador.

Tal vez esta es la razón por la que está escrito en la documentación

La función OnTimer() se llama cuando se produce un evento Timer, que es generado por el temporizador del sistema sólo para Asesores Expertos e indicadores - no se puede utilizar en las secuencias de comandos.

Y no menciona los indicadores de ninguna manera.

Aparentemente, hay algunas características útiles no documentadas en mql, así como consecuencias no documentadas...

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 
comp:

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?

Se puede leer y escribir y no se necesita DLL.
 
pako:
Lee y escribe y no necesita una DLL
Bueno, ¿dónde hay un ejemplo?
 
Alexey Viktorov:
¿Dónde está el ejemplo?
¿Dónde está el indicador?
 
comp:

Por desgracia, en este caso

no va a ayudar.

¿Por qué no ayuda?
 
pako:
¿Dónde está el indicador?
Dmitry Fedoseev:
¿Por qué no ayuda?

Asunto:

#property strict

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_type1 DRAW_LINE
#property  indicator_color1 clrRed

#define  PAUSE 100

input double EMA = 0.1;      // Коэффициент экспоненциального сглаживания
input int Amount = 100;      // Сколько раз применить до "сброса"

double Buffer[];

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
  return(rates_total);
}

void OnInit( void )
{
  SetIndexBuffer(0, Buffer);

  EventSetMillisecondTimer(PAUSE);

  return;
}

void OnDeinit( const int reason )
{
  EventKillTimer();

  return;
}

void SetBuffer( const bool Random )
{
  const int Size = ArraySize(Buffer);

  if (Random)
  {
    MathSrand((int)TimeLocal());

    for (int i = 0; i < Size; i++)
      Buffer[i] = MathRand();
  }
  else
    for (int i = 1; i < Size; i++)
      Buffer[i] += (Buffer[i - 1] - Buffer[i]) * EMA;

  return;
}

void OnTimer( void )
{
  static int Count = 0;

  SetBuffer(Count % Amount == 0);
  ChartRedraw();

  Count++;

  return;
}
 
Yuriy Asaulenko:
Extraño. He leído en alguna parte de la ayuda que si el indicador ya está funcionando, no se crea una copia. Tal vez no entienda algo.

Recientemente he publicado un indicador, que sólo muestra una cadena de texto. Y al llamarlo a través de iCustom las líneas del indicador en el gráfico y en iCustom interferían entre sí, tuve que hacer una sola salida programáticamente.

Quizás, no se crea una copia del código en la memoria, sino que el recálculo va con sus parámetros

https://www.mql5.com/ru/code/14737/83151#! tab=code

 
comp:

Asunto:

¿Y qué?
 
Alexey Volchanskiy:

Recientemente he publicado un indicador, que sólo muestra una cadena de texto. Y al llamarlo a través de iCustom las líneas del indicador en el gráfico y en iCustom interferían entre sí, tuve que hacer una sola salida programáticamente.

Quizás, no se crea una copia del código en la memoria, sino que el recálculo va con sus parámetrosCopy

https://www.mql5.com/ru/code/14737/83151#! tab=code

No se puede crear una copia del código porque es una carga dinámica.
 
Алексей Тарабанов:
La copia del código no puede no ser creada, porque es una carga dinámica.

¿Afirmación verbal, o eres un desarrollador de MQ? :))

Aunque, yo mismo lo pienso, por analogía con la DLL, donde el código del programa está en una instancia, y se crean instancias de datos para los clientes.

En resumen, la cuestión práctica es que si hay un índice en un gráfico, iCustom no toma los datos de éste, sino de una instancia creada por separado.

Razón de la queja: