Способы изменения стоп-лосса

 

 Решил написать код изменения стоп-лосса (трейлинг) в своем советнике. Поискал примеры на форуме и нашел два способа изменения стопа:

1. В статье "Как создать свой Trailing Stop"https://www.mql5.com/ru/articles/134 сначала подготавливаеться структура торгового запроса:

//--- заполнение структуры торгового запроса
   m_request.symbol=m_symbol;                    // подготовка структуры торгового запроса, установка символа
   m_request.action=TRADE_ACTION_SLTP;           // подготовка структуры торгового запроса, установка типа торгового действия
Дальше перед выполнением модификации заполняем поля sl и tp структуры MqlTradeRequest. Переменной m_request.sl присваивается требуемое значение Стоп Лосс, переменной m_request.tp - существующее значение Тейк Профит (его оставляем без изменений); остальные поля уже заполнены при выполнении метода Init(). После заполнения структуры вызывается функция OrderSend().

 

if(sl>possl)
        {//--- если новое значение стоплосс выше, чем текущее значение стоплосс, 
         //    будет выполнена попытка переместить стоплосс на новый уровень
         //--- заполнение структуры запроса
         m_request.sl=sl; 
         //--- заполнение структуры запроса
         m_request.tp=PositionGetDouble(POSITION_TP); 
         //--- запрос
         OrderSend(m_request,m_result); 

2. В статье "Рецепты MQL5 - Как не получить ошибку при установке/изменении торговых уровней?" https://www.mql5.com/ru/articles/643 для модификации позиции используется метод PositionModify из торгового класса CTrade стандартной библиотеки. 

 if(pos_sl>0)
           {
            //--- Если выполняется условие на модификацию ордера, т.е. новое значение ниже/выше, 
            //    чем текущее, модифицируем защитный уровень позиции
            if(condition)
              {
               if(!trade.PositionModify(_Symbol,new_sl,pos_tp))
                  Print("Ошибка при модификации позиции: ",GetLastError()," - ",ErrorDescription(GetLastError()));
              }
           }

 Обьясните какая разница между ними? И какой способ лучше использовать в своем советнике?

Как создать свой Trailing Stop
Как создать свой Trailing Stop
  • 2010.08.05
  • Dmitry Fedoseev
  • www.mql5.com
Основное правило трейдера - дай прибыли расти, обрезай убытки! В статье рассматривается один из основных технических приемов, позволяющий следовать этому правилу - перемещение уровня защитной остановки (уровня Stoploss) вслед за растущей прибылью позиции, другими словами - скользящий стоп или трейлинг стоп (trailingstop). Приводится пошаговая процедура создания класса для трейлинг стопа на индикаторах SAR и NRTR, который каждый желающий сможет за 5 минут встроить в своего эксперта или использовать независимо для управления позициями на своем счете.
 

sergey250581:

...Обьясните какая разница между ними?

Процедуры vs. ООП


И какой способ лучше использовать в своем советнике?

Дык, а хто его знает...

 
sergey250581:

 Решил написать код изменения стоп-лосса (трейлинг) в своем советнике. Поискал примеры на форуме и нашел два способа изменения стопа:

1. ...После заполнения структуры вызывается функция OrderSend().

2. ... используется метод PositionModify из торгового класса CTrade стандартной библиотеки. 

 Обьясните какая разница между ними? И какой способ лучше использовать в своем советнике?

 

Стандартная библиотека предоставлена в исходных кодах, что снимает очень многие вопросы.  

Откройте файл Trade\Trade.mqh  стандартной библиотеки, и найдите имплементацию метода PositionModify. Вы увидите следующее:

bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

 

То есть, этот метод просто включает пару дополнительных действий, после чего - использует все тот же  OrderSend(), и, соответственно, вся разница именно в этих самых дополнительных действиях.

Лично на мой взгляд, все упирается в реализацию возможностей ООП в вашем советнике. Если вы кодите "по-старинке", используя процедурный подход MQL4 - вам, вероятно, будет целесообразно использовать первый вариант. Скорее всего, оно так и есть.

 

Использовать объект CTrade целесообразно, если у вас имеется развитая структура классов, которая использует многие возможности Стандартной Библиотеки. 

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5