Помогите с проблемой : array out of range

 

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

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

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

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

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

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


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

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

   int counted_bars=IndicatorCounted();
   int i,r,limit;
   if(counted_bars < 0) return(-1);
   if(counted_bars > 0) counted_bars--;
           limit = MathMin(Bars-counted_bars,Bars-1);
           if (ArrayRange(work,0) != Bars) ArrayResize(work,Bars); 
   double alpha1 = 2.0/(SF+1.0);
   double alpha2 = 2.0/(RSIPeriod*2.0);

   for (i=limit, r=Bars-i-1; i>=0; i--,r++)
   {  
      work[r][iRsi] = work[r-1][iRsi] + alpha1*(iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)   - work[r-1][iRsi]);
      work[r][iEma] = work[r-1][iEma] + alpha2*(MathAbs(work[r-1][iRsi]-work[r][iRsi]) - work[r-1][iEma]);
      work[r][iEmm] = work[r-1][iEmm] + alpha2*(work[r][iEma] - work[r-1][iEmm]);
         double rsi0 = work[r  ][iRsi];
         double rsi1 = work[r-1][iRsi];
         double dar  = work[r  ][iEmm]*WP;
         double tr   = work[r-1][iQqe];
         double dv   = tr;

            if (rsi0 < tr) { tr = rsi0 + dar; if ((rsi1 < dv) && (tr > dv)) tr = dv; }
            if (rsi0 > tr) { tr = rsi0 - dar; if ((rsi1 > dv) && (tr < dv)) tr = dv; }
         work[r][iQqe] = tr;
         trend1[i]     = trend1[i+1];
         trend2[i]     = trend2[i+1];
         RsMa[i]      = work[r][iRsi]-50;
         Trend[i]      = tr           -50;
         HistoU[i]     =  EMPTY_VALUE;
         HistoM[i]     =  EMPTY_VALUE;
         HistoD[i]     =  EMPTY_VALUE;
         if (RsiMa[i] > (UpperBound-50))                           HistoU[i] = RsiMa[i];
         if (RsiMa[i] < (LowerBound-50))                           HistoD[i] = RsiMa[i];
         if (HistoU[i] == EMPTY_VALUE && HistoD[i] == EMPTY_VALUE) HistoM[i] = RsiMa[i];
         if (RsiMa[i] > 0)        trend1[i] =  1;
         if (RsiMa[i] < 0)        trend1[i] = -1;
         if (RsiMa[i] > Trend[i]) trend2[i] =  1;
         if (RsiMa[i] < Trend[i]) trend2[i] = -1;
         manageArrow(i); 
     }    
manageAlerts();  


2 индикатор QQE 

    counted_bars2 = IndicatorCounted();
      if (counted_bars2 < 0) return (-1);
      if (counted_bars2 > 0) counted_bars2--;

      limit2 = Bars - counted_bars2;
      for (m = 0; m <= limit2; m++) {
         n = m;         u = 0;         k = 0;
         for (n = m; n <= m + 9; n++) k += MathAbs(High[n] - Low[n]);
         u = k / 10.0;
         zero_1 = iMA(NULL, 0, period_S, 0, MODE_EMA, PRICE_CLOSE, m);
         zero_2 = iMA(NULL, 0, period_S, 0, MODE_EMA, PRICE_CLOSE, m + 1);
         zero_3 = iMA(NULL, 0, period_S, 0, MODE_EMA, PRICE_CLOSE, m - 1);
         zero_4 = iMA(NULL, 0, period_R, 0, MODE_EMA, PRICE_CLOSE, m);
         zero_5 = iMA(NULL, 0, period_R, 0, MODE_EMA, PRICE_CLOSE, m + 1);
         zero_6 = iMA(NULL, 0, period_R, 0, MODE_EMA, PRICE_CLOSE, m - 1);

         if (zero_1 >  zero_4 &&  zero_2 < zero_5 && zero_3 > zero_6) {
            masU[m] = Low[m] - u / 2.0;

            if (m <= 2 && Alert_Hand && (!mb)) {
               Alert("G_strategy ",Symbol()," - ",TM," BUY");
               mb = TRUE;
               nb = FALSE;
            }
         } else {
            if (zero_1 <  zero_4 &&  zero_2 > zero_5 && zero_3 < zero_6) {
               masH[m] = High[m] + u / 2.0;
               if (m <= 2 && Alert_Hand && (!nb)) {
                  Alert("G_strategy ",Symbol()," - ",TM," SELL");
                  nb = TRUE;
                  mb = FALSE;
               }
            }
         }
      }


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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

пожалуйста помогите мне нужно чтобы каждый новый бар открывалась сделка мне нужно чтобы если Предыдущий бар был верх то buy если вниз то sell

Sergey Golubev, 2020.03.23 16:08

Вставляйте правильно код -

----------------‌

MQL5.community - Памятка пользователя 

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


 

Терминал пишет, что у вас выход за пределы массива. Один из индексов принимает значение большее, чем размер массива.

Запустите индикатор, посмотрите во вкладке "Эксперты", на какую строку ругается терминал, найдите её и напишите здесь. Например, так

double rsi0 = work[r  ][iRsi];
 
        work[r][iRsi] = work[r-1][iRsi] + alpha1*(iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)   - work[r-1][iRsi]); // array out of range in 'GH strategy.mq4' (248,27)

        work[r][iEma] = work[r-1][iEma] + alpha2*(MathAbs(work[r-1][iRsi]-work[r][iRsi]) - work[r-1][iEma]); // array out of range in 'GH strategy.mq4' (249,27)

        work[r][iEmm] = work[r-1][iEmm] + alpha2*(work[r][iEma] - work[r-1][iEmm]); // array out of range in 'GH strategy.mq4' (250,27)

        

         for (n = m; n <= m + 9; n++) k += MathAbs(High[n] - Low[n]);  // array out of range in 'GH strategy.mq4' (291,56)



 
ZARA:
Чему равняется iRsi , iEma, iEmm ?
Если не ошибаюсь то значения у них тип double, а  перечисление в массиве не может быть этим типом данных.
 
for (i=limit, r=Bars-i; i>=0; i--,r++)
Попробуй так
 

Поставьте печать перед местом, где ошибка:

printf(IntegerToString(ArrayRange(work,0))+" : "+IntegerToString(r));
work[r][iRsi] = work[r-1][iRsi] + alpha1*(iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)   - work[r-1][iRsi]); // array out of range in 'GH strategy.mq4' (248,27)

И посмотрите, что происходит с индексом перед ошибкой. Возможно он становится равным нулю, и когда Вы отнимаете единицу, то в скобках work[r-1] получается отрицательное значение.

 
Anatolii Zainchkovskii:
Чему равняется iRsi , iEma, iEmm ?        

А я подумал на work[r-1], там ещё табуляция была, как раз 27 место. Думаю... хотя это догадки.

 
Aleksei Stepanenko:

Поставьте печать перед местом, где ошибка:

И посмотрите, что происходит с индексом перед ошибкой. Возможно он становится равным нулю, и когда Вы отнимаете единицу, то в скобках work[r-1] получается отрицательное значение.

Вот: 2021.08.04 00:14:14.879 GH strategy EURUSD,M1: 24372 : 0

 
Anatolii Zainchkovskii:
for (i=limit, r=Bars-i; i>=0; i--,r++)
Попробуй так

Да, ошибка в предыдущих строках исчезла. Теперь ошибка переместилась в другую строку:

        trend1[i]     = trend1[i+1];



printf(IntegerToString(ArrayRange(trend1,0))+" : "+IntegerToString(i));

2021.08.04 00:29:45.133 GH strategy EURUSD,M1: 0 : 24386

 
ZARA:
Вот: 2021.08.04 00:14:14.879 GH strategy EURUSD,M1: 24372 : 0

Когда r равно 0, невозможно посмотреть значение предыдущего элемента, поскольку это и так самый первый элемент. В этот момент r-1 не существует. Нужно менять логику.

Например так:

if(r>0)
   {      
   work[r][iRsi] = work[r-1][iRsi] + alpha1*(iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)   - work[r-1][iRsi]);
   work[r][iEma] = work[r-1][iEma] + alpha2*(MathAbs(work[r-1][iRsi]-work[r][iRsi]) - work[r-1][iEma]);
   work[r][iEmm] = work[r-1][iEmm] + alpha2*(work[r][iEma] - work[r-1][iEmm]);
   }
else
   {
   work[r][iRsi] = 0;
   work[r][iEma] = 0;
   work[r][iEmm] = 0;
   continue;
   }
Причина обращения: