← К каталогу
Исходный код · ID 2400

ctrailingstop.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека CTrailingStop.mqh представляет собой include-файл для MetaTrader 4, предоставляющий класс управления трейлинг-стопом. Класс реализует два метода перемещения стоп-лосса: по фиксированным уровням и на основе соотношения риск/прибыль. Для работы используются внешние библиотеки COrders и CUtils.

При инициализации класс привязывается к конкретному торговому символу и отслеживает позицию по её тикету. Пользователь может настроить несколько уровней трейлинга с индивидуальными триггерами и расстояниями, а также задать соотношение риск/прибыль для автоматической фиксации прибыли.

Библиотека поддерживает как ордера на покупку, так и на продажу. В финальном режиме трейлинга стоп-лосс перемещается вслед за ценой с заданным шагом. Позиции могут быть закрыты при достижении стоп-лосса или целевого соотношения риск/прибыль.

Настройки программы

НастройкаОписание
__trailingStop__ Текстовый заголовок, разделяющий группу настроек трейлинг-стопа.
TrailingMethod Метод трейлинга: фиксированные уровни или соотношение риск/прибыль.
TakeProfitAt Соотношение риск/прибыль для фиксации прибыли: от 1:1 до 6:1.
OrderHiddenSL Расстояние скрытого стоп-лосса в пунктах при начальной установке позиции.
OrderTS1 Расстояние трейлинг-стопа до первого уровня фиксации в пунктах.
OrderTS1Trigger Цена-триггер для перехода на первый уровень трейлинга.
OrderTS2 Расстояние трейлинг-стопа до второго уровня фиксации в пунктах.
OrderTS2Trigger Цена-триггер для перехода на второй уровень трейлинга.
OrderTS3 Расстояние трейлинг-стопа до третьего уровня фиксации в пунктах.
OrderTS3Trigger Цена-триггер для перехода на третий уровень трейлинга.
OrderTS4 Расстояние трейлинг-стопа до четвёртого уровня фиксации в пунктах.
OrderTS4Trigger Цена-триггер для перехода на четвёртый уровень трейлинга.
OrderTrail Расстояние скользящего трейлинга в финальном режиме в пунктах.

Состав библиотеки

Классов: 1 · методов: 7 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 0

Классы
Класс class CTrailingStop

Класс CTrailingStop — реализация трейлинг-стопа для управления позициями на рынке.

Методы и конструкторы
Конструктор · CTrailingStop CTrailingStop(string symbol)

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

Деструктор · CTrailingStop ~CTrailingStop()

Деструктор класса, освобождающий ресурсы и удаляя внутренний объект управления ордерами.

Метод · CTrailingStop void SetInitalStoploss(int ticket, double stoploss)

Устанавливает начальный стоп-лосс для позиции по указанному тикету и начинает трейлинг.

Метод · CTrailingStop double GetRiskReward(int ticket)

Возвращает текущее соотношение риск/прибыль для управляемой позиции по тикету.

Метод · CTrailingStop double GetStoploss(int ticket)

Возвращает текущий уровень стоп-лосса для управляемой позиции по тикету.

Метод · CTrailingStop void Trail()

Запускает процесс трейлинга — перемещение стоп-лосса для управляемой позиции.

Метод · CTrailingStop bool CloseOrder(double riskReward,double maxRiskReward)

Закрывает позицию при достижении заданного соотношения риск/прибыль.

Метод · CTrailingStop void TrailRiskReward()

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

Метод · CTrailingStop void TrailFixed()

Трейлинг-стоп по фиксированным уровням с поэтапным перемещением стоп-лосса и финальным скользящим режимом.

Получить полный код

Поиск по коду файла

??//+------------------------------------------------------------------+

//|                                                CTrailingStop.mqh |

//|                                    Copyright 2017, Erwin Beckers |

//|                                              www.erwinbeckers.nl |

//+------------------------------------------------------------------+

#property copyright "Copyright 2017, Erwin Beckers"

#property link      "www.erwinbeckers.nl"

#property strict

// taken from https://www.forexfactory.com/showthread.php?t=446353



#include <CUtils.mqh>;

#include <COrders.mqh>;



enum TrailingMethods

{

   UseTrailingStops,

   UseRiskRewardRatios

};



enum TakeProfitRiskRewardRatios

{

   RR_1_1,

   RR_2_1,

   RR_3_1,

   RR_4_1,

   RR_5_1,

   RR_6_1

};



extern   string   __trailingStop__          = " ------- Trailing stoploss settings ------------";

extern   TrailingMethods            TrailingMethod = UseTrailingStops;   

extern   TakeProfitRiskRewardRatios TakeProfitAt   = RR_2_1;   

extern   double   OrderHiddenSL             = 50;   



extern   double   OrderTS1                  = 30;        

extern   double   OrderTS1Trigger           = 50;



extern   double   OrderTS2                  = 40;     

extern   double   OrderTS2Trigger           = 60; 



extern   double   OrderTS3                  = 50;       

extern   double   OrderTS3Trigger           = 70;

 

extern   double   OrderTS4                  = 60; 

extern   double   OrderTS4Trigger           = 80; 



extern   double   OrderTrail                = 10;



const int MAX_ORDERS = 500;



enum ORDER_STATE

{

   ORDER_OPENED,

   ORDER_OPENED_INITIAL_STOPLOSS,

   ORDER_LEVEL_1,

   ORDER_LEVEL_2,

   ORDER_LEVEL_3,

   ORDER_LEVEL_4,

   ORDER_TRAIL

};



//-------------------------------------------------------------------------

//-------------------------------------------------------------------------

class CTrailingStop

{

private:   

   COrders*    _orderMgnt;

   bool        IsBuy;

   int         Ticket;   

   double      OpenPrice;

   double      StopLoss;

   double      InitialStopLoss;

   double      RiskReward;

   ORDER_STATE State;

   string      _symbol;

   double      MaxRiskReward;

   

	double   _orderHiddenSL;

	double   _orderTS1;      

	double   _orderTS1Trigger;

	double   _orderTS2;

	double   _orderTS2Trigger;

	double   _orderTS3;

	double   _orderTS3Trigger;

	double   _orderTS4;

	double   _orderTS4Trigger;

public: 

   //-------------------------------------------------------------------------

   CTrailingStop(string symbol)

   {

      Ticket     = -1;

      _symbol    = symbol;

      _orderMgnt = new COrders(symbol);

	  

	  _orderHiddenSL = OrderHiddenSL;

	  _orderTS1 = OrderTS1; 

	  _orderTS2 = OrderTS2;

	  _orderTS3 = OrderTS3;  

	  _orderTS4 = OrderTS4;   

	  _orderTS1Trigger = OrderTS1Trigger;

	  _orderTS2Trigger = OrderTS2Trigger;

	  _orderTS3Trigger = OrderTS3Trigger;

	  _orderTS4Trigger = OrderTS4Trigger;

   }

   

   //-------------------------------------------------------------------------

   ~CTrailingStop()

   {

      delete _orderMgnt;

   }

   

   //-------------------------------------------------------------------------

   void SetInitalStoploss(int ticket, double stoploss)

   {

      Ticket = -1;

      if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

      {

         if (OrderSymbol() == _symbol)

         {

            Print(_symbol," Trail: Add order ticket:", ticket, " op:", DoubleToStr(OrderOpenPrice(),5),  " sl:",DoubleToStr(stoploss,5));

            IsBuy           = (OrderType()  == OP_BUY ||  OrderType()== OP_BUYLIMIT || OrderType()== OP_BUYSTOP);

            Ticket          = OrderTicket();

            OpenPrice       = OrderOpenPrice();

            InitialStopLoss = OrderStopLoss();

            StopLoss        = OrderStopLoss();

            RiskReward      = 0;

            MaxRiskReward   = 0;

            State           = ORDER_OPENED;

            if (stoploss > 0)

            {

               StopLoss        = stoploss;

               InitialStopLoss = stoploss;

               State            = ORDER_OPENED_INITIAL_STOPLOSS;

            }

            

            Trail();

         }

         else

         {

           Print(_symbol," Trail: symbol wrong:", OrderSymbol());

         }

      }

      else

      {

        Print(_symbol," Trail: ticket wrong:", ticket);

      }

   }

   

   //-------------------------------------------------------------------------

   double GetRiskReward(int ticket)

   {

      if (Ticket != ticket) return 0;

      return RiskReward;

   }

   

   //-------------------------------------------------------------------------

   double GetStoploss(int ticket)

   {

      if (Ticket != ticket) return 0;

      return StopLoss;

   }

   

   //-------------------------------------------------------------------------

   void Trail()

   {

      if (Ticket < 0) return;

      if (!IsTesting() && !IsOptimization())

      {

        if (!MarketInfo(_symbol, MODE_TRADEALLOWED)) return;

      }

      if (!OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))

      {

         Print(_symbol," Trail: order was closed:", Ticket);

         Ticket     = -1;

         RiskReward = 0;

         MaxRiskReward =0;

         InitialStopLoss = 0;

         StopLoss   = 0;

         OpenPrice  = 0;

         State      = ORDER_OPENED;

         return;

      }

      

      if ( OrderCloseTime() != 0 ) 

      {

         Print(_symbol," Trail: order was closed:", Ticket);

         Ticket     = -1;

         RiskReward = 0;

         MaxRiskReward =0;

         InitialStopLoss = 0;

         StopLoss   = 0;

         OpenPrice  = 0;

         State      = ORDER_OPENED;

         return;

      }

      

      if (TrailingMethod == UseTrailingStops)

      {

         TrailFixed();

         return;

      }

      if (TrailingMethod == UseRiskRewardRatios)

      {

         TrailRiskReward();

         return;

      }

   }

   

   //-------------------------------------------------------------------------

   bool CloseOrder(double riskReward,double maxRiskReward) 

   {

      bool close=false;

      if (maxRiskReward > 6 && riskReward <=5) close=true;

      else if (maxRiskReward > 5 && riskReward <=4) close=true;

      else if (maxRiskReward > 4 && riskReward <=3) close=true;

      else if (maxRiskReward > 3 && riskReward <=2) close=true;

      else if (maxRiskReward > 2 && riskReward <=1) close=true;

      else if (maxRiskReward > 1 && riskReward <=0.1) close=true;

      if (!close) return false;

            

      Print(_symbol," Trail: Order:", Ticket, " Take profit at RR:"+DoubleToStr(riskReward,2)+" (max:"+DoubleToStr(maxRiskReward,2)+")");

      if ( _orderMgnt.CloseOrderByTicket(Ticket) ) Ticket=-1;

      return true;

   }

   

   //-------------------------------------------------------------------------

   void TrailRiskReward()

   {

      double askPrice = _utils.AskPrice(_symbol);

      double bidPrice = _utils.BidPrice(_symbol);

      

      if (IsBuy)

      {

         RiskReward = (bidPrice - OpenPrice) / MathAbs( OpenPrice - InitialStopLoss);

         MaxRiskReward = MathMax(MaxRiskReward, RiskReward);

         if (CloseOrder(RiskReward,MaxRiskReward)) return;

         

         if (bidPrice <= InitialStopLoss)

         {

            Print(_symbol," Trail: Order:", Ticket, " close SL hit (max:"+DoubleToStr(MaxRiskReward,2)+")");

            if ( _orderMgnt.CloseOrderB

Показано первые 50% кода (символов: 25123)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 512,30₽ ≈ $30.71