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

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

у вас есть время?
ищите бар с помощью iBarShift

 
Taras Slobodyanik:

у вас есть время?
ищите бар с помощью iBarShift

Здравствуйте,у меня нет  времени бара. По сути у меня есть функция, в котором используются OHLC и Volume. Эту функцию необходимо прогнать по всем барам таймфрейма, выбранного в настройках индикатора. И там где функция покажет true, то от этого бара выстраивать линии (уровни). Я это сделал через  CopyRates, но выходит ошибка array out of range при переключении разных тайм фреймов

  int a = iBars(NULL,TimeFrame);
   for(int i = 1; i < a ;  i++)
     {
      MqlRates rates2[];
      int _ratesCopied3=CopyRates(_Symbol,TimeFrame,1,a,rates2) 
        и дальше работа с rates2[i].open,rates2[i].close и т.д. 
      .........
      .........

      }


 
good_boy86:
Здравствуйте,у меня нет  времени бара. По сути у меня есть функция, в котором используются OHLC и Volume. Эту функцию необходимо прогнать по всем барам таймфрейма, выбранного в настройках индикатора. И там где функция покажет true, то от этого бара выстраивать линии (уровни). Я это сделал через  CopyRates, но выходит ошибка array out of range при переключении разных тайм фреймов

"array out of range" сообщает номер строки, открываете редактор, находите где это, исправляете ошибку.
Для понимания можно добавить принт перед строкой с ошибкой, чтобы увидеть какое значение переменной было в этот момент.

Все уже сказано выше - бары на разных периодах не совпадают.

 
good_boy86:
Здравствуйте,у меня нет  времени бара. По сути у меня есть функция, в котором используются OHLC и Volume. Эту функцию необходимо прогнать по всем барам таймфрейма, выбранного в настройках индикатора. И там где функция покажет true, то от этого бара выстраивать линии (уровни). Я это сделал через  CopyRates, но выходит ошибка array out of range при переключении разных тайм фреймов



Просто код неправильный. И он, конечно же, приведет к выходу за пределы массива. Во-первых, зачем делать цикл, если CopyRates постоянно запрашивает одни и те же данные? Нужно либо убрать цикл, либо вынести CopyRates из цикла.

Во-вторых, значение a - это полное количество баров на ТФ. Запрашивая данные с бара, имеющего индекс 1, никак не получить "a" данных, только a - 1. Отсюда и вылет.

Проще всего сделать так:

int nTFBars = iBars(NULL, TimeFrame);
MqlRates arrstRates[];
int nBarsCopied = CopyRates(Symbol(), TimeFrame, 1, nTFBars - 1, arrstRates);
if (nBarsCopied != nTFBars - 1)
{
    Print("error...");
    return;
}
 
for (int i = nTFBars - 1; i >= 0; --i)
{
    // По "барам" массива arrstRates
}

Я так думаю, что причина получения ошибки - обращение к двум элементам массива, которых не существует. Вы игнорируете элемент с индексом 0 (а он Вам нужен, Вы его запросили, в нем данные самого последнего бара в истории), но пытаетесь достучаться к элементам с индексами a (в моем коде nTFBars) и a - 1 (в моем коде nTFBars - 1), которых не существует.

Причина обращения: