Обсуждение статьи "Разрабатываем мультивалютный советник (Часть 1): Совместная работа нескольких торговых стратегий" - страница 2

 
fxsaber #:

Не помешает - 100%. Просто лишняя сущность получилась. В ООП же архитектурно идет принцип от общего к частному. Вы общий (базовый класс) сделали "частным". Хотя все, что там вызывается - CStrategy::Tick().

Тут я придерживался такого подхода. Предположим, мы можем создаем линейную иерархию Базовый класс -> Наследник1 -> Наследник2 -> Наследник3. Классы наследников постепенно усложняют свой родительский класс, но нигде нет разветвлений дерева наследования, то есть у у всех классов есть только один следующий наследник. Тогда если мы будем создавать реальные объекты только нескольких классов, которые будут наследниками Наследника3, и при этом весь код родительских классов достаточно компактен, то сделаем сразу базовый класс, включающей содержание первых трех наследников.

В этой статье в базовом классе действительно, по большому счёту, только CStrategy::Tick() и есть. Но дальше в него планируется еще добавить общего кода для всех стратегий.

 
fxsaber #:

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

Тут, как я понял, это связано с тем, что указатели в MQL5 это не то же самое, что указатели в С++. Поэтому и такой вариант подходит.

 
fxsaber #:
Наследуетесь от CObject.

При этом не используете это.


Заметил, что это довольно распространенная практика - наследование от CObject.

Не совсем понял мысль, что именно не используется, хотя могло бы? 

Наследование от CObject сделано только ради последующего использования Save() и Load()

 
Yuriy Bykov #:

Не совсем понял мысль, что именно не используется, хотя могло бы? 

Приведу код целиком.

class CObject
  {
private:
   CObject          *m_prev;               // previous item of list
   CObject          *m_next;               // next item of list

public:
                     CObject(void): m_prev(NULL),m_next(NULL)            {                 }
                    ~CObject(void)                                       {                 }
   //--- methods to access protected data
   CObject          *Prev(void)                                    const { return(m_prev); }
   void              Prev(CObject *node)                                 { m_prev=node;    }
   CObject          *Next(void)                                    const { return(m_next); }
   void              Next(CObject *node)                                 { m_next=node;    }
   //--- methods for working with files
   virtual bool      Save(const int file_handle)                         { return(true);   }
   virtual bool      Load(const int file_handle)                         { return(true);   }
   //--- method of identifying the object
   virtual int       Type(void)                                    const { return(0);      }
   //--- method of comparing the objects
   virtual int       Compare(const CObject *node,const int mode=0) const { return(0);      }
  };

Кратко говоря, этот класс предназначен для формирования и работы со списками, включая возможную сортировку.

Наследование от CObject сделано только ради последующего использования Save() и Load()

Из пушки по воробьям. Почему не добавить эти два виртуальных метода в CStrategy?

 
fxsaber #:

Из пушки по воробьям. Почему не добавить эти два виртуальных метода в CStrategy?

Да, согласен. Добавлю методы сохранения к CStrategy и остальным базовым классам вместо наследования от CObject

 
Yuriy Bykov #:

Вы из классического (input + без ООП) SimpleVolumes.mq5 делаете ООП-преобразование в SimpleVolumesStartegy.mqh.

Почему не сделали SimpleVolumes.mq5 через #include SimpleVolumesStartegy.mqh ?

 
fxsaber #:

хорошо видна громоздкость со входными из-за ООП. Хорошо бы убрать ее.

Закамуфлировали.

int OnInit() {
   expert.AddStrategy(new CSimpleVolumeStrategy(
                         magic_ + 1, "EURGBP", PERIOD_H1,
                         NormalizeDouble(0.34 * depoPart_, 2),
                         130, 0.9, 1.4, 231, 3750, 50, 600, 3)
                     );
   expert.AddStrategy(new CSimpleVolumeStrategy(
                         magic_ + 2, "EURGBP", PERIOD_H1,
                         NormalizeDouble(0.10 * depoPart_, 2),
                         159, 1.7, 0.8, 248, 3600, 495, 39000, 3)
                     );

   int res = expert.Init();   // Инициализация всех стратегий эксперта

   return(res);
}

Раз уж стали показывать работу портфеля ТС, то и с загрузкой портфеля (входные) хорошо бы грамотно разобраться.

 
fxsaber #:

Вы из классического (input + без ООП) SimpleVolumes.mq5 делаете ООП-преобразование в SimpleVolumesStartegy.mqh.

Почему не сделали SimpleVolumes.mq5 через #include SimpleVolumesStartegy.mqh ?

Потому что хотелось продемонстрировать процесс перехода от обычного советника (input + без ООП), который написан без прицела на его использование в параллельном режиме с разными настройками (это роль SimpleVolumes.mq5) к уже другому советнику, в котором это параллельное использование можно сделать (это роль SimpleVolumesExpert.mq5). Для этого понадобилось ООП-преобразование в SimpleVolumesStartegy.mqh.

 
fxsaber #:

Раз уж стали показывать работу портфеля ТС, то и с загрузкой портфеля (входные) хорошо бы грамотно разобраться.

Обязательно будем разбираться в следующих частях. Там еще много с чем надо разбираться, поэтому всё сразу изложить и не получилось.

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

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

 
Yuriy Bykov #:

Потому что хотелось продемонстрировать процесс перехода от обычного советника (input + без ООП)

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