OnCalculate не перезапускается

 

Господа, помогите кто чем может.


Имеется график пользовательского символа.

Перетаскиваю на него пользовательский индикатор1, который получает хэндл пользовательского индикатора2 со старшего таймфрэйма.

Пока индикатор 2 инициализируется и рассчитывается, в индикаторе1 запускается OnCalculate, который проверяет, рассчитан ли индикатор2, а поскольку тот не рассчитан, то возвращает prev_calculated=0, после чего OnCalculate больше не перезапускается.

Получается, что в визуальном тестере повторный запуск OnCalculate срабатывает, из-за поступления новых баров, а на статичном графике наступает ступор

Индикатор1:
.....
int OnInit()
  {
...
//---Получить хэндл индикатора Elder MACD histogram
   ExtMACDHandle=iCustom(NULL,ExtMACDPeriod,"TRSC\Elder_MACD_histogram\Elder_MACD_histogram_x6",InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalEMAPeriod,PRICE_CLOSE, TRSCkey);

//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if(ExtMACDHandle==INVALID_HANDLE)
     {
      Print(" Не удалось получить хендл индикатора Elder MACD histogram");
      return(false);
     }
.....
}

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[])
  {
...

// Проверим кол-во рассчитанных баров внешнего индикатора
   int calculated=BarsCalculated(ExtMACDHandle);
   if(calculated<ExtRatesTotal)
     {
      Print("Duplication_MACD_hist. Не все данные ExtMACDHandle рассчитаны: (",calculated,"bars ). Error",GetLastError());    
      return(0);
     }
...
  }


Лог вот такой:

2021.04.18 12:20:47.571 Duplication_MACD_hist (SLB_c,D1) Oncalculate rates_total: 12867 prev_calculated: 0

2021.04.18 12:20:47.571 Duplication_MACD_hist (SLB_c,D1) Duplication_MACD_hist. Не все данные ExtMACDHandle рассчитаны: (-1bars ). Error4806

2021.04.18 12:20:47.571 Elder_MACD_histogram_x6 (SLB_c,W1) Elder_MACD INIT

2021.04.18 12:20:47.571 Elder_MACD_histogram_x6 (SLB_c,W1) Elder_MACD_histogram успешная инициализация в OnInit


 
Sunriser:

Duplication_MACD_hist. Не все данные ExtMACDHandle рассчитаны: (-1bars ). Error4806

очевидно что проблема с пользовательским индикатором Elder_MACD_histogram_x6

4806 

ERR_INDICATOR_DATA_NOT_FOUND

 
Taras Slobodyanik:

очевидно что проблема с пользовательским индикатором Elder_MACD_histogram_x6

4806 

ERR_INDICATOR_DATA_NOT_FOUND

Естественно NOT_FOUND, инициализация индикатора в логе происходит уже после попытки обращения к данным

 
if(calculated<=ExtRatesTotal)

для начала поставьте тут <=0 вместо ExtRatesTotal.

потом попробуйте какой-нибудь стандартный индикатор.

пс. еще пару для тестирования выбирайте стандартную, какой-нибудь форекс-мажор.

 
Taras Slobodyanik:

для начала поставьте тут <=0 вместо ExtRatesTotal.

потом попробуйте какой-нибудь стандартный индикатор.

пс. еще пару для тестирования выбирайте стандартную, какой-нибудь форекс-мажор.


ExtRatesTotal - это кол-во баров на старшем таймфрэйме:

   ExtRatesTotal = iBars(_Symbol, ExtMACDPeriod); // Получим кол-во баров внешнего TF

Чтобы копировать значения от туда, код хочет дождаться их расчета.

Менял пользовательский индикатор на стандартный iOsMA

Пробовал график EURUSD.

На TF с малым кол-м баров, например на W1 всё работает, а на D1 работает 1 раз из 10, когда успевает сделать расчет баров индикатора 2.

 
Sunriser:

На TF с малым кол-м баров, например на W1 всё работает, а на D1 работает 1 раз из 10, когда успевает сделать расчет баров индикатора 2.

История загружена по всем периодам?
МТ5 строит бары из М1, то есть если это первое обращение к символу/периоду, то может занять много времени пока загрузятся все минутки.

 
Sunriser:


ExtRatesTotal - это кол-во баров на старшем таймфрэйме:

Чтобы копировать значения от туда, код хочет дождаться их расчета.

Менял пользовательский индикатор на стандартный iOsMA

Пробовал график EURUSD.

На TF с малым кол-м баров, например на W1 всё работает, а на D1 работает 1 раз из 10, когда успевает сделать расчет баров индикатора 2.

а если попробовать установить ваш индикатор

Elder_MACD_histogram_x6"

в этот индикатор https://www.mql5.com/ru/code/33553

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

я имею ввиду здесь изменить на ваш

//--- create handle of the indicator iOsMA
   handle_iOsMA=iOsMA(Symbol(),Period(),Inp_OsMA_fast_ema_period,
                      Inp_OsMA_slow_ema_period,Inp_OsMA_signal_period,Inp_OsMA_applied_price);
//--- if the handle is not created
   if(handle_iOsMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create a handle of iOsMA for the pair %s/%s, error code is %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
 
Taras Slobodyanik:

История загружена по всем периодам?
МТ5 строит бары из М1, то есть если это первое обращение к символу/периоду, то может занять много времени пока загрузятся все минутки.

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

SanAlex:

а если попробовать установить ваш индикатор

в этот индикатор https://www.mql5.com/ru/code/33553

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

я имею ввиду здесь изменить на ваш

Заменил, работает как часы, дело не в моем  индикаторе Elder_MACD_histogram_x6


Приложил сферический пример в вакууме. Попробуйте запустить его на периодах от D1 и ниже. 

Я ожидал, что OnCalculate будет перезапускаться до тех пор, пока он не вернет rates_total вместо нуля, но нет, отрабатывает один раз, возвращает ноль и больше ничего не происходит.

Файлы:
 
Sunriser:

Я ожидал, что OnCalculate будет перезапускаться до тех пор, пока он не вернет rates_total вместо нуля, но нет, отрабатывает один раз, возвращает ноль и больше ничего не происходит.

В документации ведь написано: 

События клиентского терминала

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных.

Ничего про циклический вызов нет. Таким образом, вывод один: нет тиков, которые бы сгенерировали событие Calculate. На пользовательских символах такое бывает часто.

 
Ihor Herasko:

В документации ведь написано: 

События клиентского терминала

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных.

Ничего про циклический вызов нет. Таким образом, вывод один: нет тиков, которые бы сгенерировали событие Calculate. На пользовательских символах такое бывает часто.

А создать такое событие нельзя? 

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

Если только в случае ошибки вызывать OnInit, в холостую без фактической переинициализации переменных:

....
//--- handles
int                      ExtMACDHandle=INVALID_HANDLE;               // хэндл внешнего индикатора
...


int OnInit()
  {
   if(ExtMACDHandle==INVALID_HANDLE)
     {
      ExtMACDHandle=iOsMA(NULL, ExtMACDPeriod, InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalEMAPeriod,PRICE_CLOSE);
     }
...
  }

...
   if(calculated<ExtRatesTotal)
     {
      Print("Ошибка! Не все данные ExtMACDHandle рассчитаны: (",calculated,"bars, ExtRatesTotal: ",ExtRatesTotal,"). Error",GetLastError());
      OnInit();
     }
...
 
Sunriser:

Заменил, работает как часы, дело не в моем  индикаторе Elder_MACD_histogram_x6


Приложил сферический пример в вакууме. Попробуйте запустить его на периодах от D1 и ниже. 

Я ожидал, что OnCalculate будет перезапускаться до тех пор, пока он не вернет rates_total вместо нуля, но нет, отрабатывает один раз, возвращает ноль и больше ничего не происходит.

Файлы:

он у вас  пишет что всё ок! 

Снимок[POP

\\\\\\\\\\\\\\\\\\\\\

Да выдаёт ошибку - когда время другое установил 1мин.

Снимок[POP 2

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