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

 
Karputov Vladimir:
Или модуль управления капиталом. Что именно выбрать, то тут нужно подробнее уже смотреть.

Простите не силен в ООП не поможете разобраться.

Вот я сделал модуль торговых сигналов назовем его СMySignal.mqh. Теперь хочу реализовать свои сигналы на закрытие. Для этого создаю свой модуль управления капитал CMyMoney.mqh так как в CExpert есть такой вызов:

protected:
  CExpertMoney     *m_money;

bool CExpert::CheckClose(void)

  {
   double lot;
//--- position must be selected before call
   if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
      return(CloseAll(lot));

Но я хочу использовать методы класса CMySignal в логике закрытия, я не хочу снова производить все вычисления в CMyMoney. Поэтому в CMyMoney я пишу что-то вроде такого:

class CMyMoney : public CExpertMoney

protected:

   //--- input parameters
   virtual bool      CheckCloseLong(void);
   virtual bool      CheckCloseShort(void);

   CMySignal         *filter0;

...

double CMyMoney::CheckClose(CPositionInfo *position)
  {
   double lot;
   lot=position.Volume();
   if(position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of closing the long position
      if(filter0.CheckCloseLong(lot))
         Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot); 
     }
   else
     {
      //--- check the possibility of closing the short position
      if(filter0.CheckCloseShort(lot))
         Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
     }
   return(lot);
  }


И переношу всю логику закрытия в класс CMySignal:

class CMySignal : public CExpertSignal

public:

   virtual bool      CheckCloseLong(double &lot);
   virtual bool      CheckCloseShort(double &lot);

bool CMySignal::CheckCloseLong(double &lot)

  {

   //логика закрытия Long

  }

bool CMySignal::CheckCloseShort(double &lot)

  {

   //логика закрытия Short

  }

Но получается что я уже как бы имею дело с новым объектом filter0, а не с уже прежде созданным. Я должен по новой инициализировать данные для него (индикаторы и прочее). Как мне получить доступ к уже существующему объекту класса CMySignal? Надеюсь понятно изложил =)

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

 
t101:

Простите не силен в ООП не поможете разобраться.

Вот я сделал модуль торговых сигналов назовем его СMySignal.mqh. Теперь хочу реализовать свои сигналы на закрытие. Для этого создаю свой модуль управления капитал CMyMoney.mqh так как в CExpert есть такой вызов:

protected:
  CExpertMoney     *m_money;

bool CExpert::CheckClose(void)

  {
   double lot;
//--- position must be selected before call
   if((lot=m_money.CheckClose(GetPointer(m_position)))!=0.0)
      return(CloseAll(lot));

Но я хочу использовать методы класса CMySignal в логике закрытия, я не хочу снова производить все вычисления в CMyMoney. Поэтому в CMyMoney я пишу что-то вроде такого:

class CMyMoney : public CExpertMoney

protected:

   //--- input parameters
   virtual bool      CheckCloseLong(void);
   virtual bool      CheckCloseShort(void);

   CMySignal         *filter0;

...

double CMyMoney::CheckClose(CPositionInfo *position)
  {
   double lot;
   lot=position.Volume();
   if(position.PositionType()==POSITION_TYPE_BUY)
     {
      //--- check the possibility of closing the long position
      if(filter0.CheckCloseLong(lot))
         Print(__FUNCTION__+": close long position signal detected. Lot to be closed ",lot); 
     }
   else
     {
      //--- check the possibility of closing the short position
      if(filter0.CheckCloseShort(lot))
         Print(__FUNCTION__+": close short position signal detected. Lot to be closed ",lot);
     }
   return(lot);
  }


И переношу всю логику закрытия в класс CMySignal:

class CMySignal : public CExpertSignal

public:

   virtual bool      CheckCloseLong(double &lot);
   virtual bool      CheckCloseShort(double &lot);

bool CMySignal::CheckCloseLong(double &lot)

  {

   //логика закрытия Long

  }

bool CMySignal::CheckCloseShort(double &lot)

  {

   //логика закрытия Short

  }

Но получается что я уже как бы имею дело с новым объектом filter0, а не с уже прежде созданным. Я должен по новой инициализировать данные для него (индикаторы и прочее). Как мне получить доступ к уже существующему объекту класса CMySignal? Надеюсь понятно изложил =)

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

У меня вопрос по второй "простыне" - зачем Вы в модуль управления капиталом вставляете "CMySignal         *filter0;"?
 
Karputov Vladimir:
У меня вопрос по второй "простыне" - зачем Вы в модуль управления капиталом вставляете "CMySignal         *filter0;"?

filter0 это объект класса моего модуля торговых сигналов CMySignal. Создается в основном файле эксперта:

CMySignal *filter0=new CMySignal;

Я пытаюсь получить к нему доступ из модуля управления капиталом чтоб перенести все вычисления по закрытию в мой модуль сигналов. Других путей реализовать свою логику закрытия я пока не вижу.
 
t101:

filter0 это объект класса моего модуля торговых сигналов CMySignal. Создается в основном файле эксперта:

CMySignal *filter0=new CMySignal;

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

Посмотрите реализацию передачи указателя на главный сигнал в модуль сигнала (Мастер MQL5: Как научить эксперта открывать отложенные ордера по любым ценам):

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

Так как эта переменная должна быть внутренней (с областью видимости только внутри класса генератора торговых сигналов), добавлять ее будем в следующий блок кода:

protected:
   CiEnvelopes       m_env;          // object-indicator
   //--- adjusted parameters
   int               m_ma_period;    // the "period of averaging" parameter of the indicator
   int               m_ma_shift;     // the "time shift" parameter of the indicator
   ENUM_MA_METHOD    m_ma_method;     // the "method of averaging" parameter of the indicator
   ENUM_APPLIED_PRICE m_ma_applied;    // the "object of averaging" parameter of the indicator
   double            m_deviation;    // the "deviation" parameter of the indicator
   //--- "weights" of market models (0-100)
   int               m_pattern_0;      // model 0
   CExpertSignal    *m_signal;         // храним ссылку на главный сигнал

Также обратите внимание, что в коде я удалил переменные, которые не будут применяться. 

Метод, с помощью которого мы будем сохранять указатель на главный сигнал, объявим в другом блоке кода - "метод установки указателя на главный сигнал". Также были удалены некоторые лишние методы.

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

 
Karputov Vladimir:

Посмотрите реализацию передачи указателя на главный сигнал в модуль сигнала (Мастер MQL5: Как научить эксперта открывать отложенные ордера по любым ценам):

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

Зачем мне указатель на главынй сигнал если мне нужен указатель на мой сигнал, наследник класса CExpertSignal? Я хочу его получить в моем модуле управления капиталом, наследнике CExpertMoney.
 
t101:
Зачем мне указатель на главынй сигнал если мне нужен указатель на мой сигнал, наследник класса CExpertSignal? Я хочу его получить в моем модуле управления капиталом, наследнике CExpertMoney.

Хорошо. Зайдём с другой стороны. В вашем модуле управления капиталом нужно объявить такую переменную:

CMySignal    *m_signal;         // храним ссылку на свой сигнал сигнал

 

и такой метод:

   //--- метод установки указателя на главный сигнал
   virtual bool      InitSignal(СMySignal *filter=NULL);

 

и его реализация

//+------------------------------------------------------------------+
//| Initialization signal object                                     |
//+------------------------------------------------------------------+
bool CMyMoney::InitSignal(СMySignal *filter)
  {
   m_signal=filter;
   return(true);
  }

 

Теперь можно из модуля управления капиталом пробовать обращаться к своему сигналу через 

m_signal.метод вашего модуля сигналов
 
Karputov Vladimir:

Хорошо. Зайдём с другой стороны. В вашем модуле управления капиталом нужно объявить такую переменную:

 

и такой метод:

 

и его реализация

 

Теперь можно из модуля управления капиталом пробовать обращаться к своему сигналу через 

Invalid pointer access при вызове метода моего модуля сигналов
m_signal.метод вашего модуля сигналов
InitSignal где-то вызываться должен предварительно?
 
t101:
Invalid pointer access при вызове метода моего модуля сигналов
InitSignal где-то вызываться должен предварительно?
Конечно нужно вызывать "InitSignal" ранее: из OnInit() советника, в конце блока инициализации модуля управления капиталом.
 
Karputov Vladimir:
Конечно нужно вызывать "InitSignal" ранее: из OnInit() советника, в конце блока инициализации модуля управления капиталом.
Вручную добавлять в OnInit()? Получается через Мастер никак не сделать того что хочу?
 
t101:
Вручную добавлять в OnInit()? Получается через Мастер никак не сделать того что хочу?
А какие проблемы? Вы ведь вносите дополнительный функционал и поэтому нужно немного поработать руками.