Помогите решить ошибку массива

 

Коллеги, нужна помощь, пишу код советника:

   for (int i = 1440; i > 0; i--)
   {
      
      zigzag = iCustom(Symbol(), PERIOD_CURRENT, "ZigZag", ZigZagDepth, 5, 3, 0, i);
      
      if(zigzag == High[i])
        {

выдает ошибку на первом тике:

USDJPY,M15: array out of range in 'smartmoney.mq4' (155,24)

не понимаю почему


 
Roman Meskhidze:

Коллеги, нужна помощь, пишу код советника:

выдает ошибку на первом тике:

USDJPY,M15: array out of range in 'smartmoney.mq4' (155,24)

не понимаю почему


Скорее всего не хватает исторических данных
 
Yevhenii Levchenko:
Скорее всего не хватает исторических данных

тоже так подумал. но во-первых они есть. пробовал и разные символы.

во-вторых даже если изменить цикл и начинать его с 0, то та же ошибка.

не понимаю

 
Roman Meskhidze:

тоже так подумал. но во-первых они есть. пробовал и разные символы.

во-вторых даже если изменить цикл и начинать его с 0, то та же ошибка.

не понимаю

У меня недавно похожее было. Добавьте глобальную bool переменную и пропустите первый тик:

bool b=false


        if (b){
                //вычисления
        }
b=true;

Я это случайно решил. В чем проблема точно не знаю, но это помогло. Попробуйте

 
Вот здесь такое же было. Там же и решение
 

заменил на iHigh(Symbol(), PERIOD_CURRENT, i) и ошибка ушла

БРЕД какой-то

 
Roman Meskhidze:

заменил на iHigh(Symbol(), PERIOD_CURRENT, i) и ошибка ушла

БРЕД какой-то

Главное  что работает... )

 

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

Чтобы такого не было, используйте те подходы к разработке индикаторов, которые показаны в документации.

     int counted_bars = prev_calculated; 
  //---- последний посчитанный бар будет пересчитан 
     if (counted_bars > 0) 
        counted_bars--; 
     int limit = rates_total - counted_bars;
     for (int i = limit; i >= 0; --i)
     {
     }

Это надежно. А обращаться к данным только на том основании, что "я их вижу" совершенно несерьезно.

 
Roman Meskhidze:

заменил на iHigh(Symbol(), PERIOD_CURRENT, i) и ошибка ушла

БРЕД какой-то

А теперь проверьте, что возвращает на первом тике iHigh )))

 
Ihor Herasko:

А теперь проверьте, что возвращает на первом тике iHigh )))

я пишу советника, а не индикатор

 
Roman Meskhidze:

я пишу советника, а не индикатор

В данном случае нет никакой разницы. Только причина отсутствия исторических данных другая. А вот причина ошибки (выход за пределы массива) одна и та же.

В цикле тогда нужно изменить:

 for (int i = fmin(1440, iBars(NULL, PERIOD_CURRENT) - 1); i > 0; i--)
Причина обращения: