Нужна помощь с MQL4 ребята программисты.

 

Есть вот кусок кода, пытаюсь разобраться чтобы эти индюки работали вместе к примеру включаем 2 индикатора нужно 2 сигнала чтобы открылась продажа или покупка или 3 индикатора значит 3 сигнала

кто поможет пожалуйста 

 

int GetTypeNewOrder()

  {
   int UseInd;
   int Signal=-1;
   double   Xma=iMA(NULL,0,XMAPeriod,XMAShift,XMAMetod,XMAapply,0);
   double   Yma=iMA(NULL,0,YMAPeriod,YMAShift,YMAMetod,YMAapply,0);
   double   SignalCurrent=iMACD(NULL,0,FastEMA,SlowEMA,MacdSMA,MacdPrice,MODE_SIGNAL,0);
   double   MacdCurrent=iMACD(NULL,0,FastEMA,SlowEMA,MacdSMA,MacdPrice,MODE_MAIN,0);
   double   e_Relative_Strength_Index=iRSI(NULL,0,RSIPeriod,RSIapply,0);
   double   e_Bollinger_Bands_buy  = iBands(NULL, 0, BBperiod, BBdeviation, BBshift, BBapply, 2, 0);
   double   e_Bollinger_Bands_sell = iBands(NULL, 0, BBperiod, BBdeviation, BBshift, BBapply, 1, 0);
   double   e_Stochastic_Oscillator_X = iStochastic(NULL, 0, Kperiod, Dperiod, Slowing, StochasticMethod, Sapply, 0, 0);
   double   e_Stochastic_Oscillator_Y = iStochastic(NULL, 0, Kperiod, Dperiod, Slowing, StochasticMethod, Sapply, 1, 0);
   double   envelopelower=iEnvelopes(NULL,0,EnvelopesPeriod,EnvelopesMetod,EnvelopesShift,EnvelopesPrice,EnvelopesDeviation,MODE_LOWER,0);
   double   envelopeupper=iEnvelopes(NULL,0,EnvelopesPeriod,EnvelopesMetod,EnvelopesShift,EnvelopesPrice,EnvelopesDeviation,MODE_UPPER,0);



   UseInd=Envelopes+BollongerBands+Stochastic+RelativeStrengthIndex+MACD+MovingAverage;



      if(Envelopes)
        {
         if(Ask<envelopelower) Signal=OP_BUY;
         if(Bid>envelopeupper) Signal=OP_SELL;
        }

   if(BollongerBands)
     {
      if(Ask < e_Bollinger_Bands_buy)  Signal=OP_BUY;
      if(Bid > e_Bollinger_Bands_sell) Signal=OP_SELL;
     }
   if(Stochastic)
     {
      if((e_Stochastic_Oscillator_X > e_Stochastic_Oscillator_Y) && (e_Stochastic_Oscillator_X < StochasticBUY))  Signal=OP_BUY;
      if((e_Stochastic_Oscillator_X < e_Stochastic_Oscillator_Y) && (e_Stochastic_Oscillator_X > StochasticSELL)) Signal=OP_SELL;
     }

   if(RelativeStrengthIndex)
     {
      if(e_Relative_Strength_Index<RSIBUY) Signal=OP_BUY;
      if(e_Relative_Strength_Index>RSISELL) Signal=OP_SELL;
     }
   if(MACD)
     {
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent) Signal=OP_BUY;
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent) Signal=OP_SELL;
     }
   if(MovingAverage)
     {
      if((Xma>Yma) && Ask>Xma) Signal=OP_BUY;
      if((Xma<Yma) && Bid<Xma) Signal=OP_SELL;
     }

   return(Signal);

  }
 
Yuriu Vasilev:

Есть вот кусок кода, пытаюсь разобраться чтобы эти индюки работали вместе к примеру включаем 2 индикатора нужно 2 сигнала чтобы открылась продажа или покупка или 3 индикатора значит 3 сигнала

кто поможет пожалуйста 

 

if(MACD)
     {
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent) SignalMACD=OP_BUY;
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent) SignalMACD=OP_SELL;
     }
   if(MovingAverage)
     {
      if((Xma>Yma) && Ask>Xma) SignalMA=OP_BUY;
      if((Xma<Yma) && Bid<Xma) SignalMA=OP_SELL;
     }
int rezz;
if(SignalMACD==OP_BUY || SignalMA==OP_BUY) int rezz = OrderSend(...);  // Может так пойдет на примере МАшки с МАСД. Или я вопроса не понял.
if(SignalMACD==OP_SELL || SignalMA==OP_SELL) int rezz = OrderSend(...);
 
Oleg Papkov:

Включил 2 или 3 или 4 индикатора сигнал срабатывает от любова индикатора без подтверждения второго, нужно чтоб было сколько включено 2 к примеру значит 2 сигнала нужно чтоб открылась покупка или продажа

ща всячески перепробую ) 

 
Ребус 
 
Yuriu Vasilev:
Ребус 

Для каждого индикатора заведите свою пару переменных с сигналами на покупки и на продажу отдельно. Если индикатор выключен, переменным присваивается тру, если включен - тут сами знаете.

В итог проверяете все переменные с && и получаете итоговый сигнал. 

 
Dmitry Fedoseev:

Для каждого индикатора заведите свою пару переменных с сигналами на покупки и на продажу отдельно. Если индикатор выключен, переменным присваивается тру, если включен - тут сами знаете.

В итог проверяете все переменные с && и получаете итоговый сигнал. 

Пример кода бы )
 
да обычные костыли поставить да и всё, делов то, переменные тру/фалс - включён выключен (если выключен то не вызываем индикатор), счётчик количества включённых индюков, ну и сигнальные переменные от индикаторов собираем в кучку перед ордерсендом и считаем просто чтоб количество сигналов = количеству включённых индикаторов, это очень простой костыль
 
Простой пример, надеюсь основу поймете чтобы дальше самому
If(если)(macd(предположим сигнальная линия больше чем)>0) открывается бай позиция.
Если нужно добавить ещё условие, то используйте &&(и), у нас получится так :
If(если)(macd(предположим сигнальная линия больше чем)>0 &&(и) Close[1](закрытие свечи 1, то есть последняя закрытая) <MA(меньше какого-нибудь МА)) открывается бай позиция,  в данном случае позиция откроется если выполнятся оба условия. Если выполнится только одно условие позиция не будет открыта. 

 
Ramiz Mavludov:
Простой пример, надеюсь основу поймете чтобы дальше самому
If(если)(macd(предположим сигнальная линия больше чем)>0) открывается бай позиция.
Если нужно добавить ещё условие, то используйте &&(и), у нас получится так :
If(если)(macd(предположим сигнальная линия больше чем)>0 &&(и) Close[1](закрытие свечи 1, то есть последняя закрытая) <MA(меньше какого-нибудь МА)) открывается бай позиция,  в данном случае позиция откроется если выполнятся оба условия. Если выполнится только одно условие позиция не будет открыта. 

Так работает, но рисуется другая проблема, похоже другой код нужен для такого робота.
 
Yuriu Vasilev:
Так работает, но рисуется другая проблема, похоже другой код нужен для такого робота.
Тоже очень долго голову ломал над этим, в итоге написал следующее
int GetSignal()
  {
   if(Signal_01)ind_01=indicator_01();
   if(Signal_02)ind_02=indicator_02();
   if(Signal_03)ind_03=indicator_03();
   if(Signal_04)ind_04=indicator_04();
   if(Signal_05)ind_05=indicator_05();
   if(Signal_06)ind_06=indicator_06();
   if(Signal_07)ind_07=indicator_07();
   if(Signal_08)ind_08=indicator_08();
   if(Signal_09)ind_09=indicator_09();

   if(Buysignal()) return(OP_BUY);
   if(Sellsignal()) return(OP_SELL);

   return(-1);
  }
//+------------------------------------------------------------------+
bool Buysignal()
  {
   bool sig01=(Signal_01)?false:true;
   bool sig02=(Signal_02)?false:true;
   bool sig03=(Signal_03)?false:true;
   bool sig04=(Signal_04)?false:true;
   bool sig05=(Signal_05)?false:true;
   bool sig06=(Signal_06)?false:true;
   bool sig07=(Signal_07)?false:true;
   bool sig08=(Signal_08)?false:true;
   bool sig09=(Signal_09)?false:true;

   if(Signal_01)sig01=(ind_01==OP_BUY)?true:false;
   if(Signal_02)sig02=(ind_02==OP_BUY)?true:false;
   if(Signal_03)sig03=(ind_03==OP_BUY)?true:false;
   if(Signal_04)sig04=(ind_04==OP_BUY)?true:false;
   if(Signal_05)sig05=(ind_05==OP_BUY)?true:false;
   if(Signal_06)sig06=(ind_06==OP_BUY)?true:false;
   if(Signal_07)sig07=(ind_07==OP_BUY)?true:false;
   if(Signal_08)sig08=(ind_08==OP_BUY)?true:false;
   if(Signal_09)sig09=(ind_09==OP_BUY)?true:false;

   if(!sig01)return(false);
   if(!sig02)return(false);
   if(!sig03)return(false);
   if(!sig04)return(false);
   if(!sig05)return(false);
   if(!sig06)return(false);
   if(!sig07)return(false);
   if(!sig08)return(false);
   if(!sig09)return(false);
   return(true);
  }
//+------------------------------------------------------------------+
bool Sellsignal()
  {
   bool sig01=(Signal_01)?false:true;
   bool sig02=(Signal_02)?false:true;
   bool sig03=(Signal_03)?false:true;
   bool sig04=(Signal_04)?false:true;
   bool sig05=(Signal_05)?false:true;
   bool sig06=(Signal_06)?false:true;
   bool sig07=(Signal_07)?false:true;
   bool sig08=(Signal_08)?false:true;
   bool sig09=(Signal_09)?false:true;

   if(Signal_01)sig01=(ind_01==OP_SELL)?true:false;
   if(Signal_02)sig02=(ind_02==OP_SELL)?true:false;
   if(Signal_03)sig03=(ind_03==OP_SELL)?true:false;
   if(Signal_04)sig04=(ind_04==OP_SELL)?true:false;
   if(Signal_05)sig05=(ind_05==OP_SELL)?true:false;
   if(Signal_06)sig06=(ind_06==OP_SELL)?true:false;
   if(Signal_07)sig07=(ind_07==OP_SELL)?true:false;
   if(Signal_08)sig08=(ind_08==OP_SELL)?true:false;
   if(Signal_09)sig09=(ind_09==OP_SELL)?true:false;

   if(!sig01)return(false);
   if(!sig02)return(false);
   if(!sig03)return(false);
   if(!sig04)return(false);
   if(!sig05)return(false);
   if(!sig06)return(false);
   if(!sig07)return(false);
   if(!sig08)return(false);
   if(!sig09)return(false);
   return(true);
  }
//+------------------------------------------------------------------+
int indicator_01()
  {
   double ma1 = iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price,1);
   double ma2 = iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price,2);

   double p_close1 = iClose(_Symbol,_Period,1);
   double p_close2 = iClose(_Symbol,_Period,2);

   if(p_close1>ma1&&p_close2<ma2)return(OP_BUY);
   if(p_close1<ma1&&p_close2>ma2)return(OP_SELL);

   return(-1);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int indicator_02()
  {
   double rsi=iRSI(_Symbol,_Period,rsi_period,rsi_price,1);

   if(rsi<=rsi_level_dw)return(OP_BUY);
   if(rsi>=rsi_level_up)return(OP_SELL);

   return(-1);
  }
//+------------------------------------------------------------------+
 
Sergey Gritsay:
Тоже очень долго голову ломал над этим, в итоге написал следующее
Невероятное количество лишних проверок условий.
Причина обращения: