OnCalculate срабатывает при добавлении нового индикатора на график

 

На графике находятся несколько индикаторов, когда добавляю любой новый индикатор на график, у всех индикаторов вызывается OnCalculate и происходит их перерасчёт.

Так и должно происходить?

 
Andrei Iakovlev:

На графике находятся несколько индикаторов, когда добавляю любой новый индикатор на график, у всех индикаторов вызывается OnCalculate и происходит их перерасчёт.

Так и должно происходить?

индикатор мог вызвать докачку истории, и по ней да, будет вызван OnCalculate. Например обращается к старшим таймфреймам или ещё как-то

и сама докачка могла быть инициирована ранее, другими индикаторами, просто данные не подгрузились а тут такой повод :-)

некий другой ваш индикатор поймав ChartEvent может также провоцировать подкачку.

Как вторичный эффект : при отсутствии связи и котировок может такое произойти ..

то есть вариантов масса, повторимый имеется ? 

PS/ у меня самого довольно "тяжёлые" индикаторы часть которых с DLL, но подобного эффекта не наблюдаю

 

проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.

причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза

 
Andrey F. Zelinsky #:

проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.

причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза

Андрей может вы объясните, а в чем проблема при этом? с автором вот длинная дискуссия была, и я так и не понял в чем там беда

 
lynxntech #:

Андрей может вы объясните, а в чем проблема при этом? с автором вот длинная дискуссия была, и я так и не понял в чем там беда

он же написал в чём проблема -- его пост понимается буквально

 
Andrey F. Zelinsky #:

он же написал в чём проблема -- его пост понимается буквально

обработались они и что из этого?? что от этого испортилось?

 
lynxntech #:

обработались они и что из этого?? что от этого испортилось?

это не важно, вопрос не в этом -- важно, что отработка OnCalculate() происходит не при поступлении нового тика, не от истории и пр. -- а от добавления на график другого индикатора (никак не связанного с ним) -- так быть не должно -- хотя для корректно сделанного индикатора это не должно быть критично.

 
Maxim Kuznetsov #:

то есть вариантов масса, повторимый имеется ? 

//+------------------------------------------------------------------+
//|                                                     testindi.mq5 |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate    (0,"Label",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"Label",OBJPROP_CORNER,3);
   ObjectSetInteger(0,"Label",OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,"Label",OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,"Label",OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,"Label",OBJPROP_HIDDEN,false);
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){ObjectDelete(0,"Label"); ChartRedraw();}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   Print("testindi, prev_calculated = ",prev_calculated," || rates_total = ",rates_total," || rates_total - prev_calculated = ",rates_total-prev_calculated);
//--- return value of prev_calculated for next call
   return rates_total;
  }
//+------------------------------------------------------------------+

написал для теста этот индикатор, когда его добавил на пустой график, вывод был такой:

2024.02.11 18:40:09.150 testindi (EURUSD,H1)    testindi, prev_calculated = 0 || rates_total = 1240 || rates_total - prev_calculated = 1240

после добавил на график стандартный MACD, результат:

2024.02.11 18:40:09.150 testindi (EURUSD,H1)    testindi, prev_calculated = 0 || rates_total = 1240 || rates_total - prev_calculated = 1240
2024.02.11 18:41:19.595 testindi (EURUSD,H1)    testindi, prev_calculated = 1240 || rates_total = 1240 || rates_total - prev_calculated = 0
 
Andrey F. Zelinsky #:

это не важно -- важно, что отработка OnCalculate() происходит не при поступлении нового тика, не от истории и пр. -- а от добавления на график другого индикатора (никак не связанного с ним) -- так быть не должно.

OnCalculate не редкое явление, на него нельзя повесить какую-то долгую функцию-расчет, а это значит, что она может всегда вызываться и будет образовывать актуальную информацию в своих расчетов.
 
Andrey F. Zelinsky #:

проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.

причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза

с какими параметрами ?

(не в рабочей обстановке, не проверю) 

Просто вызов OnCalculate - правильно и логично . Если при этом prev_calculated=rates_total. 

Иначе это либо подкачка истории, или ошибка с релизом.

 
Maxim Kuznetsov #:

с какими параметрами ?

(не в рабочей обстановке, не проверю) 

Просто вызов OnCalculate - правильно и логично . Если при этом prev_calculated=rates_total. 

Иначе это либо подкачка истории, или ошибка с релизом.

никакая подкачка не происходит

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