Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 2): Transição para posições virtuais de estratégias de trading"

 

Novo artigo Desenvolvendo um EA multimoeda (Parte 2): Transição para posições virtuais de estratégias de trading foi publicado:

Vamos continuar a desenvolver o EA multimoeda com várias estratégias funcionando paralelamente. Tentaremos transferir todo o trabalho relacionado à abertura de posições a mercado do nível das estratégias para o nível do expert que gerencia as estratégias. As próprias estratégias irão negociar apenas virtualmente, sem abrir posições a mercado.

No artigo anterior, começamos a desenvolver o EA multimoeda, operando simultaneamente com diferentes estratégias de trading. Na primeira etapa, havia apenas duas estratégias diferentes. Elas representavam a implementação da mesma ideia de trading, operando no mesmo instrumento de trading (símbolo) e período de gráfico (timeframe). A única diferença entre elas eram os valores numéricos dos parâmetros.

Também determinamos o tamanho ideal das posições a serem abertas, com base no nível máximo desejado de rebaixamento (10% do depósito). Fizemos isso para cada estratégia separadamente. Quando combinamos as duas estratégias, para manter o nível de rebaixamento desejado, tivemos que reduzir o tamanho das posições abertas. Para duas estratégias, a redução foi pequena. Mas e se quisermos combinar dezenas ou centenas de estratégias? Pode acontecer que algumas estratégias precisem reduzir o tamanho das posições para um valor menor do que o mínimo permitido pelo corretor. Nesse caso, essas estratégias simplesmente não poderão participar do trading. Como fazer com que elas funcionem?

Para isso, vamos retirar das estratégias o direito de abrir posições e colocar ordens pendentes de forma independente. As estratégias devem negociar apenas virtualmente, ou seja, memorizar os níveis em que as posições de determinado tamanho devem ser abertas e, sob demanda, informar qual volume deve estar aberto no momento. Abriremos posições a mercado reais somente após consultar todas as estratégias e calcular o volume total necessário, levando em consideração a escala para manter o rebaixamento desejado.

No momento, estaremos interessados apenas em testar a viabilidade dessa abordagem, e não na eficiência de sua implementação. Portanto, neste artigo, tentaremos escrever uma implementação funcional dessa abordagem, que nos ajudará a construir uma mais elegante do ponto de vista arquitetônico no futuro. Isso nos ajudará não no sentido de melhorar a existente, mas de entender o que não devemos fazer e como podemos fazer de outra forma, de maneira melhor.

Autor: Yuriy Bykov

 

Ainda não terminei de lê-lo. As entradas são um bom exemplo.

1.

input string      symbol_              = "EURGBP";    // Instrumento de negociação (símbolo)
input ENUM_TIMEFRAMES  timeframe_       = PERIOD_H1;   // Período da programação

input group "=== Parâmetros do sinal de abertura"
input int         signalPeriod_        = 13;    // Número de velas para cálculo da média de volume
input double      signalDeviation_     = 0.3;   // Desvio relativo da média para a abertura da primeira ordem
input double      signaAddlDeviation_  = 1.0;   // Desvio relativo da média para a abertura da segunda ordem e das ordens subsequentes

input group "=== Parâmetros de pedidos pendentes."
input int         openDistance_        = 0;     // Distância do preço até a ordem pendente
input double      stopLevel_           = 10500; // Stop Loss (em pontos)
input double      takeLevel_           = 465;   // Take Profit (em pips)
input int         ordersExpiration_    = 1000;  // Tempo de expiração das ordens pendentes (em minutos)

input group "=== Opções de gerenciamento de capital"
input int         maxCountOfOrders_    = 3;     // Número máximo de ordens abertas simultaneamente
2.
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));
   expert.Add(new CSimpleVolumesStrategy(
                         symbol_, timeframe_,
                         fixedLot_,
                         signalPeriod_, signalDeviation_, signaAddlDeviation_,
                         openDistance_, stopLevel_, takeLevel_, ordersExpiration_,
                         maxCountOfOrders_)
                     );       // Adicionar uma instância da estratégia

   return(INIT_SUCCEEDED);
}
3.
class CSimpleVolumesStrategy : public CStrategy {
private:
   //--- Parâmetros do sinal de abertura
   int               m_signalPeriod;       // Número de velas para cálculo da média de volume
   double            m_signalDeviation;    // Desvio relativo da média para a abertura da primeira ordem
   double            m_signaAddlDeviation; // Desvio relativo da média para a abertura da segunda ordem e das ordens subsequentes

   //--- Parâmetros de ordens pendentes
   int               m_openDistance;       // Distância do preço até a ordem pendente
   double            m_stopLevel;          // Stop Loss (em pontos)
   double            m_takeLevel;          // Take Profit (em pips)
   int               m_ordersExpiration;   // Tempo de expiração das ordens pendentes (em minutos)

   //--- Parâmetros de gerenciamento de capital
   int               m_maxCountOfOrders;   // Número máximo de ordens abertas simultaneamente

4.

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

5-6.

//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   double           p_fixedLot,
   int              p_signalPeriod,
   double           p_signalDeviation,
   double           p_signaAddlDeviation,
   int              p_openDistance,
   double           p_stopLevel,
   double           p_takeLevel,
   int              p_ordersExpiration,
   int              p_maxCountOfOrders) :
   // Lista de inicialização
   CStrategy(p_symbol, p_timeframe, p_fixedLot), // Chamar o construtor da classe base
   m_signalPeriod(p_signalPeriod),
   m_signalDeviation(p_signalDeviation),
   m_signaAddlDeviation(p_signaAddlDeviation),
   m_openDistance(p_openDistance),
   m_stopLevel(p_stopLevel),
   m_takeLevel(p_takeLevel),
   m_ordersExpiration(p_ordersExpiration),
   m_maxCountOfOrders(p_maxCountOfOrders) {
   ArrayResize(m_orders, m_maxCountOfOrders);

   // Carregar o indicador para obter volumes de ticks
   iVolumesHandle = iVolumes(m_symbol, m_timeframe, VOLUME_TICK);

// Defina o tamanho da matriz receptora de volumes de ticks e o endereçamento necessário
   ArrayResize(volumes, m_signalPeriod);
   ArraySetAsSeries(volumes, true);
}

Cada parâmetro de entrada deve ser prescrito cinco ou seis vezes.

 
Сравнивая эти результаты с результатами аналогичного советника, но не использующего виртуальные позиции, можно отметить улучшение некоторых показателей: немного увеличилась прибыль и уменьшилась просадка, подрос коэффициент Шарпа и профит-фактор.
Em termos gerais, mudei de hedging para netting, obtendo as estatísticas correspondentes. "melhorias". Por exemplo, redução dos volumes sobre os quais os swaps eram cobrados.
 

Leia o artigo. Graças ao autor, ele fez uma boa sondagem sobre as direções que podemos seguir.


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

Uma observação poderosa, após a qual não faz sentido criticar, mas devemos ir direto para a parte construtiva - sugerir.


O artigo discute o conceito de negociação virtual seguido pela sincronização unidirecional da negociação virtual com a negociação real. Como exemplo para o testador, ele serve. Mas apenas como um exemplo.

Na prática, esse portfólio TS é construído a partir do EX5 (gratuito para o testador) - executar, obter arquivos tst de execuções únicas, fazer uma execução única conjunta com quaisquer regras MM a partir deles.


Para o testador, você precisa de velocidade. Tente estimar o quanto a velocidade de otimização muda para a variante com e sem virtualização.


O conceito em si é bom para negociações reais. Mas, para o sincronizador, você terá que manter o histórico da negociação virtual. Há uma série de coisas. Uma maneira séria, para dizer o mínimo.


Arquitetonicamente, a virtualização seria separada do TS. Tenho apenas a fonte atual de virtualização de 350 Kb. E ela crescerá.


Abordar com cuidado a escolha da API de negociação para negociação virtual. Escolha entre as disponíveis. É lógico dar preferência à API, na qual é o mais fácil possível programar o TS. Eu realmente não entendo a prática comum de todas as plataformas de negociação de inventar sua própria bicicleta - API de negociação. Para dotá-la de entidades OOP "prontas para uso", etc. Nesse sentido, o MQ seguiu um bom caminho - todas as APIs sem OOP.

 

Antes de ler esses artigos, sempre dou uma olhada nos resultados dos testes. Pelo menos no testador. Quando vi 19% de lucro durante 5 anos, fiquei leve e feliz! Isso é muito mais do que o autor de 75 artigos sobre redes neurais! ))

Mas agora está claro como ganhar dinheiro garantido no Forex. Eu costumava pensar apenas em ensinar os otários sobre as ondas de Elliot, mas acontece que ainda há uma ótima maneira )).

 
fxsaber #:

Leia o artigo. Graças ao autor, ele tem uma boa visão das direções a seguir.

Muito obrigado por seu interesse e comentários construtivos. Tento levá-los em conta e utilizá-los o máximo possível. Responderei com mais detalhes mais tarde, pois não tenho tempo no momento.

 
Alexey Volchanskiy resultados dos testes. Pelo menos no testador. Quando vi 19% de lucro durante 5 anos, fiquei leve e feliz! Isso é muito mais do que o autor de 75 artigos sobre redes neurais! ))

Mas agora está claro como ganhar dinheiro garantido no Forex. Eu costumava pensar apenas em ensinar aos otários sobre as ondas de Elliot, mas acontece que ainda há uma ótima maneira )).

Não posso resistir a observar aqui que 19% dos lucros durante cinco anos no teste foram obtidos por um lote constante nas condições de rebaixamento inferior a US$ 1.000, ou seja, 1%. Se você se concentrar no drawdown máximo de até 10% e usar um lote variável, os resultados serão ainda mais interessantes.

 
//+------------------------------------------------------------------+
//|SimpleVolumesExpertSingle.mq5
//|Direitos autorais 2024, Yuriy Bykov |
//| https://www.mql5.com/pt/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link      "https://www.mql5.com/pt/articles/14107"
#property description "A ordem pendente do Expert Advisor no momento em que o volume de ticks do candle excede o volume médio,"
#property description "na direção da vela atual".
#property description "Se as ordens ainda não tiverem se transformado em posições, elas serão excluídas no momento da expiração."
#property description "As posições abertas são fechadas apenas no SL ou TP."

#include "Advisor.mqh"
#include "SimpleVolumesStartegy.mqh"

Um erro de digitação.

 
fxsaber #:

Um erro de digitação.

Sim, eu o corrigi em vários lugares, mas ele ainda está lá em algum lugar.

 
fxsaber #:

Na prática, esse portfólio de TS é criado a partir do EX5 (gratuito no Market for the Tester) - execute, obtenha arquivos tst de passagens únicas e, a partir deles, faça uma única execução conjunta com quaisquer regras de MM.

Ainda não considerei essa opção, mas vou ter em mente que ela também é possível. Entretanto, se eu conseguir encontrar um bom conjunto de Expert Advisors prontos no mercado, como posso usá-los em conjunto? Basta executar todo o conjunto com os parâmetros MM selecionados?

 
fxsaber #:

Para o testador, você precisa de velocidade. Tente estimar o quanto a velocidade de otimização muda para a variante com e sem virtualização.

Vou tentar, mas parece que o ganho será perceptível quando o número de estratégias em execução simultânea for de dezenas ou centenas de instâncias.

Continuo querendo entrar em mais detalhes sobre o uso de sua biblioteca virtual para acelerar os testes, mas ainda não consegui fazer isso. O principal motivo é que estou acostumado com as funções de negociação do MT5, embora, quando tive que redesenhar meus Expert Advisors do MT4 para o MT5, tenha havido muitos inconvenientes relacionados a isso, e aprendi sobre o Virtual mais tarde.

Agora estou pensando em criar uma classe filha do CReceiver, que usará o ambiente Virtual.