Только начал переходить от mql4 к mql5 и вот первая непонятка: нумерация баров изменилась или нет?

 

Справочник по mql5 гласит

Доступ к таймсериям и данным индикаторов

...Исторически сложилось так, что доступ к данным в ценовом массиве производился с конца данных. Физически новые данные всегда дописываются в конец массива, но индекс этого массива всегда равен нулю. Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть  бара, который соответствует незавершенному промежутку времени на данном таймфрейме.

Если я это правильно понял, то нумерация баров такая же как и в mql4, т.е. текущий бар имеет индекс 0. Но если посмотреть на код Custom Moving Average.mq5 то вижу

void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)// first calculation
     {
      limit=InpMAPeriod+begin;
      //--- set empty value for first limit bars
      for(i=0;i<limit-1;i++) ExtLineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit-1]=firstValue;
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total;i++)
      ExtLineBuffer[i]=ExtLineBuffer[i-1]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

 где выделенная красным цветом линия говорит мне что более давние цены имеют меньший индекс, что противоречит справочнику. Теперь поглядим на код того же индикатора в mql4

void sma()
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--)
      sum+=Close[pos];
//---- main calculation loop
   while(pos>=0)
     {
      sum+=Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
           sum-=Close[pos+MA_Period-1];

           pos--;
     }
//---- zero initial bars
   if(ExtCountedBars<1)
      for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }

 Тут всё сходится - более давние бары имеют больший индекс.

Так какова же ситуация в mql5? Судя по всем индикаторам, которых я видел здесь, нумерация баров изменилась и теперь текущий бар имеет индекс rates_total-1. Или я чего-то не понимаю? Поправьте либо меня, либо справочник.

 

Вот, в догонку

Направление индексации в массивах, буферах и таймсериях

Все массивы и индикаторные буферы по умолчанию имеют направление индексации слева направо. Индекс первого элемента всегда равен нулю. Таким образом, самый первый элемент массива или индикаторного буфера с индексом 0 по умолчанию находится на крайней левой позиции, последний элемент находится на крайней правой позиции.

Индикаторный буфер представляет из себя динамический массив типа double, размером которого управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается. Обычный динамический массив типа double назначается в качестве индикаторного буфера с помощью функции SetIndexBuffer(). Для индикаторных буферов не требуется задавать размер с помощью функции ArrayResize(), исполняющая система терминала сама позаботится об этом.

Таймсерии представляют из себя массивы с обратной индексацией, то есть самый первый элемент таймсерии находится на крайней правой позиции, а последний элемент таймсерии находится на крайней левой позиции. Так как таймсерии предназначены для хранения исторических ценовых данных по финансовым инструментам и обязательно содержат информацию о времени, то можно сказать, что самые свежие данные в таймсерии находятся в правой крайней позиции, а самые старые в крайней левой позиции.

Поэтому, элемент с индексом ноль в таймсерии содержит информацию о самой последней котировке по инструменту. Если таймсерия представляет данные по дневному таймфрейму, то на нулевой позиции содержатся данные текущего незавершенного дня, а на позиции с индексом один хранятся данные вчерашнего дня. 

 

То есть получается что price[] это не таймсерия, а по умалчанию буфер, если не использовать ArraySetAsSeries(). Правильно?

 

tochno =)))

i eshe mnogo veselogo v mql5 =))))

 
CoreWinTT:

tochno =)))

i eshe mnogo veselogo v mql5 =)))) 

Вообще-то я приветствую изменение в нумерации баров. Если советник собирает информацию на старых барах и хранит эту информацию в массивах, то намного удобнее последние нумеровать слева направо так чтобы при поступлении нового бара не нужно было сдвигать индексы всех массивов для хранения новой информации. Так логичнее и код получается чище.
Причина обращения: