Скачать MetaTrader 5

мультисоветник с ошибкой

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
flat55
34
flat55  

Добрый день! Помогите добрым советом новичку.При 

компиляции ошибок не дает.

При включении на графике выскакивает ошибка " array out jf range". Что не верно? 

Ниже прилагаю фрагмент кода с ошибкой в  строке с открытием сделки.(строка 100).

Спасибо. 

Sergey Gritsay
6580
Sergey Gritsay  
flat55:

Добрый день! Помогите добрым советом новичку.При 

компиляции ошибок не дает.

При включении на графике выскакивает ошибка " array out jf range". Что не верно? 

Ниже прилагаю фрагмент кода с ошибкой в  строке с открытием сделки.(строка 100).

Спасибо. 

' это значит что вы вышли за пределы массива. Что-то кода нет где посмотреть ошибку. 

flat55
34
flat55  
//---------------------------------------------+
double BBUp[],BBLow[],BBMidle[];   // динамические массивы для хранения численных значений Bollinger Bands
double p_close; // переменная для хранения значения close бара
//+------------------------------------------------------------------+
//| Custom TradeSignalCounter() function                             |
//+------------------------------------------------------------------+
bool TradeSignalCounter(int Number,
                        string Symbol_,
                        bool Trade,
                        int period,
                        int bb_period,
                        double deviation,
                        ENUM_APPLIED_PRICE ApPrice,
                        bool &UpSignal[],
                        bool &DnSignal[],
                        bool &UpStop[],
                        bool &DnStop[])
  {
//--- проверка запрета на торговлю
   if(!Trade)return(true);
//--- объявление переменной для хранения итогового размера массивов переменных
   static int Size_=0;
//--- объявление массива для хранения хэндлов индикаторов как статической переменной
   static int Handle[];
   static int Recount[],MinBars[];
   double RSI[],rsi;
   MqlRates mrate[];           // Будет содержать цены, объемы и спред для каждого бара
//------------------------------------
   static int BBol[];
   double BB[];
//--- инициализация 
   if(Number+1>Size_) // Вход в блок инициализации только на первом старте
     {
      Size_=Number+1; // Для этого номера вход в блок закрыт
  //---- изменение размеров массивов переменных
      ArrayResize(RSI,4);
      ArrayResize(Handle,Size_);
      ArrayResize(Recount,Size_);
      ArrayResize(MinBars,Size_);
   
      ArrayInitialize(Handle,0);
      ArrayInitialize(Recount,0);
      ArrayInitialize(MinBars,0);
   //-----------------------------------------------------
      ArrayResize(BB,4);
      ArrayResize(BBol,Size_);
      
      ArrayInitialize(BBol,0);
  //---- определение минимально количества баров, достаточного для расчёта 
      MinBars[Number]=3*period;
  //---- предварительное обнуление ячеек массивов
      DnSignal[Number] = false;
      UpSignal[Number] = false;
      DnStop  [Number] = false;
      UpStop  [Number] = false;
 //---- используем массив как таймсерию
      // массив котировок
       ArraySetAsSeries(mrate,true);
       ArraySetAsSeries(RSI,true);
  //--- получить исторические данные последних 3-х баров
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return(0);
     }     
 //---- получение хендла индикатора
   Handle[Number]=iRSI(Symbol_,PERIOD_M1,period,ApPrice);
   BBol[Number]=iBands(Symbol_,PERIOD_M5,bb_period,0,deviation,ApPrice);
  }   
//--- проверка количества баров на достаточность для расчёта 
   if(Bars(Symbol_,0)<MinBars[Number])return(true);
   if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // Вход в блок на смене бара или при неудачном копировании данных
     {
      DnSignal[Number] = false;
      UpSignal[Number] = false;
      DnStop  [Number] = false;
      UpStop  [Number] = false;

      //--- используя хэндлы индикатора, копируем значения индикаторного
      //--- буфера в специально подготовленный для этого статический массив
      if(CopyBuffer(Handle[Number],0,0,4,RSI)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться 
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
//----------------------------------------------------------------------------------------------------------
       if(CopyBuffer(BBol[Number],0,0,4,BB)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться 
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
 //---- все операции копирования из индикаторного буфера завершены успешно
      Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бара
//----------------------------------------------------------------------------------------------------------------
      rsi = NormalizeDouble(RSI[1], _Digits);      // 
 //===========================================================================================
   if(mrate[1].close < BBLow[1] && rsi<30) UpSignal[Number] = true;  // закрытие свечи ниже границы ВВ и РСА ниже 30
   if(mrate[1].close  > BBUp[1] && rsi>70) DnSignal[Number] = true;   // закрытие свечи выше ВВ и РСА выше 70
    
   //---- определение сигналов выхода
   if(mrate[1].close < BBMidle[1]) DnStop[Number] = true;      // 
   if(mrate[1].close > BBMidle[1]) UpStop[Number] = true;     // 
    
       }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom TradePerformer() function                                 |
//+------------------------------------------------------------------+

Sergey Gritsay
6580
Sergey Gritsay  
flat55:
//---------------------------------------------+


Вставляйте код пожалуйста правильно через кнопку SRC чтобы выглядело вот так.

int PositionTotal()
  {
   int n=0;
   int total=PositionsTotal();

   for(int i=0; i<total; i++)
     {
      if(!Position.SelectByIndex(i))continue;
      if(Position.Magic()!=Magic)continue;
      if(Position.Symbol()!=_Symbol)continue;
      n++;
     }
   return(n);
  }
юююююююю
flat55
34
flat55  
спасибо,какие наши годы-научимся.
//---------------------------------------------+
double BBUp[],BBLow[],BBMidle[];   // динамические массивы для хранения численных значений Bollinger Bands
double p_close; // переменная для хранения значения close бара
//+------------------------------------------------------------------+
//| Custom TradeSignalCounter() function                             |
//+------------------------------------------------------------------+
bool TradeSignalCounter(int Number,
                        string Symbol_,
                        bool Trade,
                        int period,
                        int bb_period,
                        double deviation,
                        ENUM_APPLIED_PRICE ApPrice,
                        bool &UpSignal[],
                        bool &DnSignal[],
                        bool &UpStop[],
                        bool &DnStop[])
  {
//--- проверка запрета на торговлю
   if(!Trade)return(true);
//--- объявление переменной для хранения итогового размера массивов переменных
   static int Size_=0;
//--- объявление массива для хранения хэндлов индикаторов как статической переменной
   static int Handle[];
   static int Recount[],MinBars[];
   double RSI[],rsi;
   MqlRates mrate[];           // Будет содержать цены, объемы и спред для каждого бара
//------------------------------------
   static int BBol[];
   double BB[];
//--- инициализация
   if(Number+1>Size_) // Вход в блок инициализации только на первом старте
     {
      Size_=Number+1; // Для этого номера вход в блок закрыт
  //---- изменение размеров массивов переменных
      ArrayResize(RSI,4);
      ArrayResize(Handle,Size_);
      ArrayResize(Recount,Size_);
      ArrayResize(MinBars,Size_);
  
      ArrayInitialize(Handle,0);
      ArrayInitialize(Recount,0);
      ArrayInitialize(MinBars,0);
   //-----------------------------------------------------
      ArrayResize(BB,4);
      ArrayResize(BBol,Size_);
      
      ArrayInitialize(BBol,0);
  //---- определение минимально количества баров, достаточного для расчёта
      MinBars[Number]=3*period;
  //---- предварительное обнуление ячеек массивов
      DnSignal[Number] = false;
      UpSignal[Number] = false;
      DnStop  [Number] = false;
      UpStop  [Number] = false;
//---- используем массив как таймсерию
      // массив котировок
       ArraySetAsSeries(mrate,true);
       ArraySetAsSeries(RSI,true);
  //--- получить исторические данные последних 3-х баров
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return(0);
     }    
//---- получение хендла индикатора
   Handle[Number]=iRSI(Symbol_,PERIOD_M1,period,ApPrice);
   BBol[Number]=iBands(Symbol_,PERIOD_M5,bb_period,0,deviation,ApPrice);
  }  
//--- проверка количества баров на достаточность для расчёта
   if(Bars(Symbol_,0)<MinBars[Number])return(true);
//--- получение торговых сигналов
   if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // Вход в блок на смене бара или при неудачном копировании данных
     {
      DnSignal[Number] = false;
      UpSignal[Number] = false;
      DnStop  [Number] = false;
      UpStop  [Number] = false;

      //--- используя хэндлы индикатора, копируем значения индикаторного
      //--- буфера в специально подготовленный для этого статический массив
      if(CopyBuffer(Handle[Number],0,0,4,RSI)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
//----------------------------------------------------------------------------------------------------------
       if(CopyBuffer(BBol[Number],0,0,4,BB)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
//---- все операции копирования из индикаторного буфера завершены успешно
      Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бара
//----------------------------------------------------------------------------------------------------------------
      rsi = NormalizeDouble(RSI[1], _Digits);      //
//===========================================================================================
   if(mrate[1].close < BBLow[1] && rsi<30) UpSignal[Number] = true;  // закрытие свечи ниже границы ВВ и РСА ниже 30
   if(mrate[1].close  > BBUp[1] && rsi>70) DnSignal[Number] = true;   // закрытие свечи выше ВВ и РСА выше 70
    
   //---- определение сигналов выхода
   if(mrate[1].close < BBMidle[1]) DnStop[Number] = true;      //
   if(mrate[1].close > BBMidle[1]) UpStop[Number] = true;     //
    
       }
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom TradePerformer() function                                 |
//+------------------------------------------------------------------+
new-rena
3372
new-rena  
flat55:

Добрый день! Помогите добрым советом новичку.При 

компиляции ошибок не дает.

При включении на графике выскакивает ошибка " array out jf range". Что не верно? 

Ниже прилагаю фрагмент кода с ошибкой в  строке с открытием сделки.(строка 100).

Спасибо. 

Отдельно выведите здесь строку номер 100, ато массивов больно много, непонятно - в каком

flat55
34
flat55  
100: if(mrate[1].close < BBLow[1] && rsi<30) UpSignal[Number] = true;  // закрытие свечи ниже границы ВВ и РСА ниже 30
   if(mrate[1].close  > BBUp[1] && rsi>70) DnSignal[Number] = true;   // закрытие свечи выше ВВ и РСА выше 70
    
   //---- определение сигналов выхода
   if(mrate[1].close < BBMidle[1]) DnStop[Number] = true;      //
   if(mrate[1].close > BBMidle[1]) UpStop[Number] = true;     //
new-rena
3372
new-rena  
flat55:
100: if(mrate[1].close < BBLow[1] && rsi<30) UpSignal[Number] = true;  // закрытие свечи ниже границы ВВ и РСА ниже 30
   if(mrate[1].close  > BBUp[1] && rsi>70) DnSignal[Number] = true;   // закрытие свечи выше ВВ и РСА выше 70
    
   //---- определение сигналов выхода
   if(mrate[1].close < BBMidle[1]) DnStop[Number] = true;      //
   if(mrate[1].close > BBMidle[1]) UpStop[Number] = true;     //

Попробуйте сверху добавить

ArrayResize(mrate,3);

где-нибудь тут:

      ArrayResize(RSI,4);
      ArrayResize(Handle,Size_);
      ArrayResize(Recount,Size_);
      ArrayResize(MinBars,Size_);
flat55
34
flat55  
Не помогло, та же ошибка. Что делать?
new-rena
3372
new-rena  
flat55:
Не помогло, та же ошибка. Что делать?

Подозреваю, что ошибка в другом массиве.

Про ошибку подробнее тогда напишите. Обычно указывается номер строки и номер позиции в строке.

new-rena
3372
new-rena  

Кажись понял

BBLow[1] - в этом массиве нет ни одного значения вообще.

Исправим эту ошибку, затем у Вас вылетит следующая строка по ошибке, т.к.

BBUp[1] - тоже самое

затем вылетит ошибка по следующим 2-м строкам, т.к.

BBMidle[1] - тоже самое

Эти массивы пустые. Непонятно - зачем у Вас они в условиях?

Занесите в эти три массива хотя бы что-нибудь, не менее 2-х значений и ошибка исчезнет.

Возможно стерт кусок кода из середины программы.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий