Трейлинг, TrailingStop

 

Часто спрашивают про трейлинг и всё чаще хотят что-то универсальное. Так вот - универсальность - враг хорошего :). 

Итак трейлинг - это "подтягивание" уровня StopLoss для прибыльной позиции.

В общем здесь будут примеры реализации трейлинга. И первый образец - TrailingStop версия "1.00". Учитывает ситуацию когда у позиции StopLoss равен нулю (например при открытии позиции StopLoss не был задан) и когда StopLoss не равен нулю (такое может быть, когда при открытии позиции StopLoss был задан сразу или после модификации StopLoss'a). В данной реализации модификация позиций встроена в цикл перебора позиций.

Всего два параметра:

TrailingStop Inputs 

TrailingStop - собственно отступ между ценой и уровнем StopLoss

TrailingStep - защита от чрезмерно частой модификации позиции. 

Как работает TrailingStop (трейлинг, TrailingStop) - на примере позиции Buy: 

сначала у позиции StopLoss равен нулю, ждем выполнения условия

                  if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())

- то есть когда цена Bid минус TrailingStop  больше, чем цена открытия позиции PriceOpen:

TrailingStop sl to priceopen

в результате переносим StopLoss на уровень цены открытия позиции PriceOpen:

TrailingStop sl to priceopen result.png

теперь, когда у позиции есть StopLoss (точнее когда StopLoss не равен нулю), ждём выполнения условия:

                  if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())

- то есть когда цена Bid минус TrailingStop минус TrailingStep больше, чем цена StopLoss. Обратите внимание, здесь уже в проверку вводим значение TrailingStep - это нужно чтобы не допустить модификации позиции НА КАЖДОМ ТИКЕ:

TrailingStop trailing

в результате переносим StopLoss на уровень Bid минус TrailingStop:

TrailingStop trailing result.png 

а теперь наглядно, зачем нужна была защита в виде TrailingStep:

TrailingStop non trailing  

TrailingStop.mq5 version   "1.001": исправлено поведение для SELL позиции

Файлы:
 

Спасибо)

Идеальное объяснение!  

 

Тот же советник, только трейлинг вынесен полностью в отдельную функцию:

//+------------------------------------------------------------------+
//| Trailing позиции                                                 |
//|  При таком подходе ожидается, что позиция УЖУ ВЫБРАНА и          |
//|  произвели обновление цен в методе RefreshRates()                |
//+------------------------------------------------------------------+
void TrailingStop(const ulong ticket,const double trailing,const double step)

 при таком подходе ожидается, что:

позиция УЖУ ВЫБРАНА и произвели обновление цен в методе RefreshRates()

Выбор позиция стандартен:

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
            TrailingStop(m_position.Ticket(),ExtTrailingStop,ExtTrailingStep);


 

Советник "TrailingStopSeparateFunction.mq5", версия "1.001": исправлено поведение для SELL позиции

Файлы:
 
+
 

Трейлинг (точнее модификация) отложенных ордеров.

Вариантов уйма, а пока, чтобы не забыть, какие вообще могут быть отложенные ордера:

MetaTrader 5. Отложенный ордер 

 

Владимир обнаружил у вас в коде ошибку в обоих вариантах она присутствует

//+------------------------------------------------------------------+
//| Trailing позиции                                                 |
//|  При таком подходе ожидается, что позиция УЖУ ВЫБРАНА и          |
//|  произвели обновление цен в методе RefreshRates()                |
//+------------------------------------------------------------------+
void TrailingStop(const ulong ticket,const double trailing,const double step)
  {
//--- TrailingStop -> подтягивание StopLoss у ПРИБЫЛЬНОЙ позиции
   if(m_position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- когда у позиции ещё нет StopLoss
      if(m_position.StopLoss()==0)
        {
         //--- пока StopLoss равен 0.0, TrailingStep не учитываем
         if(m_symbol.Bid()-ExtTrailingStop>m_position.PriceOpen())
           {
            //--- модификация позиции
            m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
           }
        }
      //--- у позиции уже есть StopLoss
      else
        {
         //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
         //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
         if(m_symbol.Bid()-ExtTrailingStop-ExtTrailingStep>m_position.StopLoss())
           {
            //--- модификация позиции
            m_trade.PositionModify(m_position.Ticket(),
                                   NormalizeDouble(m_symbol.Bid()-ExtTrailingStop,m_symbol.Digits()),0.0);
           }
        }
     }

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      //--- когда у позиции ещё нет StopLoss
      if(m_position.StopLoss()==0)
        {
         //--- пока StopLoss равен 0.0, TrailingStep не учитываем
         if(m_symbol.Ask()+ExtTrailingStop<m_position.PriceOpen())
           {
            //--- модификация позиции
            m_trade.PositionModify(m_position.Ticket(),m_position.PriceOpen(),0.0);
           }
        }
      //--- у позиции уже есть StopLoss
      else
        {
         //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
         //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО
         if(m_symbol.Bid()+ExtTrailingStop+ExtTrailingStep<m_position.StopLoss())
           {
            //--- модификация позиции
            m_trade.PositionModify(m_position.Ticket(),
                                   NormalizeDouble(m_symbol.Ask()+ExtTrailingStop,m_symbol.Digits()),0.0);
           }
        }
     }
  }


 .......

 
Sergey Gritsay:

Владимир обнаружил у вас в коде ошибку в обоих вариантах она присутствует


 .......

Спасибо за внимательность.
 
Vladimir Karputov:

Часто спрашивают про трейлинг и всё чаще хотят что-то универсальное. Так вот - универсальность - враг хорошего :). 

Итак трейлинг - это "подтягивание" уровня StopLoss для прибыльной позиции. [не совсем врено]


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

Как по мне, если создавать специальные поясняющие ветки (что стали делать вы в последнее время), то надо давать исчерпывающее по правильности и точности пояснение.

В противном случае, правильный ответ будет размыт в диалоге.

А неточный или неправильный ответ в вашем первом посту -- будет обесценивать наш ресурс как FAQ



На самом деле -- трейлинг-стоп (а не "трейлинг") дословно с английского переводится как "перемещаемая остановка" -- и его назначение, это следование стоп-лосса в направлении движении цены на указанном расстоянии.

Конкретно к прибыльной позиции трейлинг-стоп имеет отношение только в частном случае, исходя из того как он будет функционально организован. Можно стоп-лосс тралить как с позиции безубытка (только прибыльную позицию), а можно тралить с любой позиции (безотносительно прибыльная или убыточная позиция).

 
Andrey F. Zelinsky:


Нет никаких жёстких правил и ограничений в MQL5 творчестве. Решения рождаются под конкретные задачи - поэтому и открыта ветка - здесь можно писать разнообразные варианты.
 
Vladimir Karputov:
Нет никаких жёстких правил и ограничений в MQL5 творчестве. Решения рождаются под конкретные задачи - поэтому и открыта ветка - здесь можно писать разнообразные варианты.

Карпутов -- вам лично творить никто не мешает, ровно как ресурс mql5 творчеству только способствует.

Как я всё понимаю -- я нахожу по поиску "трейлинг-стоп" вашу эту ветку -- читаю кто автор -- читаю "модератор" -- и понимаю ваш ответ как абсолютно правильный и исчерпывающий. Так я отношусь к ответам Рената, Роша, Стринго и любого модератора из сервисдеска. Для меня их ответы исчерпывающие и окончательные. У верен, что не только для меня.

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

p.s. Карпутов, вы не простой пользователь -- вы модератор -- и за свои слова и за свои пояснения с вас лично спрос выше чем с любого другого. Два равных ответа -- мой и ответ ваш как модератора -- ваш ответ будет восприниматься априори как ответ авторитетней моего. Не понятно, почему вы этого не понимаете.

 
Vladimir Karputov:
         //--- теперь TrailingStep нужно учитывать, иначе мы будет модифицировать
         //--- поизцию НА КАЖДОМ ТИКЕ, а это ПЛОХО

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

если с каждым тиком у позиции БАЙ цена будет двигаться вверх -- то да, на каждом тике будет отдаваться приказ на модификацию

что в этом плохого?

например, штатный терминальный трейлинг-стоп -- модифицирует стоп-лосс на каждом тике при движении цены в заданном направлении, у него шаг =1 и вообще нет возможности менять это значение

Причина обращения: