На графике находятся несколько индикаторов, когда добавляю любой новый индикатор на график, у всех индикаторов вызывается OnCalculate и происходит их перерасчёт.
Так и должно происходить?
индикатор мог вызвать докачку истории, и по ней да, будет вызван OnCalculate. Например обращается к старшим таймфреймам или ещё как-то
и сама докачка могла быть инициирована ранее, другими индикаторами, просто данные не подгрузились а тут такой повод :-)
некий другой ваш индикатор поймав ChartEvent может также провоцировать подкачку.
Как вторичный эффект : при отсутствии связи и котировок может такое произойти ..
то есть вариантов масса, повторимый имеется ?
PS/ у меня самого довольно "тяжёлые" индикаторы часть которых с DLL, но подобного эффекта не наблюдаю
проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.
причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза
проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.
причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза
Андрей может вы объясните, а в чем проблема при этом? с автором вот длинная дискуссия была, и я так и не понял в чем там беда
это не важно, вопрос не в этом -- важно, что отработка OnCalculate() происходит не при поступлении нового тика, не от истории и пр. -- а от добавления на график другого индикатора (никак не связанного с ним) -- так быть не должно -- хотя для корректно сделанного индикатора это не должно быть критично.
//+------------------------------------------------------------------+ //| 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
это не важно -- важно, что отработка OnCalculate() происходит не при поступлении нового тика, не от истории и пр. -- а от добавления на график другого индикатора (никак не связанного с ним) -- так быть не должно.
проверил -- действительно при добавлении индикатора на график -- происходит отработка OnCalculate() индикаторов, что уже есть на графике.
причём (проверял на индикаторе на ценовом графике) -- при добавлении подвального индикатора -- OnCalculate() отрабатывает два раза
с какими параметрами ?
(не в рабочей обстановке, не проверю)
Просто вызов OnCalculate - правильно и логично . Если при этом prev_calculated=rates_total.
Иначе это либо подкачка истории, или ошибка с релизом.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
На графике находятся несколько индикаторов, когда добавляю любой новый индикатор на график, у всех индикаторов вызывается OnCalculate и происходит их перерасчёт.
Так и должно происходить?