Discussão do artigo "Criar Critérios Personalizados de Otimização de Expert Advisors" - página 3

 

Com muitos experimentos, cheguei a conclusões semelhantes. Não sei por que demorei tanto para encontrar este artigo e esta discussão.

Comecei com um problema em que minhas estratégias de rompimento e de tendência tendiam a se ajustar a algumas poucas negociações superlucrativas. O lucro era tão grande com essas poucas operações que o otimizador só "se importava" com elas e usava stops amplos e take profit muito distantes, certificando-se de que seu sinal capturasse e ordenasse essas poucas operações ao máximo. Mesmo ao otimizar com uma relação entre dd e lucro, ele ainda buscava as execuções com essas negociações a todo custo, pois as execuções representavam 90% de seu lucro. Eu queria limitar esse comportamento de alguma forma sem cortar a cabeça da estratégia de fuga/tendência. Descobri que a otimização para a porcentagem relativa de dd (NÃO a proporção de dd em relação ao lucro, apenas a porcentagem relativa de dd e nada mais) oferece bons resultados no futuro, desde que o mínimo de negociações e o fator de lucro mínimo (cerca de 1,3) sejam atendidos.


//............... 

sinput double mint; //negócios mínimos para fins de otimização. Imporá uma penalidade em execuções com menos negociações. 

sinput double minpf; //fator de lucro mínimo para fins de otimização. Imporá uma penalidade em execuções com menos pf.

//...............

double OnTester()

{ 

	 double dd=TesterStatistics(STAT_BALANCE_DDREL_PERCENT);//equidade em vez de equilíbrio também funcionou bem no futuro

	 double pf=TesterStatistics(STAT_PROFIT_FACTOR);

	 int    tt=TesterStatistics(STAT_TRADES); 

	 double custom=(100-dd);

	 if (mint>t) custom=custom*(tt/mint); // impõe uma penalidade se as negociações mínimas não forem atingidas

	 if (minpf>minpf) custom=custom*((pf-1)/(minpf-1)) // essa linha também faz com que as corridas perdidas sejam negativas, além de impor uma penalidade menor pf.

	 return(custom); 

}

 

 

Parece errado não ter o lucro envolvido, mas, ao ter um critério mínimo de pf, a maioria das execuções bastante lucrativas está aparecendo no topo. Cortar o dd das execuções lucrativas geralmente aumenta os lucros. De qualquer forma, ao selecionar as negociações mais lucrativas e fazer os retoques finais cuidadosamente à mão (como no final deste excelente artigo https://www.mql5.com/pt/articles/156), posso permitir que o otimizador faça grande parte do trabalho inicial e, ao mesmo tempo, evite muitos ajustes de curva. Fiz experimentos e obtive resultados variados com códigos como o seguinte. (As experiências devem incluir a alteração do risco e do saldo inicial também quando você começar a colocar pesos adicionais além de uma pontuação baseada em porcentagem)

//.............

sinput double pfw //Peso do fator de lucro 

//.............

        double custom=(100-dd)+(pf-1)*pfw;
//...........
Guide to Testing and Optimizing of Expert Advisors in MQL5
Guide to Testing and Optimizing of Expert Advisors in MQL5
  • 2010.10.12
  • Samuel
  • www.mql5.com
This article explains the step by step process of identifying and resolving code errors as well as the steps in testing and optimizing of the Expert Advisor input parameters. You will learn how to use Strategy Tester of MetaTrader 5 client terminal to find the best symbol and set of input parameters for your Expert Advisor.
 

Alguém pode me dizer se esse artigo será aplicável ao MT4? Parece que ele já adotou muitas propriedades do MT5.

Em geral, minha tarefa é obter apenas os valores de LR Correlation e LR Standard Error no testador do MT4, como pode ser facilmente visto no testador do MT5.

Quero apenas ler esses valores na função deinit() no final da execução do teste e gravá-los em um arquivo junto com o valor do parâmetro otimizado.

Talvez alguém já tenha feito isso e possa compartilhar comigo o resultado pronto (a função necessária para calcular a correlação LR e os valores de erro padrão LR) para que eu não tenha que reinventar a roda?

 
solandr:

Alguém pode me dizer se esse artigo será aplicável ao MT4? Parece que ele já adotou muitas propriedades do MT5.

Em geral, minha tarefa é obter apenas os valores de LR Correlation e LR Standard Error no testador do MT4, como pode ser facilmente visto no testador do MT5.

Quero apenas ler esses valores na função deinit() no final da execução do teste e gravá-los em um arquivo junto com o valor do parâmetro otimizado.

Talvez alguém já tenha feito isso e possa compartilhar comigo o resultado pronto (a função necessária para calcular a correlação LR e os valores de erro padrão LR) para que eu não tenha que reinventar a roda?

Um exemplo de cálculo da correlação LR e do erro padrão LR em negociações no histórico está disponível na AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
 
Automated-Trading:
Um exemplo de cálculo da correlação LR e do erro padrão LR para negociações no histórico está disponível no AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
Obrigado! Vou dar uma olhada nisso.
 
solandr:
Obrigado! Vou dar uma olhada nisso.

Já entendi. A correlação parece ter sido calculada.

A única coisa em que tive de pensar é o fato de que esse ponto não funciona no testador MT4 Build 670:

//--- obtenção do saldo inicial
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }

Simplesmente não há ordens com o tipo 6 no testador.

Ou seja, ao executar no testador do MT4 e usar o código do UseAlglib.mq4, que está incluído no arquivo zip baixado, por meio de uma chamada da função deinit().

O saldo permanece igual a 0. E, em seguida, é impresso o erro"Trading operations with zero balance" (Operações de negociação com saldo zero).

Eu tive que simplesmente inserir o valor necessário do saldo inicial no testador MT4 no próprio código e, então, tudo foi contado perfeitamente.

Talvez os desenvolvedores possam levar esse ponto em consideração em versões futuras da biblioteca.

 

Testei o Kelly Criterion (Estratégia) usando o código a seguir:


double OnTester(void)
  {
   //https://www.investopedia.com/articles/trading/04/091504.asp
   double w=((TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES))>0)?TesterStatistics(STAT_PROFIT_TRADES)/(TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES)):0; // probabilidade de vitória
   double r=((TesterStatistics(STAT_GROSS_LOSS)!=0)&&(TesterStatistics(STAT_LOSS_TRADES)!=0)&&(TesterStatistics(STAT_PROFIT_TRADES)!=0))?(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES))/(-TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES)):0; // Índice de vitórias/derrotas;
   double Kelly=(r!=0)?w-((1-w)/r):0; // Kelly Criterion
   return(Kelly);
  }


Não tenho certeza se o Metatrader Strategy Tester calcula negociações de lucro 0 (zero) como negociações de lucro. Alguém sabe?

 
Ingvar Engelbrecht:

Bem, aqui estou eu novamente, o lobo solitário neste universo :-)

Tenho tentado usar o critério personalizado de retidão para tentar incluir a inclinação da linha reta calculada na equação. Da forma como está, ele pode lhe dar uma classificação muito alta em um lucro muito fraco. Basta adicionar o lucro final

Em uma tentativa de adicionar a inclinação real à equação, alterei o código como mostrado abaixo.

Não é uma solução perfeita, mas está mais próxima do que eu quero ver. Usar o resultado junto com o saldo ou o lucro funciona bem para mim com este código


Sei que já faz muito tempo que você postou isso, mas caso ainda esteja trabalhando com isso ou outra pessoa esteja procurando a mesma implementação de critérios de linearidade.

Encontrei uma solução pública funcional aqui https://community.darwinex.com/t/equity-curve-straigthness-optimization-with-metatrader/3976

Equity Curve Straigthness Optimization with Metatrader
Equity Curve Straigthness Optimization with Metatrader
  • 2018.05.16
  • KlondikeFX
  • community.darwinex.com
An underrated feature of Metatrader’s Backtester is its ability to define a custom fitness function for the genetic optimization process. Meaning that you no longer are limited to rather simple metrics like final balance or profit factor but can evaluate the quality of each test run with your own individual calculations. To give a quick...
 

O tutorial relacionado tem informações demais, como, por exemplo, especificamente sobre a programação de um EA, que está em outro tutorial, e não se aplica ao apostador comum, que comprará seu EA e tem capacidade mínima de programação.

Descobri que, por padrão, o único critério útil para o MT5 no algoritmo genético é o "balance max", então tenho que repetir isso algumas vezes e procurar nos resultados até encontrar um drawdown baixo, como para uso em vários pares.

Quais critérios eu preciso: - Saldo máximo com rebaixamento <20, MaxBalance com rebaixamento <10

 
Ótima leitura, lobo solitário por aqui 😁.
 
Obrigado pelo excelente artigo, Dmitriy.

Para todos vocês, "lobos solitários": vocês estão no caminho certo, criando critérios de teste rigorosos e a automação dos mesmos. É claro que há várias maneiras diferentes de encarar o mesmo desafio e, ao ler os comentários aqui, o consenso parece estar em um equilíbrio entre equilíbrio, rebaixamento, RRR e alguma medida de lucro (fator de lucro, critério Kelly etc.).
Cheguei a este artigo tentando fazer o mesmo e querendo que o Strategy Tester fizesse isso por mim; ainda bem que não estou sozinho :)