как можно программно опрделить подкачку истории в индикаторе

 
 

Для мультивалютников есть один способ, для других другой

int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars;
   if (limit>1) // если больше 1, то произошло изменение истории
      limit=Bars-PeriodK*K-1;
      
   // цикл обработки
   for (int i=limit;i>=0;i--) {}
//----
   return(0);
  }

Мой стандартный индикатор

 

отлично, спасибо!

то есть, если limit = 1 то появился новый бар, a когда подкачена история limit>1

 
wlad:

отлично, спасибо!

то есть, если limit = 1 то появился новый бар, a когда подкачена история limit>1

Обычно limit равно 0 или 1, если больше 1 - то полный перерасчет
 
Vinin:
Обычно limit равно 0 или 1, если больше 1 - то полный перерасчет

функция IndicatorCounted() возвращает реально посчитанное количество баров минус один.

limit будет равен 1 при новом тике,

2 при появлении нового бара.

При больше двух - полный перерасчет.

 
Swan:

функция IndicatorCounted() возвращает реально посчитанное количество баров минус один.

limit будет равен 1 при новом тике,

2 при появлении нового бара.

При больше двух - полный перерасчет.


Извините, пройденный этап. Если есть желание до всего доходить своим умом - то никто не и мешает. Только 0 и 1
 
Vinin:

Только 0 и 1

Таки уверенны?

Хорошо, не буду Вам мешать)

 
Swan:

как можно программно опрделить подкачку истории в индикаторе

при потере/начале связи ситуация с подкачкой неопределена. связано с недокументированными условиями обнуления функции IndicatorCounted().

тут немного обсуждалось: https://www.mql5.com/ru/forum/132490/page33

 

Я делаю так, если нужны особенные виды просчета, когда IndicatorCounted() не подходит.

barsLastTime = 0; ///В начале кода

start()
  {
   ............
   int iStart = 0;
   int iEnd = 0;

   if (barsLastTime == 0)
     {
      iStart = maxRaschet + MAPeriod - 2;
     }
   else
     {
      iStart = iBarShift(NULL, 0, barsLastTime, true);
      if (iStart < 0)
        {
         //// Что то не то. Можно и обнулить буфера и сделать просчет заново
         ..........
        }
     }
   
   if (iStart < iEnd) return(0);
   ////Просчет индикатора
   for(i = iStart; i >= iEnd; i--)
     {
      ..........
      barsLastTime = Time[i];
     }
   ..........
  }
 
Vinin:
Обычно limit равно 0 или 1, если больше 1 - то полный перерасчет

сразу не внимателно просмотрел и действително 1 и 2 выходит, логично конечно

спасибо за заметку Swan

 

спасибо Vinin, Swan, Andrey01 и rlx,

все так просто

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