Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 5): tamanho de posição variável"

 

Novo artigo Desenvolvendo um EA multimoeda (Parte 5): tamanho de posição variável foi publicado:

Nos capítulos anteriores, o EA desenvolvido só podia usar um tamanho de posição fixo para negociações. Isso é adequado para testes, mas não é aconselhável ao negociar mediante uma conta real. Vamos adicionar a capacidade de operar com tamanhos de posição variáveis.

Na parte anterior, adicionamos a capacidade de restaurar o estado do EA após um reinício. Não importa a causa, quer seja reinicialização do terminal, mudança de timeframe no gráfico com o EA, lançamento de uma versão mais recente do EA; em todos os casos, a restauração do estado permitia que o EA não começasse do zero e não perdesse posições já abertas, mas continuasse a processá-las.

No entanto, o tamanho das posições abertas para cada instância da estratégia permanecia o mesmo durante todo o período de teste. Seu tamanho era definido na inicialização do EA. Se, como resultado do trabalho do EA, o saldo da conta de negociação aumentasse, isso permitiria usar um tamanho de posição maior sem aumentar o risco. Tal possibilidade é desejável, então vamos implementar o uso de tamanhos de posição variáveis.

Autor: Yuriy Bykov

 

Quando executo o EA SimpleVolumesExpert com (3+3+3) e escalonamento 2.18, o registro mostra negociações virtuais abertas, mas nenhuma negociação real no testador de estratégia. Será que perdi alguma coisa?

 
Nigel Philip J Stephens #:

Quando executo o SimpleVolumesExpert com (3+3+3) e escala 2.18, o registro mostra negociações virtuais abertas, mas nenhuma negociação real no testador de estratégia. Talvez eu tenha perdido alguma coisa?

Verifique se o saldo inicial no testador é de US$ 10.000 ou mais. Tenho esse comportamento quando o saldo não é grande o suficiente. Nesse caso, nem toda posição virtual gera uma posição real. Mas o motivo provavelmente é outro, pois seu saldo provavelmente está correto.

Há alguma negociação real se o EA for executado com outras variantes de agrupamento de estratégias?

 
Li seu artigo extensivamente e achei que ele era exatamente o que eu precisava para expandir meu conhecimento. Aprecio suas explicações elaboradas sobre o tópico e as decisões de codificação bem pensadas. Muito obrigado.
 

Boa tarde. Obrigado por seu trabalho. Estou muito interessado em sua arquitetura e estou tentando entendê-la passo a passo. Mudei apenas a classe da estratégia - uso a minha própria. Mas, nesse estágio, tive dificuldades com o dimensionamento da estratégia. Para a pureza do experimento, usei uma instância da estratégia e duas variantes do multiplicador de escala_ 1 e 2 (fixedBalance_ = 0;). Em ambos os casos, o resultado é o mesmo: o tamanho do lote não muda. O local no código em que o tamanho do lote é determinado

//+------------------------------------------------------------------+
//| Determinação do tamanho real da posição virtual
//+------------------------------------------------------------------+
double CMoney::Volume(CVirtualOrder *p_order) {
   // Solicitar o balanço normalizado da estratégia para essa posição virtual 
   double fittedBalance = p_order.FittedBalance();
   
   // Se for igual a 0, o volume real é igual ao volume virtual
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }
   
   // Caso contrário, encontraremos o valor do saldo total do comércio
   double totalBalance = s_fixedBalance > 0 ? s_fixedBalance : AccountInfoDouble(ACCOUNT_BALANCE);
   
   // Retorna o volume real calculado pelo volume virtual
   return p_order.Volume() * totalBalance * s_depoPart / fittedBalance ;
}
//+------------------------------------------------------------------+

No entanto, os parâmetros m_fittedBalance e m_fixedLot são definidos por padrão no construtor da estratégia virtual.

//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CVirtualStrategy::CVirtualStrategy(double p_fittedBalance = 0,
                                   double p_fixedLot = 0.01) :
   m_fittedBalance(p_fittedBalance),
   m_fixedLot(p_fixedLot) {}

Portanto, o tamanho do lote não muda.

// Se for igual a 0, o volume real é igual ao volume virtual
   if(fittedBalance == 0.0) {
      return p_order.Volume();
   }

Embora, logicamente, ele deva ser dimensionado. Não quero interferir em minhas próprias edições - para não quebrá-las - e já adicionei alguns métodos à classe CVirtualOrder porque minha estratégia fornece fechamento parcial, stop loss e fechamento no sinal do contador.

 

Olá.

Tudo está correto; para a negociação de lote variável, é necessário que uma instância de estratégia receba o valor m_fittedBalance > 0. Isso é feito pelos herdeiros da classe base da estratégia de negociação. Esse parâmetro é passado a eles, e eles o substituem na chamada do construtor CVirtualStrategy:

class CSimpleVolumesStrategy : public CVirtualStrategy {
...

public:
   //--- Métodos públicos
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders,
      double           p_fittedBalance = 0
   );                                     // Construtor

   ...
};

...

//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   ...
   int              p_maxCountOfOrders,
   double           p_fittedBalance = 0) :
// Lista de inicialização
   CVirtualStrategy(p_fittedBalance, 0.01),
   m_symbol(p_symbol),
   m_timeframe(p_timeframe),
   ...
}

Ao criar instâncias, especificamos um valor específico para o último parâmetro para que o valor padrão de 0 não seja substituído por ele:

//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit() {
   // Definir parâmetros na classe de gerenciamento de capital
   CMoney::DepoPart(expectedDrawdown_ / 10.0);
   CMoney::FixedBalance(fixedBalance_);

   // Criar um Expert Advisor que funcione com posições virtuais
   expert = new CVirtualAdvisor(magic_, "SimpleVolumes_" + EnumToString(group_));

   // Criar e preencher uma matriz de todas as instâncias de estratégia
   CVirtualStrategy *strategies[] = {
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  13, 0.3, 1.0, 0, 10500,  465,  1000, 3, 1600),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  17, 1.7, 0.5, 0, 16500,  220,  1000, 3,  900),
      new CSimpleVolumesStrategy("EURGBP", PERIOD_H1,  51, 0.5, 1.1, 0, 19500,  370, 22000, 3, 1600),

     ...
   };

   ...

   return(INIT_SUCCEEDED);
}

No Consultor especialista SimpleVolumesExpertSingle.mq5, não fazemos isso, pois a otimização só é realizada em um tamanho de posição inicial fixo. Observe que o parâmetro m_fixedLot não precisa ser usado na estratégia exclusivamente como o tamanho de todas as posições virtuais abertas. Ele é apenas um valor base a partir do qual podemos calcular quaisquer outros. Na estratégia modelo do artigo, simplesmente os tamanhos de todas as posições são os mesmos e esse parâmetro é usado sem transformação. Mas nada o impede de abrir uma posição virtual de tamanho 10*m_fixedLot em outra estratégia e, em seguida, aplicar seu fechamento gradual.

 
Yuriy Bykov #:

Olá.

Tudo está correto; para a negociação de lote variável, é necessário que uma instância de estratégia receba o valor m_fittedBalance > 0. Isso é feito pelos herdeiros da classe base da estratégia de negociação. Esse parâmetro é passado a eles, e eles o substituem na chamada do construtor CVirtualStrategy:

Ao criar instâncias, especificamos um valor específico para o último parâmetro para que o valor padrão de 0 não seja substituído por ele:

No Consultor especialista SimpleVolumesExpertSingle.mq5, não fazemos isso, pois a otimização só é realizada em um tamanho de posição inicial fixo. Observe que o parâmetro m_fixedLot não precisa ser usado na estratégia exclusivamente como o tamanho de todas as posições virtuais abertas. Ele é apenas um valor base a partir do qual podemos calcular quaisquer outros. Na estratégia modelo do artigo, simplesmente os tamanhos de todas as posições são os mesmos e esse parâmetro é usado sem transformação. Mas nada o impede de abrir uma posição virtual de tamanho 10*m_fixedLot em outra estratégia e, em seguida, aplicar seu fechamento gradual.

Olá. Obrigado por sua resposta rápida. Já descobri o que é. Não percebi imediatamente que o último parâmetro havia sido adicionado, porque estava usando minha própria classe de estratégia e ela tem um conjunto de parâmetros ligeiramente diferente.