AM2
Андрей

 
Уровень 34

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Как прикрутить к советнику трейлингстоп и вывод в безубыток?

Как известно вывод позиции в безубыток и последующий трейлинг позиции, могут значительно повысить прибыльность торговой системы.

Чтобы проделать необходимые нам операции воспользуемся готовыми функциями трейлингстопа и БУ.

Наш трейлингстоп:


//+------------------------------------------------------------------+  
void Trailing()
{
   for(int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol()||OrderMagicNumber()==MAGICMA)
       if(OrderType()==OP_BUY)
         {
          if(TrailingStop>0)  
            {                 
              if(Bid-OrderOpenPrice()>TrailingStop)
               {
                 if(OrderStopLoss()<Bid-TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(OrderType()==OP_SELL)
         {
           if(TrailingStop>0)  
            {                 
              if((OrderOpenPrice()-Ask)>TrailingStop)
               {
                 if((OrderStopLoss()>(Ask+TrailingStop)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   }
}
//+------------------------------------------------------------------+


Наш БУ:


//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}
//------------------------------------------------------------------+


И наконец наш советник к которому мы все это будем прикручивать:


//+------------------------------------------------------------------+
//|                                                     alya-bob.mq4 |
//|                                           Copyright © 2011, AM2. |
//|                                             www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, AM2."
#property link      "www.forexsystems.biz"

#define MAGICMA  20110426

extern double StopLoss           = 0.0035;
extern double TakeProfit         = 0.007;
extern double MovingPeriod       = 20;
extern double MovingShift        = 0;
extern int StochOversold         = 30;
extern int StochOverbought       = 70;
extern double Lots               = 0.1;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average   
   int    res;  
//---- 
   double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double st=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
//---- buy 
   if(ma1>ma2 && ma0>ma1  && Close[1]>ma0 && st<StochOversold)  // Moving  Average растет, Stochastic ниже уровня перепроданности и цена выше Moving  Average
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }      
//---- sell   
   if(ma1<ma2 && ma0<ma1 && Close[1]<ma0 && st>StochOverbought)  // Moving  Average убывает, Stochastic выше уровня перекупленности и цена ниже Moving  Average
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
  }
//+------------------------------------------------------------------+


Достаточно добавить необходимые нам функции в конец советника и вызвать их из expert start function:


   if (BULevel!=0) BU();
   if (TrailingStop!=0) Trailing();  


Теперь осталось только добавить необходимые параметры в шапку эксперта и мы можем тестировать нашу торговую систему с необходимыми нам функциями.


//+------------------------------------------------------------------+
//|                                                     alya-bob.mq4 |
//|                                           Copyright © 2011, AM2. |
//|                                             www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, AM2."
#property link      "www.forexsystems.biz"

#define MAGICMA  20110427

extern double StopLoss           = 0.0035;
extern double TakeProfit         = 0.007;
extern double BULevel            = 0.001;
extern double TrailingStop       = 0.005;
extern int    MovingPeriod       = 20;
extern int    MovingShift        = 0;
extern int StochOversold         = 30;
extern int StochOverbought       = 70;
extern double Lots               = 0.1;


Вот и все! Эксперт готов!


//+------------------------------------------------------------------+
//|                                                     alya-bob.mq4 |
//|                                           Copyright © 2011, AM2. |
//|                                             www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, AM2."
#property link      "www.forexsystems.biz"

#define MAGICMA  20110427

extern double StopLoss           = 0.0035;
extern double TakeProfit         = 0.007;
extern double BULevel            = 0.001;
extern double TrailingStop       = 0.005;
extern int    MovingPeriod       = 20;
extern int    MovingShift        = 0;
extern int StochOversold         = 30;
extern int StochOverbought       = 70;
extern double Lots               = 0.1;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average   
   int    res;  
//---- 
   double ma0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); // Значение Moving  Average на текущем баре
   double ma1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // Значение Moving  Average на предыдущем баре
   double ma2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // Значение Moving  Average на предпредыдущем баре
   double st=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
//---- buy 
   if(ma1>ma2 && ma0>ma1  && Close[1]>ma0 && st<StochOversold)  // Moving  Average растет, Stochastic ниже уровня перепроданности и цена выше Moving  Average
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }      
//---- sell   
   if(ma1<ma2 && ma0<ma1 && Close[1]<ma0 && st>StochOverbought)  // Moving  Average убывает, Stochastic выше уровня перекупленности и цена ниже Moving  Average
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     
  }  
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   
   if (BULevel!=0) BU();
   if (TrailingStop!=0) Trailing();     
  }
//+------------------------------------------------------------------+  
void Trailing()
{
   for(int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol()||OrderMagicNumber()==MAGICMA)
       if(OrderType()==OP_BUY)
         {
          if(TrailingStop>0)  
            {                 
              if(Bid-OrderOpenPrice()>TrailingStop)
               {
                 if(OrderStopLoss()<Bid-TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,Green);
                  }
               }
            }
         }
         
        if(OrderType()==OP_SELL)
         {
           if(TrailingStop>0)  
            {                 
              if((OrderOpenPrice()-Ask)>TrailingStop)
               {
                 if((OrderStopLoss()>(Ask+TrailingStop)) || (OrderStopLoss()==0))
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop,OrderTakeProfit(),0,Red);
                  }
               }
            }
         }   
   }
}
//+------------------------------------------------------------------+
void BU()
{
   for(int i=0; i<OrdersTotal(); i++) 
      {
       if(OrderSelect(i, SELECT_BY_POS))
        {      
         if(OrderType()==OP_BUY) 
          {
           if(OrderOpenPrice()<=(Bid-BULevel)&&OrderOpenPrice()>OrderStopLoss())
            {      
             OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
            }
           }       
 
         if(OrderType() == OP_SELL) 
           {
            if(OrderOpenPrice()>=(Ask+BULevel)&&OrderOpenPrice()<OrderStopLoss()) 
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
             }
           } 
         }
       }
}
//------------------------------------------------------------------+


Точно таким же образом можно добавлять в эксперт и многие другие уже готовые функции.

Успешного обучения вам, дорогие друзья!
  • +3
  • Просмотров: 140538
  • 27 апреля 2011, 17:16
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Как написать простейший советник на MQL4?
26 апреля 2011
10 октября 2011

Комментарии (14)

+
+1
Молодец! Полезные для трейдерской общественности вещи
avatar

  32  Nord Сообщений: 1327 - Дмитрий

  • 27 апреля 2011, 17:27
+
0
Пишу пока есть свободное время.
avatar

  34  AM2 Автор Сообщений: 15882 - Андрей

  • 27 апреля 2011, 17:38
+
0
А топики писать может только организатор группы? Участники не могут?
avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 17 июня 2011, 18:29
+
+1
Топик может написать любой человек. «Кликните добавить новую запись».
avatar

  34  AM2 Автор Сообщений: 15882 - Андрей

  • 17 июня 2011, 19:46
+
0
amygran145, если в списке доступных групп нет нужной, то, вероятно, недостаточно уровня.
В таком случае Вы можете написать в своем блоге и сделать пометку с просьбой переместить в нужную группу. Я перемещу.
avatar

Inside Сообщений: 983 - модератор

  • 17 июня 2011, 20:51
+
+2
Большое спасибо! *улыбается*
Хочу создать топик как внедрить Мартингейл в советник! *улыбается*
Для особо агрессивных торговцев

AM2, скажите, а как вы прикрепили в топик код MQL чтобы он просматривался так красиво?
avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 18 июня 2011, 07:31
+
0
AM2, скажите, а как вы прикрепили в топик код MQL чтобы он просматривался так красиво?

Для этого нужно вставить код в текст, выделить его и нажать кнопку code в панели форматирования.

Добавил более подробное описание функций форматирования в Справку Там же в комментариях Вы можете задавать дальнейшие вопросы по использованию сайта, созданию топика, форматированию и т.д.
avatar

Inside Сообщений: 983 - модератор

  • 18 июня 2011, 08:49
+
0
Самый простой способ — скачать любого мартина и переделать его под себя.
avatar

  34  AM2 Автор Сообщений: 15882 - Андрей

  • 18 июня 2011, 18:48
+
0
Этот способ можно применить ко всему
amyrgan145 хочет полноценный мануал сделать — лишним точно не будет!
avatar

  11  pilot Сообщений: 410

  • 19 июня 2011, 21:17
+
0
Да да да *улыбается*Вот только я сейчас домой приехал с учебы, а тут ничего выше 3G от Мегафона нету, так что к концу недели только создам топик…
avatar

  9  amyrgan145 Сообщений: 428 - Амыр

  • 20 июня 2011, 14:52
+
0
предлагаю написать еще как к советнику приделать мартингейл.
avatar

  15  div15 Сообщений: 71 - div15

  • 4 сентября 2012, 19:34
+
+1
есть уже: mql.opentraders.ru/1663.html
avatar

  34  AM2 Автор Сообщений: 15882 - Андрей

  • 4 сентября 2012, 19:45
+
0
Всё это писалось довольно давно, т.е. под билд до 600 скорее всего.
А с новым билдом будет работать этот код БУ и Трала?

И как регулировать параметры: условие БУ, старт трала, шаг трала и расстояние до цены?
Редактирован: 1 ноября 2015, 18:08
avatar

  3  Lagoda Сообщений: 53

  • 1 ноября 2015, 18:03
+
0
А трейлингстарт(с какой прибыли стартовать трейлингстопу)можно прикрутить?
avatar

  19  alex30774 Сообщений: 715

  • 5 декабря 2018, 15:07

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари