Постоянно лагает отображение индикатора

 

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

Я уже по всякому переделывал OnCalculate. Есть ли на опытный взгляд ошибка в логике?

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[])
  {
   string _comm;
   int StartTickCnt=(int)GetTickCount();
   
   
//---- проверка количества баров на достаточность для расчета
   if
   (BarsCalculated(CCI_Handle)<rates_total
    || BarsCalculated(ATR_Handle)<rates_total
    || rates_total<min_rates_total)
      return(0);

//---- объявления локальных переменных
   int to_copy;
  
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }

   if(IsStopped())   return(0);
   //if (isNewBar(PERIOD_CURRENT))
      {
      if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) { printf("Copying ATR failed! Error ",GetLastError());  return(0); }
      if(CopyBuffer(CCI_Handle,0,0,to_copy,CCI)<=0) { printf("Copying CCI failed! Error ",GetLastError());  return(0); }
      };
   //if(CopyBuffer(MOM_Handle,0,0,to_copy,MOM)<=0) { printf("Copying MOM failed! Error ",GetLastError());  return(0); }
   
   //ArrayInitialize(STTrend,0);
// 
   string _tradesignalDisplay;
   int start,i;
   if(prev_calculated<=min_rates_total) {start=min_rates_total; }  else  start=prev_calculated-1;
  
   for(i=start; i<rates_total && !IsStopped(); i++)
     {
      ExtOpen[i]=open[i]; ExtHigh[i]=high[i]; ExtLow[i]=low[i];  ExtClose[i]=close[i];
      HL2[i]=(high[i]+low[i])/2.0;
      double _JMAprice = getPrice(JMAPrice,open,close,high,low,i,rates_total);
      calcJMA(i,_JMAprice, rates_total, close[i]);
      calcPivots(i);
      calcST(i);
      calcLR(i,rates_total);
      calcMOM(i,rates_total);
      barColors(i);
      calcChop(i);
      calculateProfitTaker(i,ATR[i]);
      calcLRsignal(i);
      calcSignals(i, close, open);
      drawTradeSignals(i, time, high, low, _tradesignalDisplay);
      
     }
   
   //--- Show the information on the chart using a comment 
   int visbars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
   int _execTime=(int)GetTickCount() -StartTickCnt;
   _comm= "Time: " +(string)_execTime + " Rt: " + (string)rates_total +" pc: "+ (string)prev_calculated 
          + "\nvis: " +(string)visbars + " T:" + _tradesignalDisplay; 
   Comment(_comm); 
   //--- return value of prev_calculated for next call
   return(i);
   //return(rates_total); 
  }
 
Прикрепите пожалуйста файл при помощи кнопки  Прикрепить файл
 
Vladimir Karputov:
Прикрепите пожалуйста файл при помощи кнопки 

Дело походу не в файле. дата постоянно десинхронизируется в терминале ( наверное проблемы брокера). Но альтернативы брокеру нет. Как бы данные синхронизировать?

 
Max B:

Дело походу не в файле. дата постоянно десинхронизируется в терминале ( наверное проблемы брокера). Но альтернативы брокеру нет. Как бы данные синхронизировать?

Вам к экстрасенсам.

Может проблемы в этих функциях.

calcJMA(i,_JMAprice, rates_total, close[i]);
      calcPivots(i);
      calcST(i);
      calcLR(i,rates_total);
      calcMOM(i,rates_total);
      barColors(i);
      calcChop(i);
      calculateProfitTaker(i,ATR[i]);
      calcLRsignal(i);
      calcSignals(i, close, open);
      drawTradeSignals(i, time, high, low, _tradesignalDisplay);
 
Max B:

Дело походу не в файле. дата постоянно десинхронизируется в терминале ( наверное проблемы брокера). Но альтернативы брокеру нет. Как бы данные синхронизировать?

Нет кода - нет помощи.

 
Хочу сказать что корень проблемы оказалсь в  том , что OnCalculate вызывается каждый тик. При большом потоке тиков естественно не справляется. Надо будет писать ограничетель чтобы расчитывалось реже
 
Max B:
Хочу сказать что корень проблемы оказалсь в  том , что OnCalculate вызывается каждый тик. При большом потоке тиков естественно не справляется. Надо будет писать ограничетель чтобы расчитывалось реже

Ошибаетесь - проблема в писателе кода индикатора, а не в OnCalculate.

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