Функция трейлинг-стопа

Функция трейлинг-стопа в mql4

Во внешних переменных определяем:

extern int        TStopBuy      = 50; //Start Trailing
extern int TrailingStep = 10; //Step Trailing
bool TSProfitOnly = true;//
int TStopSell = TStopBuy;//

Сама функция трейлинг-стопа mql:

//+----------------------------------------------------------------------------+
//|  Описание : Сопровождение позиций простым тралом                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SimpleTrailing(string sy="", int op=-1, int mn=-1)
  {
   double po, pp;
   int    i, k=OrdersTotal();

   if(sy=="0")
      sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
           {
            po=MarketInfo(OrderSymbol(), MODE_POINT);
            if(mn<0 || OrderMagicNumber()==mn)
              {
               if(OrderType()==OP_BUY)
                 {
                  pp=MarketInfo(OrderSymbol(), MODE_BID);
                  if(!TSProfitOnly || pp-OrderOpenPrice()>TStopBuy*po)
                    {
                     if(OrderStopLoss()<pp-(TStopBuy+TrailingStep-1)*po)
                       {
                        OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(pp-TStopBuy*po,_Digits),OrderTakeProfit(),0,clrNONE);
                       }
                    }
                 }

               if(OrderType()==OP_SELL)
                 {
                  pp=MarketInfo(OrderSymbol(), MODE_ASK);
                  if(!TSProfitOnly || OrderOpenPrice()-pp>TStopSell*po)
                    {
                     if(OrderStopLoss()>pp+(TStopSell+TrailingStep-1)*po || OrderStopLoss()==0)
                       {
                        OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(pp+TStopSell*po,_Digits),OrderTakeProfit(),0,clrNONE);
                       }
                    }
                 }
              }
           }
        }
     }
  }

Поделись с друзьями: