Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasiliy Sokolov
25572
Vasiliy Sokolov  
После такого вот взятия исторических данных, в 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!

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

 

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

Vasiliy Sokolov
25572
Vasiliy Sokolov  

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

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

Rashid Umarov
Админ
12400
Rashid Umarov  
Пользуйтесь функцией ArraySetAsSeries

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

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

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

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

 

Rashid Umarov
Админ
12400
Rashid Umarov  
C-4:

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

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

 
Меняйте направление индексации в массиве-приемнике. Нико не мешает хранить данные в том порядке, который Вам необходим.
Vasiliy Sokolov
25572
Vasiliy Sokolov  
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
Rashid Umarov
Админ
12400
Rashid Umarov  
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);

  }
//+------------------------------------------------------------------+
Vasiliy Sokolov
25572
Vasiliy Sokolov  
О... Теперь понял:)
Простак
315
Простак  
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() не может.

o_o
Модератор
24112
o_o  
simpleton:

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

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