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

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Код:
//+------------------------------------------------------------------+
void TrailSL()
  {
   double sl;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderProfit()>0)
           {
            if(OrderType()==OP_BUY)
              {
               sl=NormalizeDouble(Bid-TrailDistance*Point,Digits); // расчет стоп-лосса к текущей цене - расстояние

               if(OrderStopLoss()>sl || OrderStopLoss()==sl) continue;

               bool res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrOrangeRed);
               if(!res) Print("Modify Error: ",GetLastError());
              }

            if(OrderType()==OP_SELL)
              {
               sl=NormalizeDouble(Ask+TrailDistance*Point,Digits); // расчет стоп-лосса к текущей цене + расстояние

               if(OrderStopLoss()<sl || OrderStopLoss()==sl) continue;

               bool res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrOrangeRed);
               if(!res) Print("Modify Error: ",GetLastError());

              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
 

romanzif

Постоялец
Команда форума
Администратор
Форекс робот VolnaFX
Монет
23,220
Метода расчёта куда перемещать СЛ можно менять.
Тогда строку sl=NormalizeDouble(Bid-TrailDistance*Point,Digits); и sl=NormalizeDouble(Ask+TrailDistance*Point,Digits);
нужно заменить на то по какому принципу вы хотите тралить СЛ.

Например можно тралить не на фиксированное расстояние как в примере выше, а за хай/лоу ближайших Н свечей или за ближайший хай/лоу.
Или за фрактал.
Или за скользящую среднюю.

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

Сигналы

Заработок онлайн

Верх