Ошибка новичка - Array out of range in, помогите

 

Здравствуйте, помогите пожалуйста решить данную проблему

В терминале, на таймфрейме Неделя (да и на других таймфремах), после прохождения всех баров , появляется ошибка -  array out of range in 'indic.mq5' (59,27)


Похоже что-то с размерностью массива, подскажите как исправить,  заранее спасибо

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2021, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "1"
#property link      "1"
#property version   "1.00"


#property indicator_chart_window


int OnInit()
  {

   return(INIT_SUCCEEDED);
  }


int OnCalculate(
   const int bars,
   const int counted,
   const datetime &time[],
   const double &open[],
   const double &high[],
   const double &low[],
   const double &close[],
   const long &tickVolume[],
   const long &volume[],
   const int &spread[])
  {

   int start = MathMax(counted - 1, 1);

   datetime time1;
   long volume1;
   double high1;
   double low1;
   double open1;
   double close1;

   CalculateVolume1(start, bars, time1, volume1, high1,low1, open1, close1);

   return(bars);
  }

int CalculateVolume1(int start, int bars,datetime time1,  long volume1,  double high1,  double low1,  double open1, double close1)
  {

   MqlRates rates_week2[];

   int _ratesCopied3=CopyRates(_Symbol,PERIOD_W1,start,bars,rates_week2);

   for(int i = start; i < bars ;  i++)

     {

      time1 = rates_week2[i].time; - указывает что ошибка здесь
      
      Print(time1);

     }

   return(0);
  }



Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
ArraySize - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Вы не учитываете, что на разных таймфреймах РАЗНОЕ количество баров.
 
Vladimir Karputov:
Вы не учитываете, что на разных таймфреймах РАЗНОЕ количество баров.Спа

Спасибо за ответ!  Необходимо делать проверку таймфрейма перед циклом? что тайм фрем совпадал с тем который указан в СopyRates?

 
good_boy86:

Спасибо за ответ!  Необходимо делать проверку таймфрейма перед циклом? что тайм фрем совпадал с тем который указан в СopyRates?

Все аргументы обработчика OnCalculate() относятся только к текущему ТФ. При использовании другого ТФ они невалидны, потребуется преобразование.

При этом никто не запрещает продублировать все эти данные для нужного ТФ. К примеру, для bars:

bars = iBars(NULL, <yourTF>);

Для остальных аргументов чуть сложнее, но все равно достаточно просто, чтобы не получилось сделать даже с небольшим опытом программирования.

 
good_boy86:

Спасибо за ответ!  Необходимо делать проверку таймфрейма перед циклом? что тайм фрем совпадал с тем который указан в СopyRates?

Неясна Ваша цель - зачем Вам CopyRates вообще, если OnCalculate УЖЕ передаёт все массивы для текущего таймфрейма?

 
Vladimir Karputov:

Неясна Ваша цель - зачем Вам CopyRates вообще, если OnCalculate УЖЕ передаёт все массивы для текущего таймфрейма?

Я хочу чтобы индикатор рассчитывал определенные уровни на старшем таймфрейме и рисовал трендовые линии и эти же трендовые линии отображал на младшем фрейме. Например, расчет был на H1, и эти же уровни отображались на M5 или каком либо другом таймфрейме.
 
Ihor Herasko:

Все аргументы обработчика OnCalculate() относятся только к текущему ТФ. При использовании другого ТФ они невалидны, потребуется преобразование.

При этом никто не запрещает продублировать все эти данные для нужного ТФ. К примеру, для bars:

Для остальных аргументов чуть сложнее, но все равно достаточно просто, чтобы не получилось сделать даже с небольшим опытом программирования.

Спасибо за ответ, мне необходимо из определенных баров с другова таймфрейма (не текущего) брать такие свойства как: close, open, volume,time.
 
good_boy86:
Спасибо за ответ, мне необходимо из определенных баров с другова таймфрейма (не текущего) брать такие свойства как: close, open, volume,time.

В таком случае Вам с меньшего таймфрейма нужно выполнить iBarShift - чтобы получить номер бара со старшего таймрейма. И потом уже по номеру бара получать OHLC со старшего таймфрейма.

Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
  • www.mql5.com
iBarShift - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ihor Herasko:

Все аргументы обработчика OnCalculate() относятся только к текущему ТФ. При использовании другого ТФ они невалидны, потребуется преобразование.

При этом никто не запрещает продублировать все эти данные для нужного ТФ. К примеру, для bars:

Для остальных аргументов чуть сложнее, но все равно достаточно просто, чтобы не получилось сделать даже с небольшим опытом программирования.

Благодарю за ответ! С помощью функции  iBars, я взял количество  баров с нужного таймфрейма, а теперь, как  взять open и close и другие свойства нужного мне бара?

 
good_boy86:

Благодарю за ответ! С помощью функции  iBars, я взял количество  баров с нужного таймфрейма, а теперь, как  взять open и close и другие свойства нужного мне бара?

Для начала нужно определить бар другого ТФ, который соответствует бару текущего ТФ. Это делается при помощи функции iBarShift. Ну а далее, зная индекс бара, используются либо функции типа Copy (CopyRates, CopyHigh, CopyOpen и т. п.) или напрямую iOpen, iClose и т. п.

 
Ihor Herasko:

Для начала нужно определить бар другого ТФ, который соответствует бару текущего ТФ. Это делается при помощи функции iBarShift. Ну а далее, зная индекс бара, используются либо функции типа Copy (CopyRates, CopyHigh, CopyOpen и т. п.) или напрямую iOpen, iClose и т. п.

Вы написали  -   Для начала нужно определить бар другого ТФ, который соответствует бару текущего ТФ - а если этот бар (который соответствует моему алгоритму)был неделю или месяц назад, тогда как его индекс и свойства получить?
Причина обращения: