Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Justinas Shimkus
179
Justinas Shimkus  

Добрый день.

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

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
Модератор
85596
Vladimir Karputov  
Justinas Shimkus:

Добрый день.

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

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

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

Что не так ?

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

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

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

Уже спасибо. 

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

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

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


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

Vladimir Karputov
Модератор
85596
Vladimir Karputov  
Alexey Viktorov:

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

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


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

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

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

Sergey Gritsay
6764
Sergey Gritsay  

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  
Спасибо большое за помощь.
Dmitry Fedoseev
47903
Dmitry Fedoseev  
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
47903
Dmitry Fedoseev  
Sergey Gritsay:

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

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

... 

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