В том то и дело, что соответствует:
Как видно, первые бары становятся последними, а последними - первыми. Допустим если нам нужно достать Low[0] (минимум текущего бара) из исторических данных, и сравнить его с минимумом три бара назад, то бар Low[3] попадет в raters_array[0], а минимум текущего бара будет находится в raters_array[2]!!! Я в шоке, зачем так сделали я понять не могу?
Позвольте ответить цитатой из документации:
Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.
Я пробовал. Порядок не меняется. В точности как и сказано в документации.
Позвольте ответить цитатой из документации:
Я пробовал. Порядок не меняется. В точности как и сказано в документации.
Меняйте направление индексации в массиве-приемнике. Нико не мешает хранить данные в том порядке, который Вам необходим.
Я же говорю, я пробовал менять индексацию. Вот код тестового скрипта:
#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 пишет одно и тоже значение (оно равно минимуму четвертого бара)!
- www.mql5.com
Я же говорю, я пробовал менять индексацию. Вот код тестового скрипта:
Не зависимо от индексации массива, функция 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); } //+------------------------------------------------------------------+
Я же говорю, я пробовал менять индексацию. Вот код тестового скрипта:
Не зависимо от индексации массива, функция 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() не может.
Интересно, почему почти никто не проверяет значение, возвращаемое функциями, особенно теми, что могут неудачно завершиться?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Этот код в тестере пишет:
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!
Вопрос: ЗАЧЕМ это так?