Трал позиций стандартный (ступенчатый)

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Трал позиций стандартный (ступенчатый)

Сообщение Haos » 13 авг 2020, 19:41

Функция f_TrailingStairs имеет тип bool. Имеет четыре параметры. Прежде всего, должен быть выбран тикет позиции, которая будет тралиться.

Код: выделить все
bool f_TrailingStairs(int par_Ticket, int par_TrailStop, int par_TrailStep, int par_BreakEven)
{
   double dbl_Price, dbl_NewSL;
   double dbl_ProfitMin = 0;
   double dbl_TrailStop = par_TrailStop * Point;
   double dbl_TrailStep = par_TrailStep * Point;
   
   //---- Если длинная позиция (OP_BUY)
   if(OrderType() == OP_BUY)
   {
      dbl_Price = Bid;
      //---- безубыток для покупки
      if(par_BreakEven > 0)
      {
         if((dbl_Price - OrderOpenPrice()) > Point * par_BreakEven)
         {
            //---- Модификация стопов в безубыток выполняется один раз
            if((OrderStopLoss() - OrderOpenPrice()) < 0)
            {
               dbl_NewSL = OrderOpenPrice() + dbl_ProfitMin;
               return(true);
            }
         }   
      }
      if(par_TrailStop > 0)
      {
         if(dbl_Price - OrderOpenPrice() > dbl_TrailStop)
         {
            if(OrderStopLoss() < dbl_Price - (dbl_TrailStop + dbl_TrailStep))
            {
               dbl_NewSL = dbl_Price - dbl_TrailStop;
               return (true);
            }
         }
      }
   }
    //---- Если короткая позиция (OP_SELL)
    if(OrderType() == OP_SELL)
    {
      dbl_Price = Ask;
      double ld_Spread = Point * MarketInfo(Symbol(), MODE_SPREAD);
      dbl_TrailStop += ld_Spread;
      //---- безубыток для продажи
      if(par_BreakEven > 0)
      {
         if((OrderOpenPrice() - dbl_Price) > Point * par_BreakEven + ld_Spread)
         {
            //---- Модификация стопов в безубыток выполняется один раз
            if((OrderOpenPrice() - OrderStopLoss()) < 0)
            {
               dbl_NewSL = OrderOpenPrice() - dbl_ProfitMin;
               return (true);
            }
         }
      }
      if(par_TrailStop > 0)
      {
         if(OrderOpenPrice() - dbl_Price > dbl_TrailStop)
         {
            if(OrderStopLoss() > dbl_Price + (dbl_TrailStop + dbl_TrailStep) || OrderStopLoss() == 0)
            {
               dbl_NewSL = dbl_Price + dbl_TrailStop;
               return(true);
            }
         }
      }
   }

return(false);
}

В качестве параметров в функцию передается:
- Тикет ордера;
- Уровень, на котором срабатывает безубыток;
- Шаг трейлинга (минимальное приращение);
- Скользящий тейк-профит, ноль чтобы отключить его.

Пример инициализации переменных и вызова функции:
Код: выделить все
void OnTick()
{
   bool bolTral = false;
   // передаем в качестве параметров:
   int   Ticket      = 3576161; 
   int   BreakEven   = 30;         // Уровень, на котором срабатывает БезУбыток до размера в ProfitMIN
   int   TrailStep   = 5;          // Шаг трейлинга (минимальное приращение)
   int   TrailStop   = 50;         // Скользящий тейк-профит, ноль чтобы отключить его
 
   bolTral = f_TrailingStairs(Ticket, TrailStop, TrailStep, BreakEven);
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron