Обсуждение статьи "Универсальный торговый эксперт: Работа с пользовательскими трейлинг-стопами (часть 6)"

 

Опубликована статья Универсальный торговый эксперт: Работа с пользовательскими трейлинг-стопами (часть 6):

Шестая часть статьи об универсальном торговом эксперте описывает работу с трейлинг-стопами. Прочитав ее, Вы узнаете, как с помощью унифицированных правил создать свой собственный модуль трейлинг-стопа и подключить его в торговый движок таким образом, чтобы управление позицией с его помощью происходило в автоматическом режиме.

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

class CStrategy
   {
public:
   double TrailingMode1(CPosition* pos);
   };

Автор: Vasiliy Sokolov

 
Теперь всё работает - просто класс...все и сразу... спасибо большое...так и знал что пока не устаканится новая версия...будут ошибки...))
 
Здравствуйте. Отличная работа, большое спасибо! Скажите, не планируете ли вы внедрить в движок подходы для торговли на MOEX, описанные вами же в статье https://www.mql5.com/ru/articles/1683? Конкретно интересует анализ рыночной ликвидности и на его основании вход с заданным отклонением (макс. проскальзыванием).
Как обезопасить себя и своего эксперта при торговле на Московской бирже
Как обезопасить себя и своего эксперта при торговле на Московской бирже
  • 2015.06.18
  • Vasiliy Sokolov
  • www.mql5.com
В статье подробно описываются методы работы, призванные обеспечить безопасность совершения торговых операций на биржевых и малоликвидных рынках, на примере срочной секции Московской биржи. Статья является логическим продолжением статьи "Основы биржевого ценообразования на примере срочной секции Московской биржи", в которой даны теоретические основы биржевой торговли, но носит более практический характер.
 
igorbel:
Здравствуйте. Отличная работа, большое спасибо! Скажите, не планируете ли вы внедрить в движок подходы для торговли на MOEX, описанные вами же в статье https://www.mql5.com/ru/articles/1683? Конкретно интересует анализ рыночной ликвидности и на его основании вход с заданным отклонением (макс. проскальзыванием).
Предложение интересное. Посмотрим.
 
//+------------------------------------------------------------------+
//| Закрывает текущую позицию по рынку, устанавливая закрывающий     |
//| комментарий равный comment                                       |
//+------------------------------------------------------------------+
bool CPosition::CloseAtMarket(string comment="")
  {
   if(!IsActive())
      return false;
   m_trade.PositionModify(m_id, 0.0, 0.0);
   ENUM_ACCOUNT_MARGIN_MODE mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
   if(mode != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
      return m_trade.PositionClose(m_symbol);
   return m_trade.PositionClose(m_id);
  }

 

Скажите, а зачем m_trade.PositionModify(m_id, 0.0, 0.0) в этой функции? У меня в журнале ошибки Invalid Stops из-за этой операции.

 
igorbel:

Скажите, а зачем m_trade.PositionModify(m_id, 0.0, 0.0) в этой функции? У меня в журнале ошибки Invalid Stops из-за этой операции.

Это рудименты старой версии. Спасибо что указали, будет исправлено.
 

Вроде ничего не менял, а при компиляции любого из модулей трейлинга, включая базовый класс ошибки:

'CTrailing' - declaration without type  PositionMT5.mqh 48      4
'Trailing' - undeclared identifier      PositionMT5.mqh 73      20
'Trailing' - object pointer expected    PositionMT5.mqh 73      20
'Trailing' - object pointer expected    PositionMT5.mqh 74      14
 
bool CTrailingClassic::Modify(void)
  {

   if(CheckPointer(m_position)==POINTER_INVALID)
     {
      string text="Invalid position for current trailing-stop. Set position with 'SetPosition' method";
      CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
      Log.AddMessage(msg);
      return false;
     }
   if(m_diff_extremum<=0.0)
     {
      string text="Set points trailing-stop with 'SetDiffExtremum' method";
      CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
      Log.AddMessage(msg);
      return false;
     }
   double extremum=FindExtremum(m_position);
   if(extremum == 0.0)return false;
   double n_sl = 0.0;
   if(m_position.Direction()==POSITION_TYPE_BUY)
      n_sl=extremum-m_diff_extremum;
   else
      n_sl=extremum+m_diff_extremum;
   if(n_sl!=m_position.StopLossValue())
      return m_position.StopLossValue(n_sl);
   return false;
  }

 Не помешала бы проверка, что новый sl ниже текущей цены для длинной позиции и выше текущей цены для короткой позиции.

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