Обсуждение статьи "Кроссплатформенный торговый советник: Стоп-уровни" - страница 2

 

Я пытаюсь изменить стоп-лосс для основного стопа... Как мне это сделать?

Это то, что я делаю:

COrder *order=orders.At(i);

....

COrderStop *order_stop=order.MainStop();
double new_sl=...;
order_stop.StopLoss(new_sl);
order.MainStop(order_stop);
order.CheckStops();

Я действительно сломал голову, пытаясь сделать это...

Basic Principles - Trading Operations - MetaTrader 5 Help
Basic Principles - Trading Operations - MetaTrader 5 Help
  • www.metatrader5.com
Before you proceed to study the trade functions of the platform, you must have a clear understanding of the basic terms: order, deal and position...
 

Он не обновляется из-за проверки в COrderStopVirtualBase::Update

if(CheckPointer(m_objsl))
  {
   double sl_line=m_objsl.GetPrice();
   if(sl_line!=StopLoss())
      stoploss= sl_line;
  }

StopLoss() возвращает новое значение, но sl_line все еще старый...

 
Enrico Lambino:
Привет, Шеп,

Спасибо, что указали на это. Я не замечал этого до сих пор. Я обновлю код.

Да, я знаю об этом. Это все еще связано с прямыми объявлениями. CStop требует в своих методах экземпляры COrder и COrderStop. То же самое происходит и при попытке скомпилировать CStop. Все эти классы, которые требуют друг друга, должны быть скомпилированы вместе. При компиляции каждого из них по отдельности будут возникать ошибки. Например:

This не скомпилируется. Вы должны объявить прямое объявление, чтобы компилятор распознал член класса m_object2 внутри класса Object1:

Это нормально, если Object1 и Object2 находятся в одном файле. Если же они находятся в двух разных файлах, то вам нужно сделать прямое объявление для Object2 в файле класса Object1, а для Object1 - в файле класса Object 2. Тогда компилятор не выдаст ошибок, если вы скомпилируете любой из файлов. Это так, пока вы не добавите методы в один из двух классов.

Текущая версия компилятора распознает прямые объявления, но не перечисленные методы класса, объявленного прямо. Именно поэтому вы не получаете сообщений об ошибках типа "CStop - объявление без типа", но получаете сообщения об ошибках компилятора для методов, подобных тому, что вы опубликовали выше. Компилятор распознает класс, но не методы класса, который был объявлен прямо.


Привет, Энрико,

Спасибо за быстрый ответ. Вы совершенно правы насчет прямого объявления. Я беспокоился, что это может быть более глубокой проблемой. Логично, что объект, использующий прямо объявленный класс, не знает о членах этого класса.

Я использую другую модель для своего механизма выполнения, которая использует паттерн стратегии. У меня есть несколько раздражающих проблем с ней, и я как раз просматривал вашу библиотеку, когда столкнулся с этими проблемами.

Ваша работа действительно великолепна, вы обладаете хорошими навыками проектирования и дизайна, спасибо, что поделились с нами.

Спасибо, Шеп.

 
Shephard Mukachi:

Привет, Энрико,

Спасибо за быстрый ответ. Вы совершенно правы насчет прямого объявления. Я беспокоился, что это может быть более глубокой проблемой. Логично, что объект, использующий прямо объявленный класс, не знает о членах этого класса.

Я использую другую модель для своего механизма выполнения, которая использует паттерн стратегии. У меня есть несколько раздражающих проблем с ней, и я как раз просматривал вашу библиотеку, когда столкнулся с этими проблемами.

Ваша работа действительно великолепна, вы обладаете хорошими навыками проектирования и дизайна, спасибо, что поделились с нами.

Спасибо, Шеп.

Привет, Шеп,

Не за что, и спасибо, что сообщили мне об этом. Помнится, я тоже был немного озадачен, когда столкнулся с этой проблемой с прямыми объявлениями.

Рад слышать, что статьи оказались для вас полезными. Желаю вам всего наилучшего в ваших усилиях по созданию собственного EA-движка.

С уважением, Энрико

 
mbjen:

Он не обновляется из-за проверки в COrderStopVirtualBase::Update

StopLoss() возвращает новое значение, но sl_line все еще старый...

Назначение COrderStopVirtualBase::Update на самом деле противоположно тому, что вы задумали. Он предназначен для корректировки значения sl/tp при обновлении его собственной стоп-линии, обычно извне эксперта (перетаскивание на график или прямое изменение значения в окне свойств объекта ). Вместо этого используйте методы MoveStopLoss() и MoveTakeProfit() для виртуальных стопов.

Это должно быть в следующей статье, но если вам не терпится, вы можете взглянуть на метод CheckTrailing() в COrderStopBase. Он изменяет стоп-ордер, если он имеет право на трейлинг. Метод применим ко всем трем типам:

bool COrderStopBase::CheckTrailing(void)
  {
   if(!CheckPointer(m_stop) || m_order.IsClosed() || m_order.IsSuspended() || 
      (m_stoploss_closed && m_takeprofit_closed))
      return false;
   double stoploss=0,takeprofit=0;
   string symbol=m_order.Symbol();
   ENUM_ORDER_TYPE type=m_order.OrderType();
   double price=m_order.Price();
   double sl = StopLoss();
   double tp = TakeProfit();
   if(!m_stoploss_closed)
      stoploss=m_stop.CheckTrailing(symbol,type,price,sl,TRAIL_TARGET_STOPLOSS);
   if(!m_takeprofit_closed)
      takeprofit=m_stop.CheckTrailing(symbol,type,price,tp,TRAIL_TARGET_TAKEPROFIT);
   if(!IsStopLossValid(stoploss))
      stoploss=0;
   if(!IsTakeProfitValid(takeprofit))
      takeprofit=0;
   return Modify(stoploss,takeprofit); //<---- this
  }

Кроме того, класс CTrail можно использовать для изменения уровней sl/tp без необходимости получения экземпляра ордерного стопа (не только для трейлинга или безубытка).

 

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

СБ под MT5 - пример элегантности, по сравнению с данным циклом статей. Да еще и перенесен под MT4.

Готовые советники из Мастера MQL5 работают в MetaTrader 4
Готовые советники из Мастера MQL5 работают в MetaTrader 4
  • 2017.03.09
  • Stanislav Korotky
  • www.mql5.com
Клиентские терминалы MetaTrader 4 и MetaTrader 5 предоставляют своим пользователям возможность легко создавать прототипы программ на языке MQL с помощью встроенного Мастера (MQL Wizard). Мастера обоих версий терминалов очень похожи, но все же имеют одно важное отличие. В Мастере MetaTrader 5 есть пункт генерации готовых советников, а в...
 

Мне очень понравилась статья, она открыла мне глаза. Пожалуйста, напишите продолжение статьи. Мне очень интересно, как бы вы подошли к скальпингу с помощью этого инструмента.

Спасибо миллион раз за эту и все остальные ваши работы.

 
fxsaber:

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

СБ под MT5 - пример элегантности, по сравнению с данным циклом статей. Да еще и перенесен под MT4.

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