Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 1): várias estratégias de trading trabalhando juntas" - página 2

 
fxsaber #:

Não vai prejudicar, 100%. É apenas uma entidade desnecessária. A arquitetura OOP segue o princípio do geral para o particular. Você tornou o geral (classe base) "privado". Embora tudo o que seja chamado lá seja CStrategy::Tick().

Essa é a abordagem que adotei aqui. Suponha que possamos criar uma hierarquia linear Classe base -> Herdeiro1 -> Herdeiro2 -> Herdeiro3. As classes herdeiras complicam progressivamente sua classe principal, mas não há ramificação da árvore de herança em nenhum lugar, ou seja, todas as classes têm apenas um herdeiro sucessivo. Então, se formos criar objetos reais de apenas algumas classes que serão as sucessoras de Inheritor3, e todo o código das classes pai for compacto o suficiente, criaremos uma classe base de uma só vez, incluindo o conteúdo das três primeiras sucessoras.

Neste artigo, a classe base realmente contém, em geral, apenas CStrategy::Tick(). Mas, mais adiante, planejamos adicionar mais código geral para todas as estratégias.

 
fxsaber #:

Parece ser um erro do compilador, que não reconhece a assinatura desse método quando chamado dessa forma.

Aqui, pelo que entendi, isso se deve ao fato de que os ponteiros em MQL5 não são iguais aos ponteiros em C++. É por isso que essa variante é adequada.

 
fxsaber CObject.

Você não o usa.


Percebi que é uma prática bastante comum herdar do CObject.

Não entendi bem a ideia, o que exatamente não é usado, embora possa ser?

A herança de CObject é feita apenas para uso posterior de Save() e Load()

 
Yuriy Bykov #:

Não entendi bem a ideia, o que exatamente não está sendo usado, embora pudesse estar?

Vou apresentar o código na íntegra.

class CObject
  {
private:
   CObject          *m_prev;               // item anterior da lista
   CObject          *m_next;               // próximo item da lista

public:
                     CObject(void): m_prev(NULL),m_next(NULL)            {                 }
                    ~CObject(void)                                       {                 }
   //--- métodos para acessar dados protegidos
   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;    }
   //--- métodos para trabalhar com arquivos
   virtual bool      Save(const int file_handle)                         { return(true);   }
   virtual bool      Load(const int file_handle)                         { return(true);   }
   //--- método de identificação do objeto
   virtual int       Type(void)                                    const { return(0);      }
   //--- método de comparação dos objetos
   virtual int       Compare(const CObject *node,const int mode=0) const { return(0);      }
  };

Resumidamente, essa classe se destina a formar e trabalhar com listas, incluindo a possível classificação.

A herança do CObject é feita apenas para que seja possível usar Save() e Load() posteriormente

De um canhão em pardais. Por que não adicionar esses dois métodos virtuais à CStrategy?

 
fxsaber #:

De um canhão em pardais. Por que não adicionar esses dois métodos virtuais ao CStrategy?

Sim, eu concordo. Adicionarei métodos de salvamento ao CStrategy e ao restante das classes de base em vez de herdar do CObject

 
Yuriy Bykov #:

Você fez a conversão OOP do SimpleVolumes.mq5 clássico (entrada + sem OOP) para o SimpleVolumesStartegy.mqh.

Por que você não fez o SimpleVolumes.mq5 via #include SimpleVolumesStartegy.mqh?

 
fxsaber #:

você pode ver claramente o incômodo com as entradas devido à OOP. Seria bom removê-la.

Camuflado.

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();   // Inicialização de todas as estratégias do Expert Advisor

   return(res);
}

Como eles começaram a mostrar o trabalho do portfólio do TC, seria bom lidar adequadamente com o carregamento do portfólio (entradas).

 
fxsaber #:

Você faz uma conversão OOP do SimpleVolumes.mq5 clássico (entrada + sem OOP) para o SimpleVolumesStartegy.mqh.

Por que você não criou o SimpleVolumes.mq5 via #include SimpleVolumesStartegy.mqh?

Porque eu queria demonstrar o processo de transição de um EA regular (entrada + sem OOP), que é escrito sem o objetivo de usá-lo em modo paralelo com configurações diferentes (essa é a função SimpleVolumes.mq5) para outro EA, no qual esse uso paralelo pode ser feito (essa é a função SimpleVolumesExpert.mq5). Para isso, precisamos da transformação OOP no SimpleVolumesStartegy.mqh.

 
fxsaber #:

Como eles começaram a mostrar o trabalho do portfólio do TC, seria bom lidar com o carregamento do portfólio (entradas) de forma competente.

Com certeza trataremos disso nas próximas partes. Ainda há muitas coisas a serem tratadas, por isso não foi possível apresentar tudo de uma vez.

Sou muito grato por todos os seus comentários, porque agora é o momento certo para eles - para os artigos, estou refazendo quase do zero meu código escrito anteriormente nos últimos anos, que não foi limpo e otimizado sem muita necessidade. Portanto, o código faz seu trabalho, mas há alguns lugares que não são mais necessários, mas não foram limpos, bem como alguns lugares onde, como você pode ver agora, é possível simplificar o código ou aplicar uma abordagem arquitetônica diferente em geral.

Idealmente, eu gostaria de chegar ao nível de automação total da otimização e seleção de um bom portfólio de parâmetros de estratégia usando suas excelentes bibliotecas.

 
Yuriy Bykov #:

Como eu queria demonstrar o processo de mudança de um EA regular (entrada + sem OOP)

Consegui.