Несколько разных таймфреймов в одном индикаторе iCustom дает Requested data not found

 

Здравствуйте.


Есть кастомный индикатор который использует одновременно несколько стохастиков на разных таймфреймах.

Проблема но при попытке использовать его индикатор падает с ошибкой 

Not all data of ExtST_2_Handle is calculated (87694bars ). Error4806

Однако баров было рассчитано не мало 87694 но ошибка все же падает. Проверка выглядит так:

   calculated=BarsCalculated(ExtST_2_Handle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtST_2_Handle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }

Я предполагаю что это связанно с значением  rates_total : "значение параметра соответствует количеству баров на графике, на котором он запущен." Согласно https://www.mql5.com/ru/docs/event_handlers/oncalculate (вторая перегрузка функции)

Как я могу рассчитать значение <st_number>_rates_total соответствующее таймфрейму индикатора, на основе имеющегося rates_total для  каждого конкретного индикатора внутри моего?


То есть что-то вроде

   int st2_rates_total=CalculateRatesTotlal(rates_total, st_2_timeframe);
   calculated=BarsCalculated(ExtST_2_Handle);
   if(calculated<st2_rates_total)
     {
      Print("Not all data of ExtST_2_Handle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }

   int st3_rates_total=CalculateRatesTotlal(rates_total, st_3_timeframe);
   calculated=BarsCalculated(ExtST_3_Handle);
   if(calculated<st3_rates_total)
     {
      Print("Not all data of ExtST_3_Handle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }

int CalculateRatesTotlal(int rates_total, ENUM_TIMEFRAMES target_timeframe)
  {
   double result = (double) rates_total / ((double) TimefameAsInteger(Period()) / (double)TimefameAsInteger(target_timeframe));
   return((int) result);
  }

int TimefameAsInteger(ENUM_TIMEFRAMES src)
  {
   if(PERIOD_M1)
      return(1);
   if(PERIOD_M2)
      return(2);
   if(PERIOD_M3)
      return(3);
   if(PERIOD_M4)
      return(4);
   if(PERIOD_M5)
      return(5);
   if(PERIOD_M6)
      return(6);
   if(PERIOD_M10)
      return(10);
   if(PERIOD_M12)
      return(12);
   if(PERIOD_M15)
      return(15);
   if(PERIOD_M30)
      return(30);
   if(PERIOD_H1)
      return(60);
   if(PERIOD_H2)
      return(120);
   if(PERIOD_H3)
      return(180);
   if(PERIOD_H4)
      return(240);
   if(PERIOD_H6)
      return(360);
   if(PERIOD_H8)
      return(480);
   if(PERIOD_H12)
      return(720);
   if(PERIOD_D1)
      return(1440);
   if(PERIOD_W1)
      return(10080);
   if(PERIOD_MN1)
      return(302400);
   return(0);
  }

 В входящих параметрах у меня есть 

input ENUM_TIMEFRAMES st_1_timeframe=PERIOD_M1;
input ENUM_TIMEFRAMES st_2_timeframe=PERIOD_M2;
input ENUM_TIMEFRAMES st_3_timeframe=PERIOD_M3;
Документация по MQL5: Обработка событий / OnCalculate
Документация по MQL5: Обработка событий / OnCalculate
  • www.mql5.com
события Calculate для обработки изменений ценовых данных. Существуют два варианта функции, в пределах одного индикатора нельзя использовать оба варианта. [in]  Размер массива price[] или входных таймсерий, доступных индикатору для расчета. Во втором варианте функции значение параметра соответствует количеству баров на графике, на котором он...
Причина обращения: