2 вопроса МТ5 - страница 5

 

Скорее всего проблема в OnCalculate

Вот схема 

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
{
//---
   int i;
   
   ResetLastError();
   
   for(i = 0; i < (prev_calculated == 0 ? bars_calc - 2 : rates_total - prev_calculated); i++)
   {
      if(prev_calculated == 0)
      {
         // тут расчёт bars_calc
            
            Print(Symbol()," Начальный рассчёт индикатора.");
            for(int n = bars_calc - 2; n >= 0; n--)
            {
               calculating(n);
               if(i < bars_calc - odds_bars)
               {
                  Код окончательного расчёта Buffer_plots[n]
               }
               else Buffer_plots[n] = EMPTY_VALUE;
            }
            Print(Symbol()," Начальный расчёт индикатора завершён.");
            Print(Symbol()," Обработка новых данных.");
            Print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
      }
      else
      {
         calculating(i);
         if(i < bars_calc - odds_bars)
         {
            Код окончательного расчёта Buffer_plots[i]
         }
         else Buffer_plots[i] = EMPTY_VALUE;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
void calculating(int need_bar)
{
   ResetLastError();
   
   for(int i = 0; i < ArraySize(symbols_name); i++)
   {
      if(!copyBuffers(symbols_name[i],need_bar,request_close))
      {
         Print("Ошибка копирования буферов || GetLastError = ",GetLastError());
         ChartIndicatorDelete(0,0,indicatorSHORTNAME);
      }
      else
      {
         Предварительный расчёт индикатора
      }
   }
//+---------------------
   return;
}
//+------------------------------------------------------------------+
bool copyBuffers(string symb, int start, double &buff[])
{
   ArrayFree(buff);

   if(CopyClose(symb,Period(),start+1,1,buff) < 1)
   {
      Print(__FUNCSIG__,"  Ошибка по символу ",symb,"  start = ",start+1);
      return(false);
   }
//--------------------
   return(true);
}
//+------------------------------------------------------------------+

Беда в том, что если закомментировать эти строки, индикатор работает не правильно...

 

Без ста грамм тут не разобраццо, и не буду утверждать, что всё понял. Понял, что в одном индюке идёт съём данных с нескольких символов.

В общем, 1) цикл надо считать по наименьшему количеству баров среди доступных по всем используемым символам, 2) если кол-во баров недостаточно для первого прохода, OnCalculate должна возвращать ноль. Поскольку символов несколько, возможно, что ноль она должна возвращать не только в первом проходе, а в любом случае, если кол-во баров недостаточно.

А, Артём уже это всё изложил. Но в коде выше это по-прежнему не отражено. Вроде бы. Надо накатить, иначе никак.

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

@Vladimir Karputov, спасибо ещё раз. Поэкспериментировал я с вариантами синхронизации данных, использование Вашего метода оказалось самым оптимальным. )))



Объясните кто-нибудь, как правильно это посчитать в индикаторе?

 

Что вызывает ошибку при вызове индикатора из советника? При том, что сам индикатор нормально становится на график вручную.

   ResetLastError();
   handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01",0,in_symb1,false,false,in_smoothing);
   if(handle_ICTMP1 == INVALID_HANDLE)                                                 // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_ICTMP1...",GetLastError());   // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                             // завершаем работу с ошибкой
   }
   else
   {
      Print("Получен хендл индикатора handle_ICTMP1");
      if(!MQLInfoInteger(MQL_OPTIMIZATION))
      {
         if(!ChartIndicatorAdd(ChartID(),0,handle_ICTMP1)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
      }
   }
2020.01.20 13:42:09.390 Core 1  file Indicators\my_used\ICTMP_3.01 read error
2020.01.20 13:42:09.390 Core 1  loading of ICTMP_ EURGBP,M15 failed [557]
2020.01.20 13:42:09.390 Core 1  2019.09.19 00:00:00   cannot load custom indicator 'my_used\ICTMP_3.01' [4802]
2020.01.20 13:42:09.390 Core 1  2019.09.19 00:00:00   Не удалось получить хендл индикатора handle_ICTMP1...4802
2020.01.20 13:42:09.390 Core 1  tester stopped because OnInit returns non-zero code
П.С. Это в тестере.
 
И это при том, что советник запускается на графике в реальном времени. (((