Выход за пределы массива

 

Ни как не могу разобраться. В тетере прекращается тестирование с ошибкой array out of range .

Грешу на этот код, без него все работает. Может, кто поможет?

//+------------------------------------------------------------------+ 
//| Получим Low MACD                                                 | 
//+------------------------------------------------------------------+ 
double LowMACD(string symbol)
  {
   int handle_macd=0;
   double buff_MACD[];
   ArraySetAsSeries(buff_MACD,true);
   handle_macd=iMACD(_Symbol,PERIOD_H1,12,26,9,PRICE_CLOSE);
   double low=0;
   int    index_low=0;
   int copiedLow=CopyBuffer(handle_macd,0,0,Distance,buff_MACD);
   if(copiedLow == -1)
     {
      Print("Ошибка во время копирования данных №",GetLastError());
     }
   index_low=ArrayMinimum(buff_MACD,0,WHOLE_ARRAY);

   if(copiedLow>0 && index_low<copiedLow) low=buff_MACD[index_low];
   return(low);
  }
 

1. Зачем на каждом тике создавать хендл индикатора? Это нужно сделать один раз - в OnInit().

2. Там же (в OnInit()) нужно проверить - создался ли хендл?

3. Явного выхода за пределы нет. Кстати, когда выскакивает ошибка, то указывается строка и номер символа в строке.

 
Vladimir Karputov:

1. Зачем на каждом тике создавать хендл индикатора? Это нужно сделать один раз - в OnInit().

2. Там же (в OnInit()) нужно проверить - создался ли хендл?

3. Явного выхода за пределы нет. Кстати, когда выскакивает ошибка, то указывается строка и номер символа в строке.

Да, прошу прощения. Вот строка array out of range (1398,49).  Вот строка кода  if(copied2>0 && index_low<copied2) low=Close2[index_low];

Здесь нет хендла индикатора. 

double LowLevelCl(string symbol)
  {
   double Close[];
   int    index_high=0;
   double Close2[];
   double low=0;
   int    index_low=0;
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(Close2,true);
   int copied=CopyClose(Symbol(),PERIOD_H8,0,Distance,Close);
   if(copied == -1)
     {
      Print("Ошибка во время копирования данных №",GetLastError());
     }
   index_high=ArrayMaximum(Close,0,WHOLE_ARRAY);

   int copied2=CopyClose(Symbol(),PERIOD_H8,index_high,Distance,Close2);
   if(copied2==-1)
     {
      Print("Ошибка во время копирования данных №",GetLastError());
     }
   index_low=ArrayMinimum(Close2,index_high,WHOLE_ARRAY);

   if(copied2>0 && index_low<copied2) low=Close2[index_low];  СТРОКА КОДА из ошибки
   return(low);
  }
 

"copied" - в случае ошибки Вы продолжаете работать дальше (а нужно выходить). Что в итоге получается:

"copied"==-1, это ошибка, а значит копирования не произошло и РАЗМЕРНОСТЬ принимающего массива "Close2[]" равно нулю.

тра та та тра та та

в конце Вы пытаетесь что-то атм получить из массива "Close2[]": "low=Close2[index_low]" - но так как РАЗМЕРНОСТЬ принимающего массива "Close2[]" равно нулю, то Вы получаете ошибку выхода за пределы массива.

 
Vladimir Karputov:

"copied" - в случае ошибки Вы продолжаете работать дальше (а нужно выходить). Что в итоге получается:

"copied"==-1, это ошибка, а значит копирования не произошло и РАЗМЕРНОСТЬ принимающего массива "Close2[]" равно нулю.

тра та та тра та та

в конце Вы пытаетесь что-то атм получить из массива "Close2[]": "low=Close2[index_low]" - но так как РАЗМЕРНОСТЬ принимающего массива "Close2[]" равно нулю, то Вы получаете ошибку выхода за пределы массива.

Спасибо! Попробую подумать, как быть.
 
Andrey Davydov:
index_low=ArrayMinimum(Close2,index_high,WHOLE_ARRAY);
При index_high >= ArraySize(Close2) будет Ваша ошибка.
 
Andrey Davydov:
Спасибо! Попробую подумать, как быть.

А вообще какая цель данной функции? Может нужно переписать эту функцию будет.
 
fxsaber:
При index_high >= ArraySize(Close2) будет Ваша ошибка.

2017.03.28 20:31:43.881 Core 1 2016.05.30 12:00:00   Ошибка5052
Спасибо! Ошибка 5052

Что за ошибка не  знаю.

 
Andrey Davydov:

2017.03.28 20:31:43.881 Core 1 2016.05.30 12:00:00   Ошибка5052
Спасибо! Ошибка 5052

Что за ошибка не  знаю.


ERR_SMALL_ARRAY

5052

Too small array, the starting position is outside the array

 
Andrey Davydov:

2017.03.28 20:31:43.881 Core 1 2016.05.30 12:00:00   Ошибка5052
Спасибо! Ошибка 5052

Что за ошибка не  знаю.

ArrayMinimum неудачно завершилась, вернув -1.