У меня глюк, или отныне индексация исторических данных происходит задом наперед?

 
После такого вот взятия исторических данных, в raters[3] оказывается таймсерия нулевого бара!
MqlRates raters[4];
CopyRates(m_symbol, m_timeframe, 0, 4, raters);
Print(raters[1].low, "; ", raters[2].low, "; ", raters[3].low);

Этот код в тестере пишет:

2010.08.13 17:48:32 Core 1 2010.08.11 23:56:59 1.32163; 1.30742; 1.28299

Здесь значение 1.28299 (или raters[3]) соответствует Low дневного бара за 2010.08.11, а значение 1.32163 (или raters[1]) соответствует Low дневного бара за 2010.08.09!

Вопрос: ЗАЧЕМ это так?

 

 
Если наблюдаемое поведение не соотвествует  тому, что написано в разделе Направление индексации в массивах и таймсериях - сообщите, пожалуйста, в Сервисдеск.

 

В том то и дело, что соответствует:

Как видно, первые бары становятся последними, а последними - первыми. Допустим если нам нужно достать Low[0] (минимум текущего бара) из исторических данных, и сравнить его с минимумом три бара назад, то бар Low[3] попадет в raters_array[0], а минимум текущего бара будет находится в raters_array[2]!!! Я в шоке, зачем так сделали я понять не могу?

 
Пользуйтесь функцией ArraySetAsSeries

 
Rosh:
Пользуйтесь функцией ArraySetAsSeries

Позвольте ответить цитатой из документации:

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

Я пробовал. Порядок не меняется. В точности как и сказано в документации.

 

 
C-4:

Позвольте ответить цитатой из документации:

Я пробовал. Порядок не меняется. В точности как и сказано в документации.

 
Меняйте направление индексации в массиве-приемнике. Нико не мешает хранить данные в том порядке, который Вам необходим.
 
Rosh:
Меняйте направление индексации в массиве-приемнике. Нико не мешает хранить данные в том порядке, который Вам необходим.

Я же говорю,  я пробовал менять индексацию. Вот код тестового скрипта:

#property copyright "Copyright 2010, Vasily Sokolov (C-4)."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates raters[4];
   ArraySetAsSeries(raters, true);
   CopyRates(_Symbol, PERIOD_CURRENT, 0, 4, raters);
   Print(raters[0].low);
   ArraySetAsSeries(raters, false);
   CopyRates(_Symbol, PERIOD_CURRENT, 0, 4, raters);
   Print(raters[0].low);
  }
//+------------------------------------------------------------------+

 Не зависимо от индексации массива, функция Print пишет одно и тоже значение (оно равно минимуму четвертого бара)!

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
C-4:

Я же говорю,  я пробовал менять индексацию. Вот код тестового скрипта:

 Не зависимо от индексации массива, функция Print пишет одно и тоже значение (оно равно минимуму четвертого бара)!

Не любит у нас народ справки читать:

Примечание

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

Вот Ваш пример:

//+------------------------------------------------------------------+
//|                                              Check_MqlRates .mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates raters[];

   CopyRates(_Symbol,PERIOD_CURRENT,0,4,raters);
   ArraySetAsSeries(raters,true);
   Print(raters[0].low);

   CopyRates(_Symbol,PERIOD_CURRENT,0,4,raters);
   ArraySetAsSeries(raters,false);

   Print(raters[0].low);

  }
//+------------------------------------------------------------------+
 
О... Теперь понял:)
 
C-4:

Я же говорю,  я пробовал менять индексацию. Вот код тестового скрипта:

 Не зависимо от индексации массива, функция Print пишет одно и тоже значение (оно равно минимуму четвертого бара)!

Интересно, почему почти никто не проверяет значение, возвращаемое функциями, особенно теми, что могут неудачно завершиться? Если прогнать код ниже, то в лог запишется одно:

#property copyright "Copyright 2010, Vasily Sokolov (C-4)."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates raters[4];
   Print("ArraySetAsSeries(raters, true) = ", ArraySetAsSeries(raters, true));
   CopyRates(_Symbol, PERIOD_CURRENT, 0, 4, raters);
   Print(raters[0].low);
   Print("ArraySetAsSeries(raters, false) = ", ArraySetAsSeries(raters, false));
   CopyRates(_Symbol, PERIOD_CURRENT, 0, 4, raters);
   Print(raters[0].low);
  }
//+------------------------------------------------------------------+

А если прогнать тот же код, но с таким исправлением:

   MqlRates raters[];

То в лог запишется другое.

Кстати, CopyRates() тоже может вернуть ошибку.

И только Print() не может.

 
simpleton:

Интересно, почему почти никто не проверяет значение, возвращаемое функциями, особенно теми, что могут неудачно завершиться?

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