мультисоветник с ошибкой - страница 2

 

не совсем так , из базы взял советник "Bolbands.mq5" и переделал на

использование индикатора ВВ и RSI( вместо DEMA). Он работает на 1 валюте,но хочу сделать мультик.

Ниже его фрагмент кода: 

//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
   bool Buy_Condition =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1] &&    // белая свеча пересекла нижнюю границу Болинджера снизу вверх
                        demaVal[0]>demaVal[1] && demaVal[1]>demaVal[2]);            // DEMA растет
   bool Sell_Condition = (mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1] &&    // черная свеча пересекла верхнюю границу Болинджера сверху вниз
                          demaVal[0]<demaVal[1] && demaVal[1]<demaVal[2]);          // DEMA убываетет
   bool Buy_Close =(mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1]);           // черная свеча пересекла верхнюю границу Болинджера сверху вниз
   bool Sell_Close =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1]);        // белая свеча пересекла нижнюю границу Болинджера снизу вверх                        


 

 
flat55:

не совсем так , из базы взял советник "Bolbands.mq5" и переделал на

использование индикатора ВВ и RSI( вместо DEMA). Он работает на 1 валюте,но хочу сделать мультик.

Ниже его фрагмент кода: 

//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
   bool Buy_Condition =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1] &&    // белая свеча пересекла нижнюю границу Болинджера снизу вверх
                        demaVal[0]>demaVal[1] && demaVal[1]>demaVal[2]);            // DEMA растет
   bool Sell_Condition = (mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1] &&    // черная свеча пересекла верхнюю границу Болинджера сверху вниз
                          demaVal[0]<demaVal[1] && demaVal[1]<demaVal[2]);          // DEMA убываетет
   bool Buy_Close =(mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1]);           // черная свеча пересекла верхнюю границу Болинджера сверху вниз
   bool Sell_Close =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1]);        // белая свеча пересекла нижнюю границу Болинджера снизу вверх                        


 

Фрагмент ни о чем не говорит. Те же самые ошибки. Массивы пустые

Ищите в этом коде чему равны BBLow[], BBUp[]

У Вас присвоение значений в эти массивы + BBMidle[] в Вашем переделанном коде отсутствует!!!

Сначала нужно добиться, чтобы работало на одной паре.

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

 

силь ву пле! Это работает , но на 1 паре пока.

//+------------------------------------------------------------------+
//|                                                   bbrsimulti.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, AM2."
#property link      "http://www.mql5.com"
#property version   "1.05"
//--- входные параметры
input int bands_period= 20;        // Период Bollinger Bands
input int rsi_period= 21;         // Период RSI
input int bands_shift = 0;         // Смещение относительно графика
input double deviation= 2.5;         // Стандартное отклонение
input double   Lot=0.1;            // Количество лотов для торговли
//--- глобальные переменные
int BolBandsHandle;                // хэндл индикатора Bolinger Bands
int rsiHandle;                    // хэндл индикатора DEMA
double BBUp[],BBLow[],BBMidle[];   // динамические массивы для хранения численных значений Bollinger Bands
double rsiVal[];
input int hi=71;
input int lw=29;                 // динамический массив для хранения значений индикатора Moving Average
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- достаточно ли количество баров для работы
   if(Bars(_Symbol,_Period)<60) // общее количество баров на графике меньше 60?
     {
      Alert("На графике меньше 60 баров, советник не будет работать!!");
      return(-1);
     }
//--- получить хэндл индикатора Bollinger Bands и DEMA
   BolBandsHandle=iBands(NULL,PERIOD_M1,bands_period,bands_shift,deviation,PRICE_CLOSE);
   rsiHandle=iRSI(NULL,PERIOD_M1,rsi_period,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
   if((BolBandsHandle<0) || (rsiHandle<0))
     {
      Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
      return(-1);
     }

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(BolBandsHandle);
   IndicatorRelease(rsiHandle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- для сохранения значения времени бара мы используем static-переменную Old_Time.
//--- при каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.
//--- если они не равны, это означает, что начал строится новый бар.

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

//--- копируем время текущего бара в элемент New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

//--- ok, успешно скопировано
   if(copied>0)
     {
      if(Old_Time!=New_Time[0]) // если старое время не равно
        {
         //--- новый бар
         IsNewBar=true;
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Новый бар",New_Time[0],"старый бар",Old_Time);
         //--- сохраняем время бара
         Old_Time=New_Time[0];
        }
     }
   else
     {
      Alert("Ошибка копирования времени, номер ошибки =",GetLastError());
      ResetLastError();
      return;
     }

//--- советник должен проверять условия совершения новой торговой операции только при новом баре
   if(IsNewBar==false)
     {
      return;
     }

//--- имеем ли мы достаточное количество баров на графике для работы
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // если общее количество баров меньше 60
     {
      Alert("На графике менее 60 баров, советник работать не будет!!");
      return;
     }

   MqlRates mrate[];           // Будет содержать цены, объемы и спред для каждого бара

//--- установим индексацию в массивах котировок и индикаторов  как в таймсериях

//--- массив котировок
   ArraySetAsSeries(mrate,true);
   ArraySetAsSeries(rsiVal,true);
//--- массив значений индикаторов
   ArraySetAsSeries(BBUp,true);
   ArraySetAsSeries(BBLow,true);
   ArraySetAsSeries(BBMidle,true);

//--- получить исторические данные последних 3-х баров
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }

//--- копируем новые значения индикаторов используя хэндлы
   if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
      || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
      return;
     }

   if(CopyBuffer(rsiHandle,0,0,3,rsiVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора RSI - номер ошибки:",GetLastError());
      return;
     }

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);            // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);            // лучшее предложение на продажу

//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
   bool Buy_Condition =(rsiVal[1]<lw && mrate[1].close < BBLow[1] );            // DEMA растет
   bool Sell_Condition = (rsiVal[1]>hi && mrate[1].close > BBUp[1]);          // DEMA убываетет
   bool Buy_Close =(mrate[1].close > BBMidle[1]);           // черная свеча пересекла верхнюю границу Болинджера сверху вниз
   bool Sell_Close =(mrate[1].close < BBMidle[1]);        // белая свеча пересекла нижнюю границу Болинджера снизу вверх                        


   if(Buy_Condition && !PositionSelect(_Symbol))     // Открываем длинную позицию
     {                                               // DEМА растет и белая свеча пересекла нижнюю границу Болинджера снизу вверх
      LongPositionOpen();
     }

   if(Sell_Condition && !PositionSelect(_Symbol))    // Открываем короткую позицию
     {                                               // DEМА убывет и черная свеча пересекла верхнюю границу Болинджера сверху вниз
      ShortPositionOpen();
     }

   if(Buy_Close && PositionSelect(_Symbol))          // Закрываем длинную позицию
   {                                               // черная свеча пересекла верхнюю границу Болинджера сверху вниз
    LongPositionClose();
     }

   if(Sell_Close && PositionSelect(_Symbol))         // Закрываем короткую позицию
     {                                               // белая свеча пересекла нижнюю границу Болинджера снизу вверх                
     ShortPositionClose();
     }

   return;
  }
//+------------------------------------------------------------------+
//| Открытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionOpen()
  {
   MqlTradeRequest mrequest;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                              // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу

   if(!PositionSelect(_Symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      mrequest.sl = 0;                                  // Stop Loss
      mrequest.tp = 0;                                  // Take Profit
      mrequest.symbol = _Symbol;                        // символ
      mrequest.volume = Lot;                            // количество лотов для торговли
      mrequest.magic = 0;                               // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                   // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_FOK;        // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                             // проскальзывание от текущей цены      
      OrderSend(mrequest,mresult);                      // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
//| Открытие короткой позиции                                        |
//+------------------------------------------------------------------+
void ShortPositionOpen()
  {
   MqlTradeRequest mrequest;                             // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                               // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);    // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);    // лучшее предложение на продажу

   if(!PositionSelect(_Symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;               // немедленное исполнение
      mrequest.price = NormalizeDouble(Bid,_Digits);     // последняя цена Bid        
      mrequest.sl = 0;                                   // Stop Loss
      mrequest.tp = 0;                                   // Take Profit
      mrequest.symbol = _Symbol;                         // символ
      mrequest.volume = Lot;                             // количество лотов для торговли
      mrequest.magic = 0;                                // Magic Number
      mrequest.type= ORDER_TYPE_SELL;                    // ордер на продажу
      mrequest.type_filling = ORDER_FILLING_FOK;         // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                              // проскальзывание от текущей цены        
      OrderSend(mrequest,mresult);                       // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
//| Закрытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionClose()
  {
   MqlTradeRequest mrequest;                             // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                               // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);    // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);    // лучшее предложение на продажу

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      mrequest.action = TRADE_ACTION_DEAL;               // немедленное исполнение
      mrequest.price = NormalizeDouble(Bid,_Digits);     // последняя цена Bid
      mrequest.sl = 0;                                   // Stop Loss
      mrequest.tp = 0;                                   // Take Profit
      mrequest.symbol = _Symbol;                         // символ
      mrequest.volume = Lot;                             // количество лотов для торговли
      mrequest.magic = 0;                                // Magic Number
      mrequest.type= ORDER_TYPE_SELL;                    // ордер на продажу
      mrequest.type_filling = ORDER_FILLING_FOK;         // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                              // проскальзывание от текущей цены        
      OrderSend(mrequest,mresult);                       // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
//| Закрытие короткой позиции                                        |
//+------------------------------------------------------------------+
void ShortPositionClose()
  {
   MqlTradeRequest mrequest;                              // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                                // Будет использоваться для получения результатов выполнения торговых запросов        

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);     // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);     // лучшее предложение на продажу

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
     {
      mrequest.action = TRADE_ACTION_DEAL;                // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);      // последняя цена ask
      mrequest.sl = 0;                                    // Stop Loss
      mrequest.tp = 0;                                    // Take Profit
      mrequest.symbol = _Symbol;                          // символ
      mrequest.volume = Lot;                              // количество лотов для торговли
      mrequest.magic = 0;                                 // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                     // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_FOK;          // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                               // проскальзывание от текущей цены        
      OrderSend(mrequest,mresult);                        // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+                    


 

 
flat55:

силь ву пле! Это работает , но на 1 паре пока.
 

Ну и прекрасно!

А где у Вас такое?

//--- копируем новые значения индикаторов используя хэндлы
   if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
      || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
      return;
     }

Вернемся к первому посту - ошибка - выход за границы массива.

У Вас массив пустой, а Вы пытаетесь считать второе по порядку значение из массива.

 
будем думать,спасибо.