Зачем пересчитывать последний посчитанный бар? IndicatorCounted().

 
Есть пример для функции IndicatorCounted().

  int start()
    {
     int limit;
     int counted_bars=IndicatorCounted();
  //---- последний посчитанный бар будет пересчитан
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
  //---- основной цикл
     for(int i=0; i<limit; i++)
       {
        //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
        ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
        ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
       }
  //----
     return(0);
    }
https://docs.mql4.com/ru/customind/indicatorcounted


Зачем тут пересчитывать последний посчитанный бар?
 
Максим Дмитриев:
Есть пример для функции IndicatorCounted().

Зачем тут пересчитывать последний посчитанный бар?

Очень просто. Вот для иллюстрации два одинаковых графика М1 и на них EMA-6.

Но на левом графике по ценам закрытия - т.е. обновление на каждый тик. А на правом - по ценам открытия, т.е. расчет в начале каждого бара. Видно, что правая отстает на 1 бар. И самое главное - правый конец линии. Слева происходит перерисовка каждый тик. Цена ушла вниз, и линия тянется за ней. Она показывает тренд сейчас. Справа линия обновится при появлении нового бара. Перерисовка отсутствует. Линия отстала от цены. Ну хорошо это на минутном графике. А если на дневном! Представляете, линия будет обновляться один раз в день!!!

 
Теперь понятно?
 
Максим Дмитриев:
Есть пример для функции IndicatorCounted().

https://docs.mql4.com/ru/customind/indicatorcounted


Зачем тут пересчитывать последний посчитанный бар?

На тот редкий случай, когда тики приходят пачкой, 3 и более подряд, при этом 2 попадают на "старый" бар, а третий на новый, то может получиться такая чехарда: На первом тике вычисление проходило слишком долго, второй тик был пропущен, но цена изменилась. И вот на третьем тике, уже на новом баре получится неверное значение из-за пропущенного тика. А вызов индикатора из советника увеличивает такую вероятность.

 

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

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