Обсуждение статьи "Мастер MQL5: Как написать свой модуль сопровождения открытых позиций" - страница 2

 

Спасибо за вашу замечательную и полезную статью,

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

Спасибо еще раз.

 

День добрый. Не работает модуль.

 В логе выдает  уровень пороговой прибыли должен быть больше уровня установки ордеров.

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

 

 //+------------------------------------------------------------------+
//|                                            TrailingFixedPips.mqh |
//|                   Copyright 2009-2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// wizard description start
//+----------------------------------------------------------------------+
//| Description of the class                                             |
//| Title=Trailing with floating Stop Loss (Fox104)                       |
//| Type=Trailing                                                        |
//| Name=FixedPips                                                       |
//| Class=CTrailingFixedPips                                             |
//| Page=                                                                |
//| Parameter=StopLevel,int,30,Stop Loss trailing level (in points)      |
//| Parameter=ProfitLevel,int,50,Take Profit trailing level (in points)  |
//+----------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CTrailingFixedPips.                                        |
//| Purpose: Class of trailing stops with fixed stop level in pips.  |
//|              Derives from class CExpertTrailing.                 |
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- input parameters
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- methods of initialization of protected data
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//| Validation settings protected data.                              |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- initial data checks
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+": уровень пороговой прибыли должен быть больше уровня установки ордеров");
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- check
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- проверка параметра      
   if(m_profit_level==0.0)  return(false);
//--- уже в безубытке?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- проверка прибыли
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for short position.         |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- check
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- проверка параметра
   if(m_profit_level==0.0)  return(false);
//--- уже в безубытке?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- проверка прибыли
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

День добрый. Не работает модуль.

 В логе выдает  уровень пороговой прибыли должен быть больше уровня установки ордеров.

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

Оформляйте, пожалуйста, код в сообщении правильно: Правильно вставляем код на форуме. (Ваше сообщение уже исправлено).
 
Andy:

При использовании указанного в статье модуля выдаются ошибки в журнале эксперта во время загрузки советника на график:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: error initializing indicators

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: changing of timeseries is forbidden

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: changing of timeseries is forbidden

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: parameters of setting are not checked

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: error initialization indicators of trailing object

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: error initializing indicators

Возможно он устарел, где взять новый или что исправить в этом?

Внесите изменение в модуль трейлинга "sampleTrailing.mqh":

//+------------------------------------------------------------------+
//| Проверка параметров настройки.                                   |
//| INPUT:  нет.                                                     |
//| OUTPUT: true-если настройки правильные, иначе false.             |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- а вдруг не вызывался метод Init
   if(m_symbol==NULL) return(false);
//--- проверка параметров
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": уровень пороговой прибыли должен быть больше уровня установки ордеров");
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

При использовании указанного в статье модуля выдаются ошибки в журнале эксперта во время загрузки советника на график:


Возможно он устарел, где взять новый или что исправить в этом?

Спасибо за сообщение, статью поправили

 
Andy:

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


Всё верно. Именно указанный Stop Loss является спусковым крючком для работы ДАННОГО модуля трейлинга в безубыток. То есть предполагается, что позиция ДОЛЖНА иметь stop loss изначально.


Добавлено:

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

 
Andy:

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

(У меня пуш уведомление пришло на 2 Ваших сообщения, но одного нет - удалили)?


Если нужно что-то изменить - это уже не данной статьи проблема. Тут Вы дальше сами, на основе полученных знаний. То есть если Вы хотите составить Техническое Задание и думаете, что под него будет переписываться статья - то это не так.

Как я вижу Ваши действия: переписываете модуль (немного изменяете) и пользуетесь.


Добавлено: В ПОСЛЕДНИЙ РАЗ УБЕДИТЕЛЬНО ПРОШУ ПОЛЬЗОВАТЬСЯ КНОПКОЙ "ОТВЕТИТЬ". В противном случае отвечать не буду.

 
Andy:

Хорошо, да я сам напишу. А сообщение одно свое удалили (скажите, если да, чтобы я не искал)?


Вы можете открыть новую тему, что-то вроде "Модуль сопровождения открытых позиций в безубыток" - думаю такой тема будет полезна.

Таки да, я редактировал своё сообщение и ткнул ошибочно на "удалить" - то есть по факту я написал ДВА сообщения и одно удалил. Поэтому push прилетели верно.