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

 

там есть проблемы, я писал что 3 терминала на одном компе иногда не открывают позиции, но это была проблема если использовать newbar, если использовать каждый тик, то ничего страшного, новый бар затупил, откроется на следующем тике

проблема не в реквоте, на новом времени индикатора, информация прошлого

 
Andrey F. Zelinsky #:

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

Что такое подвальный индикатор?

 
Andrei Iakovlev #:

Что такое подвальный индикатор?

индикатор в подокне -- в вашем примере: MACD -- подвальный, нижний/верхний, в подокне

 
Maxim Kuznetsov #:

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

Без тика при добавлении на график нового индикатора правильно и логично?

 
Andrey F. Zelinsky #:

индикатор в подокне -- в вашем примере: MACD

а, такой, но у меня только 1 раз был вызов в примере выше

 
Andrei Iakovlev #:

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

в вашем test-case получается prev_calculated=rates_total

ПРАВИЛЬНО и ЛОГИЧНО. перерасчётов нет

ЗЫ. чтобы прочии индикаторы могли обновить свои граф.объекты например 
 
Maxim Kuznetsov #:

в вашем test-case получается prev_calculated=rates_total

ПРАВИЛЬНО и ЛОГИЧНО. перерасчётов нет

prev_calculated = rates_total --- да, это правильно и логично

Но почему вообще происходит вызов OnCalculate?

 
Maxim Kuznetsov #:

в вашем test-case получается prev_calculated=rates_total

ПРАВИЛЬНО и ЛОГИЧНО. перерасчётов нет

думаю, что правильно -- это на ваши посты забить -- т.к. вы сами не проверяете и не читаете что пишут.

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

при добавлении индикатора на ценовой график -- один раз.

 

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

речь идёт про билд 4173

 

Можно на график кинуть тестовый индикатор с внедрённым в него обработчиком событий OnChartEvent(). Тогда можно попробовать определить, в чём дело. Вот набросал такой тестовый индикатор iEventsCatcher:

//---
uint gCallCnt;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
   {
   gCallCnt = 0;
//---
   return(INIT_SUCCEEDED);
   }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
   {
   ::PrintFormat("OnCalculate() call #%d", gCallCnt + 1);
   gCallCnt++;
//--- return value of prev_calculated for next call
   return(rates_total);
   }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
   {
   ::PrintFormat("OnChartEvent() call, event %s", ::EnumToString((ENUM_CHART_EVENT)id));
   }
//+------------------------------------------------------------------+

Бросаю его на график, получаю в Журнале:

2024.02.11 20:08:30.968 iEventsCatcher (EURUSD,H1)      OnCalculate() call #1
2024.02.11 20:08:30.995 iEventsCatcher (EURUSD,H1)      OnChartEvent() call, event CHARTEVENT_CHART_CHANGE

Бросаю на тот же график подвальный индикатор ATR, получаю в Журнале:

2024.02.11 20:12:41.382 iEventsCatcher (EURUSD,H1)      OnChartEvent() call, event CHARTEVENT_CHART_CHANGE
2024.02.11 20:12:41.382 iEventsCatcher (EURUSD,H1)      OnCalculate() call #2
2024.02.11 20:12:41.397 iEventsCatcher (EURUSD,H1)      OnChartEvent() call, event CHARTEVENT_CHART_CHANGE

Бросаю на тот же график индикатор МА, получаю в Журнале:

2024.02.11 20:14:24.301 iEventsCatcher (EURUSD,H1)      OnChartEvent() call, event CHARTEVENT_CHART_CHANGE
2024.02.11 20:14:24.301 iEventsCatcher (EURUSD,H1)      OnCalculate() call #3
2024.02.11 20:14:24.317 iEventsCatcher (EURUSD,H1)      OnChartEvent() call, event CHARTEVENT_CHART_CHANGE


Насколько понимаю, то двойное CHARTEVENT_CHART_CHANGE - это обработка iEventsCatcher'ом своего изменения графика и изменения графика другого запущенного индикатора...


Вывод: любой индикатор при запуске генерирует событие  CHARTEVENT_CHART_CHANGE, на к-рое отзываются все прочие сущности графика...


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