Обсуждение статьи "Как добавить Trailing Stop по индикатору Parabolic SAR"

 

Опубликована статья Как добавить Trailing Stop по индикатору Parabolic SAR:

При создании торговой стратегии нам нужно проверить самые разные варианты защитных стопов. И тут напрашивается динамическое подтягивание уровня Stop Loss вслед за ценой. Наилучшим кандидатом для этого является индикатор Parabolic SAR —трудно придумать что-либо проще и нагляднее.

Трейлинг-стоп — это автоматическое смещение StopLoss позиции за ценой, позволяющее постоянно удерживать защитный стоп на некоторой дистанции от цены. Такой подход позволяет трейдеру защитить часть накопленной прибыли, не выходя из позиции раньше времени. Каждый раз, когда рыночная цена удаляется от цены открытия позиции, трейлинг-стоп автоматически подтягивает StopLoss, сохраняя заданное расстояние между ним и текущей ценой. Однако если цена приближается к цене открытия, StopLoss остаётся на прежнем уровне. Это обеспечивает защиту от потерь при возможных рыночных колебаниях.

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

Есть функция-программа, которой передаётся требуемая цена для установки уровня StopLoss. Программа проверяет некоторые запрещающие факторы, такие как уровень StopLevel — дистанция, ближе которой стопы ставить нельзя, уровень FreezeLevel — дистанция заморозки, в пределах которой нельзя модифицировать позицию или отложенный ордер. Т.е. если цена подошла к стоп-уровню позиции на дистанцию ближе, чем уровень FreezeLevel, то ожидается срабатывание стоп-приказа, и модификация запрещена. У тралов есть ещё некоторые индивидуальные настройки параметров, которые тоже проверяются перед переносом уровня стоплосс на указанную цену, например символ и магик позиции. Все эти критерии проверяются непосредственно перед смещением StopLoss позиции на указанный уровень.

И вот таким "указателем" требуемых для StopLoss уровней как нельзя лучше подойдёт индикатор Parabolic SAR.




Автор: Artyom Trishkin

 
Спс за интересную статью. Бегло прочел. Основное усвоил. С телефона. Дома с компа подробнее ознакомлюсь и по аналогии буду использовать в своих проектах включаемые файлы - позже.
 
Roman Shiredchenko #:
Спс за интересную статью. Бегло прочел. Основное усвоил. С телефона. Дома с компа подробнее ознакомлюсь и по аналогии буду использовать в своих проектах включаемые файлы - позже.

Пожалуйста. Скоро выйдет статья по классам трейлингов - как логическое завершение этой темы.

Их будет использовать, скажем, более правильно и, как по мне, так удобнее.

 

Thanks for the article,

But I wish you modify this to avoid truncation errors with fp numbers:

        pos_profit_pt= int ((tick.bid - pos_open) / Point ());              // calculate the profit of the position in points 

To:

        pos_profit_pt= (int) MathRound((tick.bid - pos_open) / Point ());              // calculate the profit of the position in points 
 
Статья основательная, но слишком уж объемная для сравнительно небольшой темы. Не каждый осилит.
 
Зато расжевано все от и до... можно и другие индикаторы для трала подключать, по типу  МА например.
 
Artyom Trishkin #:

Пожалуйста. Скоро выйдет статья по классам трейлингов - как логическое завершение этой темы.

Их будет использовать, скажем, более правильно и, как по мне, так удобнее.

спасибо - взял к себе в роботы примеры: 

//--- если не новый бар - уходим из обработчика
   if(!IsNewBar())
      return;
и 
//--- устанавливаем в объект торгового класса магический номер
   ExtTrade.SetExpertMagicNumber(InpMagic);

 

сам такую тему перебора поз смотрю в работе...

//+------------------------------------------------------------------+
//| Manage Open Positions: Trailing Stop   |
//+------------------------------------------------------------------+
void ManageOpenPositions(string Sym, int mn)
  {
   if(TrailingStop > 0)
    for(int i = 0; i < PositionsTotal(); i++)
     {
      if(PositionGetSymbol(i)==Sym) // Select and check if the position is on the current symbol
      if(PositionGetString(POSITION_SYMBOL) == Sym)
      if(PositionGetInteger(POSITION_MAGIC)==mn || mn == -1)
        {
         ulong  ticket = (ulong)PositionGetInteger(POSITION_TICKET);      // Get the position ticket
...

вами предложенный вариант тоже посмотрю в работе:

//+------------------------------------------------------------------+
//| Функция трейлинга стопа по значению цены StopLoss                |
//+------------------------------------------------------------------+
void TrailingStopByValue(const double value_sl, const long magic=-1, const int trailing_step_pt=0, const int trailing_start_pt=0)
  {
//--- структура цен
   MqlTick tick={};
//--- в цикле по общему количеству открытых позиций
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      //--- получаем тикет очередной позиции
      ulong  pos_ticket=PositionGetTicket(i);
      if(pos_ticket==0)
         continue;
         
      //--- получаем символ и магик позиции
      string pos_symbol = PositionGetString(POSITION_SYMBOL);
      long   pos_magic  = PositionGetInteger(POSITION_MAGIC);
      
      //--- пропускаем позиции, не соответствующие фильтру по символу и магику
      if((magic!=-1 && pos_magic!=magic) || pos_symbol!=Symbol())
         continue;
         
      //--- если цены получить не удалось - идём далее
      if(!SymbolInfoTick(Symbol(), tick))
         continue;
...