Скачать MetaTrader 5

Помогите в советнике правильно сформулировать условие if!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Авторизуйся на MQL5.community с помощью OpenID. Это удобно!
Roman Rymar
230
Roman Rymar 2016.11.21 17:55 

Доброго времени суток!

Помогите в советнике правильно сформулировать условие if индикатора для открытия на покупку/продажу, с возможностью изменения настроек индикатора. Спасибо!

 

и 

Файлы:
i-Regr.mq4 5 kb
Artem Ashikhmin
1480
Artem Ashikhmin 2016.11.21 20:55  
Roman Rymar:

Помогите в советнике правильно сформулировать условие if индикатора для открытия на покупку/продажу, с возможностью изменения настроек индикатора.

А когда должен быть сигнал? При изгибе линий или пересечении цены выше ниже?
Можно сделать изгиб средней и пересечение ценой верхней линии и нижней  

Vitaly Muzichenko
3414
Vitaly Muzichenko 2016.11.21 21:01  
Artem Ashikhmin:
А когда должен быть сигнал? При изгибе линий или пересечении цены выше ниже?

Так стрелочками на скрине показано - вверх и вниз =)  

Для ТС: тут условий несколько может быть, можно просто "закрытие выше/ниже", "хай выше/ниже" ну и ещё можно придумать, но от этого будет зависеть конечный результат качества сигналов.

Artem Ashikhmin
1480
Artem Ashikhmin 2016.11.21 21:36  
extern int    TF = 1;
extern int    degree = 3;
extern double kstd = 2.0;
extern int    bars = 250;
extern int    shift = 0;
//----------------------+
int signal_Buy=-1;
int signal_Sell=-1;
//----------------------+
void start() {
//--------------------------------------------------------------------------------------------------------------------+
// получение сигнала ________

     double RegrBend1 = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 0,1); // 0 средняя линия
     double RegrBend2 = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 0,2); // 0 средняя линия
     double MA        = iMA(Symbol(),TF,3,0,3,0,1); //MA используется как цена, можно так же использовать Bid > линии, Ask < линии          
     double RegrUp    = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 1,1); // 1 верхняя линия
     double RegrDown  = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 2,1); // 2 нижняя линия

     int Buy=-1;    
      if(RegrBend1>RegrBend2 && MA>RegrDown) Buy=0; //если средняя линия изгиб вверх и пересечение МА нижней линии вверх
      if(Buy==0) {Signal_Buy=0;}
//-------------------------------+
     int Sell=-1;    
      if(RegrBend1<RegrBend2 && MA<RegrUp) Sell=1; //если средняя линия изгиб вниз и пересечение МА верхней линии в низ
      if(Sell==1) {Signal_Sell=1;}
//--------------------------------------------------------------------------------------------------------------------+  
//=====================================================================================================================

   if(Signal_Buy==0) OrderSend (OP_BUY,-,-,-,-,-,-,-)

   if(Signal_Sell==1) OrderSend (OP_SELL,-,-,-,-,-,-,-)

}//--- StartEnd ---//
В индикаторе надо добавить на строчке 78 где return (0);
Artem Ashikhmin
1480
Artem Ashikhmin 2016.11.21 21:43  

Если строго по стрелочкам то вот так:

extern int    TF = 1;
extern int    degree = 3;
extern double kstd = 2.0;
extern int    bars = 250;
extern int    shift = 0;
//----------------------+
int signal_Buy=-1;
int signal_Sell=-1;
//----------------------+
void start() {
//--------------------------------------------------------------------------------------------------------------------+
// получение сигнала ________

     double MA        = iMA(Symbol(),TF,3,0,3,0,1); //MA используется как цена, можно так же использовать Bid > линии, Ask < линии          
     double RegrUp    = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 1,1); // 1 верхняя линия
     double RegrDown  = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 2,1); // 2 нижняя линия 

     int Buy=-1;    
      if(MA<RegrDown || Ask<RegrDown) Buy=0; //если пересечение МА или Ask нижней линии в низ (перепроданность)
      if(Buy==0) {Signal_Buy=0;}
//-------------------------------+
     int Sell=-1;    
      if(MA>RegrUp || Bid>RegrUp) Sell=1; //если пересечение МА или Bid верхней линии вверх (перекупленность)
      if(Sell==1) {Signal_Sell=1;}
//--------------------------------------------------------------------------------------------------------------------+  
//=====================================================================================================================

   if(Signal_Buy==0) OrderSend (OP_BUY,-,-,-,-,-,-,-)

   if(Signal_Sell==1) OrderSend (OP_SELL,-,-,-,-,-,-,-)

}//--- StartEnd ---//

P.S.
Вообще тут много комбинаций для получения сигнала.

Roman Rymar
230
Roman Rymar 2016.11.22 07:19  
Artem Ashikhmin:

А когда должен быть сигнал? При изгибе линий или пересечении цены выше ниже?
Можно сделать изгиб средней и пересечение ценой верхней линии и нижней  

При изгибе средней много ложных сигналов, а пересечение - вот как раз то!

Спасибо за помощь. Протестирую - отпишусь! 

Roman Rymar
230
Roman Rymar 2016.11.22 07:26  
Vitaly Muzichenko:

Так стрелочками на скрине показано - вверх и вниз =)  

Для ТС: тут условий несколько может быть, можно просто "закрытие выше/ниже", "хай выше/ниже" ну и ещё можно придумать, но от этого будет зависеть конечный результат качества сигналов.

Думаю что "хай", что "закрытие" - одинаково. Главное -  цена пересекла линию - вход в рынок.
Vladislav Andruschenko
91512
Vladislav Andruschenko 2016.11.22 07:48  

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

Т.е. он рисует.  

Artem Ashikhmin
1480
Artem Ashikhmin 2016.11.22 12:56  
Roman Rymar:
Думаю что "хай", что "закрытие" - одинаково. Главное -  цена пересекла линию - вход в рынок.
Только тестировать надо по всем тикам или контрольным точкам. По ценам открытия многие сигналы будут пропускаться.
Roman Rymar
230
Roman Rymar 2016.11.22 16:15  

//+-----------------------------------------------------------------------------------------------+
//|                                                                                  EA i-Reg.mq4 |
//|                                                                                          2016 |
//|                                                                                               |
//+-----------------------------------------------------------------------------------------------+
extern double Lot = 0.01;
extern int slip = 3;
extern int TakeProfit = 10;
extern int MagicNumber = 9999;
extern int TrailingStop = 15;

extern int    TF = 5;
extern int    degree = 3;
extern double kstd = 2.0;
extern int    bars = 250;
extern int    shift = 0;
//----------------------+
//int Signal_Buy=-1;
//int Signal_Sell=-1;
int cnt,ticket,total;
//----------------------+
int start() {
//--------------------------------------------------------------------------------------------------------------------+
// получение сигнала ________

     //double RegrBend1 = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 0,1); // 0 средняя линия
     //double RegrBend2 = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 0,2); // 0 средняя линия
    // double MA        = iMA(Symbol(),TF,3,0,3,0,1); //MA используется как цена, можно так же использовать Bid > линии, Ask < линии          
     double RegrUp    = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 1,1); // 1 верхняя линия
     double RegrDown  = iCustom(Symbol(),TF,"i-Regr",degree,kstd,bars,shift, 2,1); // 2 нижняя линия

     /*int Buy=-1;    
      if(MA<RegrDown || Ask<RegrDown) Buy=0; //если пересечение МА или Ask нижней линии в низ (перепроданность)
      if(Buy==0) {Signal_Buy=0;}
//-------------------------------+
     int Sell=-1;    
      if(MA>RegrUp || Bid>RegrUp) Sell=1; //если пересечение МА или Bid верхней линии вверх (перекупленность)
      if(Sell==1) {Signal_Sell=1;}*/

//=====================================================================================================================
total=OrdersTotal();
   if(total<1){
   if(/*MA<RegrDown ||*/ Ask<RegrDown){
   ticket=OrderSend (Symbol(),OP_BUY, Lot,Ask,slip,0,Ask+TakeProfit*Point,0, MagicNumber,0,Blue);
                        return(0);
        }
        
   if(/*MA>RegrUp || */ Bid>RegrUp){
   ticket=OrderSend (Symbol(),OP_SELL, Lot,Bid,slip,0,Bid-TakeProfit*Point,0, MagicNumber,0,Red);
                       return(0);
       }
}

    if (total>0)
     for(cnt=OrdersTotal();cnt>=0;cnt--)
   {
     if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))continue;
          if (OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
          {    
                  if (OrderType()==OP_SELL)
                  {                    
                          if (TrailingStop>0)
                          {
                                  if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                                                 return(0);                                            
                                         }
                                  }
                          }
                  }
  
                  if (OrderType()==OP_BUY)
                  {
                         if (TrailingStop>0)
                         {
                            if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     //--- modify order and exit
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                   return(0);
                    }
                }
            }
         }
      }
  }
  return(0);
}

Вот собственно и сам советник. Может слегка "грязно", есть лишнее, но результат есть! Не существенно, но чуть подправил условие входа. Именно с такими настройками и вводными получил, что хотел! 

Индюк перерисовывает, что следовало ожидать. Имеет смысл работать с TF индикатора Н1 и kstd 1.0 на более меньшем временном интервале.

Вместо стопов и трейлинга, думаю, логичнее сделать усреднение из-за существенной просадки. На истории возврат цены и взятие ТР слишком долго. 

Пишите мнения - будет интересно! 

 Artem Ashikhmin, спасибо! 

Vitaly Muzichenko
3414
Vitaly Muzichenko 2016.11.22 17:23  
Roman Rymar:
//+-----------------------------------------------------------------------------------------------+
//|                                                                                  EA i-Reg.mq4 |
//+-----------------------------------------------------------------------------------------------+
...
}

Пишите мнения - будет интересно! 

 Artem Ashikhmin, спасибо! 

Мне интересно, именно эту логику храню в архиве более года - никак нет времени написать, но там очень много факторов для выхода со сделки.

Вы бы скрин тестера приложили, ну и картинку со входами в рынок по индикатору, это было-бы в несколько раз эффективнее для обсуждения.

Если не сложно - приложите! 

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