Скачать MetaTrader 5

MqlDateTime и Array out of range. Я неправильно обращаюсь к элементу структуры ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись ссылками на форуме. Теперь они имеют Rich Content!
Justinas Shimkus
179
Justinas Shimkus 2016.05.27 16:35 

Добрый день.

Я объявил массив таким типом структуры:

MqlDateTime timerate[];
if (timerate[j].day_of_week == 0) DayOfWeek = "Sun";

 , где j - номер бара отсчитывается от текущего времени.

Терминал выдает Array out of range в этой строчке.

Что не так ?

Хотя, одновременно с этим:

MqlRates mrate[];
PrTime = mrate[j].time;
Price = mrate[j].close;

 В этих строчках все работает.

Что я не так делаю ?

Уже спасибо. 

Vladimir Karputov
Модератор
46064
Vladimir Karputov 2016.05.27 16:40  
Justinas Shimkus:

Добрый день.

Я объявил массив таким типом структуры:

 , где j - номер бара отсчитывается от текущего времени.

Терминал выдает Array out of range в этой строчке.

Что не так ?

Хотя, одновременно с этим:

 В этих строчках все работает.

Что я не так делаю ?

Уже спасибо. 

Объявить массив - это пол-дела. Вы возьмите и проверьте, а какой у Вас размер динамического массива сразу после объявления? (ArraySize). И сразу станет ясно, где собачка порылась ...
Alexey Viktorov
6894
Alexey Viktorov 2016.05.27 18:20  

А зачем замерять размер массива если он не заполнялся? Да и дальше тоже вряд-ли работает. Просто компилятор находит первое обращение к несуществующему индексу массива и предупреждает о нём.

Но это ещё не всё... В MqlDateTime не массив должен быть.


ps; Извиняюсь, не сразу заметил что в первом случае MqlDateTime а во втором MqlRates где должен быть массив.

Vladimir Karputov
Модератор
46064
Vladimir Karputov 2016.05.27 18:54  
Alexey Viktorov:

А зачем замерять размер массива если он не заполнялся? Да и дальше тоже вряд-ли работает. Просто компилятор находит первое обращение к несуществующему индексу массива и предупреждает о нём.

Но это ещё не всё... В MqlDateTime не массив должен быть.


ps; Извиняюсь, не сразу заметил что в первом случае MqlDateTime а во втором MqlRates где должен быть массив.

И в первом и во втором случае - массивы: массивы структур. 

А замерить размер я посоветовал, для того, чтобы натолкнуть вопрошающего на правильный ход мыслей... 

Sergey Gritsay
6475
Sergey Gritsay 2016.05.27 19:09  

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

//+------------------------------------------------------------------+
//|                                                      test_03.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Tools\DateTime.mqh>

MqlDateTime data;
MqlRates rates[];
CDateTime date;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int bar=10;
   int copied=CopyRates(NULL,0,0,bar,rates);
   if(copied<=0)
      Print("Ошибка копирования ценовых данных ",GetLastError());
   else Print("Скопировано ",ArraySize(rates)," баров");

   for(int i=0;i<bar;i++)
     {
      TimeToStruct(rates[i].time,data);
      Print("DayOfWeek = ",data.day_of_week," - ",date.DayName(data.day_of_week));
     }

  }
//+------------------------------------------------------------------+

 Результат на графике D1

HI      0       00:06:09.116    test_03 (EURUSD,D1)     Скопировано 10 баров
GM      0       00:06:09.116    test_03 (EURUSD,D1)     DayOfWeek = 1 - Monday
CI      0       00:06:09.116    test_03 (EURUSD,D1)     DayOfWeek = 2 - Tuesday
QP      0       00:06:09.116    test_03 (EURUSD,D1)     DayOfWeek = 3 - Wednesday
LF      0       00:06:09.116    test_03 (EURUSD,D1)     DayOfWeek = 4 - Thursday
PO      0       00:06:09.116    test_03 (EURUSD,D1)     DayOfWeek = 5 - Friday
PF      0       00:06:09.117    test_03 (EURUSD,D1)     DayOfWeek = 1 - Monday
LQ      0       00:06:09.117    test_03 (EURUSD,D1)     DayOfWeek = 2 - Tuesday
JH      0       00:06:09.117    test_03 (EURUSD,D1)     DayOfWeek = 3 - Wednesday
CN      0       00:06:09.117    test_03 (EURUSD,D1)     DayOfWeek = 4 - Thursday
GG      0       00:06:09.117    test_03 (EURUSD,D1)     DayOfWeek = 5 - Friday

... 

Justinas Shimkus
179
Justinas Shimkus 2016.05.27 19:42  
Спасибо большое за помощь.
Dmitry Fedoseev
42919
Dmitry Fedoseev 2016.05.28 07:11  
Justinas Shimkus:

Добрый день.

Я объявил массив таким типом структуры:

 , где j - номер бара отсчитывается от текущего времени.

Терминал выдает Array out of range в этой строчке.

Что не так ?

Хотя, одновременно с этим:

 В этих строчках все работает.

Что я не так делаю ?

Уже спасибо. 

Видимо что-то не договариваете. Во втором случае тоже будет out of range. Наверно выдрали куски кода. Во втором случае работает без ошибок наверно потому-что перед обращением к массиву вызывали CopyRates(), эта функция сама масштабирует массив. В первом случае массив не имеет размера, поэтому и получается ошибка out of range (вне диапазона). Надо при объявлении массива указать ему размер:

MqlDateTime timerate[1];

или потом изменить его:

MqlDateTime timerate[];
ArrayResize(timerate,1);

Только, скорее всего, нет необходимости использования массива для времени, можно просто переменную использовать:

MqlDateTime timerate;
Dmitry Fedoseev
42919
Dmitry Fedoseev 2016.05.28 07:16  
Sergey Gritsay:

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

 Результат на графике D1

... 

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