Помогите с проблемой : array out of range - страница 3

 
Не за что, удачи!
 

В лог-файле нахожу причину того, что Эксперт слетел с графика: array out of range. В строке и колонке, на которые там указано, нолик из строки "arr[0] = Price - m_trailing_step;". То есть, нулевой элемент массива выходит за его рамки, если я правильно понял, что это значит. Кусочек кода такой:

                if(Price - (SL - Price) - m_trailing_step < ask0 < Price)
                {
                      uint n = MathRound((SL - Price) / m_trailing_step); //??, n - на самом деле не меньше, чем это значение
                      if(n <= 0)
                      {
                         Print("Трейлингстоп res при n<=0 = ", IntegerToString(res));
                         return(res);
                      }
                      Print("PrSell1= " + DoubleToString(PrSell,2));
                      if(PrSell >= m_trailing_start)
                      {
                         double arr[];
                         //arr = new double arr[n];
                         for(uint i=0; i<=n; i++)
                         {
                            arr[0] = Price - m_trailing_step;
                            if(MathAbs(ask0 - arr[i]) >= 2 * m_trailing_step)
                            {
                               arr[i] -= m_trailing_step;
                               sl = NormalizeDouble(ask0 + m_trailing_step, _Digits);
                               if(ask0 >= ArrayMinimum(arr,0,i))sl = ArrayMinimum(arr,0,i);
                               Print("sl= " + DoubleToString(sl,5)+" Tp= " + DoubleToString(Tp,5));
                               if(!m_trade.PositionModify(m_position_ticket, sl, Tp))Print("ошибка модификации Селл по первому условию");
                            }
                            if(MathAbs(ask0 - arr[i]) < 2 * m_trailing_step && i > 0)i--; //i-- - ради того, чтобы n было строго равно
                         }
                      }
                      res = 0;
                      Print("Трейлингстоп res по селл1 = ", IntegerToString(res));
                      //return(res);
                 }

ИИ предлагал вместо динамического массива сделать статический. Но компилятор не принимает в качестве размера массива переменную. Тогда он мне советовал добавить строку

arr = new double arr[n];
Она в коде за комментирована. Но компилятор и тут выдает одни ошибки. Буду благодарен за помощь или/и ссылки, где по теме можно почитать.
 
maxvoronin74 #:

В лог-файле нахожу причину того, что Эксперт слетел с графика: array out of range. В строке и колонке, на которые там указано, нолик из строки "arr[0] = Price - m_trailing_step;". То есть, нулевой элемент массива выходит за его рамки, если я правильно понял, что это значит. Кусочек кода такой:

ИИ предлагал вместо динамического массива сделать статический. Но компилятор не принимает в качестве размера массива переменную. Тогда он мне советовал добавить строку

Она в коде за комментирована. Но компилятор и тут выдает одни ошибки. Буду благодарен за помощь или/и ссылки, где по теме можно почитать.

Не надо полагаться на ИскусственныйИдиотизм, он много ерунды посоветует. А вот динамическому массиву перед использованием надо задать размер ArrayResize

 
ZARA:

Приветствую Всех ! Заранее всем спасибо ! 

Я объединил 2 разных индикатора на основе QQE для личного использования. Эти индикаторы доступны в CodeBase.

У меня была проблема: Array out of a range.

Индикатор не работает в обновленной версии MQL4. Прекращает работу при "// # property strict".

Пожалуйста, помогите. 

Уважаемые админы. Пожалуйста не игнорируйте. Мне нужна помощь в решении этой проблемы. Уже 1 неделю не могу найти решение этой проблемы.


//============================================================================

1 индикатор - QQE


2 индикатор QQE 


не думал, что эта ветка продлится на 3 страницы

описываемая Вами ошибка появляется, если нет нужного элемента в массиве с индексом = ?

т.е. array[?] не существует

чтобы записать в массив с индексом ? значение, необходимо, чтобы длина массива была больше или равна значению (?+1)

длину можно проверить такой функцией:

ArraySize - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5

а увеличить, либо уменьшить такой функцией

ArrayResize - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5

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

удачи!

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

Не надо полагаться на ИскусственныйИдиотизм, он много ерунды посоветует. А вот динамическому массиву перед использованием надо задать размер ArrayResize

Благодарю. Почитал, как задать размер динамического массива функцией ArraySize, добавил строку "n=ArraySize(arr);" непосредственно перед циклом for. Теперь кусочек кода выглядит так:

                if(Price - (SL - Price) - m_trailing_step < ask0 < Price)
                {
                      uint n = MathRound((SL - Price) / m_trailing_step); //??, n - на самом деле не меньше, чем это значение
                      if(n <= 0)
                      {
                         Print("Трейлингстоп res при n<=0 = ", IntegerToString(res));
                         return(res);
                      }
                      Print("PrSell1= " + DoubleToString(PrSell,2));
                      if(PrSell >= m_trailing_start)
                      {
                         double arr[];
                         n=ArraySize(arr);
                         for(uint i=0; i<=n; i++)
                         {
                            arr[0] = Price - m_trailing_step;
                            if(MathAbs(ask0 - arr[i]) >= 2 * m_trailing_step)
                            {
                               arr[i] -= m_trailing_step;
                               sl = NormalizeDouble(ask0 + m_trailing_step, _Digits);
                               if(ask0 >= ArrayMinimum(arr,0,i))sl = ArrayMinimum(arr,0,i);
                               Print("sl= " + DoubleToString(sl,5)+" Tp= " + DoubleToString(Tp,5));
                               if(!m_trade.PositionModify(m_position_ticket, sl, Tp))Print("ошибка модификации Селл по первому условию");
                            }
                            if(MathAbs(ask0 - arr[i]) < 2 * m_trailing_step && i > 0)i--; //i-- - ради того, чтобы n было строго равно
                         }

И... снова та же ошибка.

 
maxvoronin74 #:

Благодарю. Почитал, как задать размер динамического массива функцией ArraySize, добавил строку "n=ArraySize(arr);" непосредственно перед циклом for. Теперь кусочек кода выглядит так:

И... снова та же ошибка.


ArrayResize(...)
 
Sergey Gridnev #:

ArrayResize(...)
Благодарю. Вроде, этот вопрос закрылся.
Причина обращения: