Чтение буферов индикатора, установленного на чарт - страница 2

 
Yuriy Asaulenko:
Странно. Где-то в хелпе читал, что если индикатор уже запущен, то копия не создается. М.б. чего не понял.

Наверное чего-то не понял. Я проверил всю эту гипотезу, сделал индикатор с двумя буферами, один заполняется из OnCalculate() другой из OnTimer(), скрипт, советник... из советника через iCustom() выводится в принт значение буфера заполняемого в OnCalculate() а из OnTimer() выводится пустое значение. При этом индикатор висит на графике на который кидаю скрипт или ставлю советник.

Вывод: при вызове индикатора посредством iCustom() событие OnTimer() в индикаторе не выполняется...

Возможно по этой причине в документации сказано

Функция OnTimer() вызывается при наступлении события Timer, которое генерируется системным таймером только для экспертов и индикаторов – использовать ее в скриптах нельзя.

и индикаторы никак не упомянуты...

Бывают, видимо, как полезные недокументированные фишки в mql так и недокументированные заморочки...

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

На чарте установлен индикатор. При этом он перерисовывается по событиям Timer, ChartEvent и Calculate.

Нужно скриптом считать текущие показатели его индикаторных буферов (INDICATOR_DATA), что видны по CTRL+D. Возможно ли это сделать в MT4?

Читается и пишется и DLL нафик не нужна
 
pako:
Читается и пишется и DLL нафик не нужна
Ну, а пример где?
 
Alexey Viktorov:
Ну, а пример где?
Индикатор где?
 
comp:

К сожалению, в этом случае

не поможет. 

Почему это не поможет?
 
pako:
Индикатор где?
Dmitry Fedoseev:
Почему это не поможет?

Подопытный:

#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:
Странно. Где-то в хелпе читал, что если индикатор уже запущен, то копия не создается. М.б. чего не понял.

Недавно выложил индикатор, там как раз выводится текстовая строка. И при вызове через iCustom строки индикатора на чарте и iCustom мешали друг другу, пришлось программно сделать только один вывод.

Может, копия кода и не создается в памяти, но перерасчет идет со своими параметрами

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

 
comp:

Подопытный:

Ну и что?
 
Alexey Volchanskiy:

Недавно выложил индикатор, там как раз выводится текстовая строка. И при вызове через iCustom строки индикатора на чарте и iCustom мешали друг другу, пришлось программно сделать только один вывод.

Может, копия кода и не создается в памяти, но перерасчет идет со своими параметрамиКопия 

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

Копия кода не может не создаваться ,потому, что это - динамическая загрузка. 
 
Алексей Тарабанов:
Копия кода не может не создаваться ,потому, что это - динамическая загрузка. 

Голословное утверждение, или вы разработчик MQ? :))

Хотя, я и сам так думаю, по аналогии с DLL, где программный код в одном экземпляре, а для клиентов создаются экземпляры данных.

Короче, практический смысл в том, что если есть индюк на чарте, iCustom берет данные не с него, а с отдельно созданного экземпляра. 

Причина обращения: