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

 
Karlson:

Você está dizendo que o código é do tipo

if (balance < 3000) ExpertRemove();

não funciona?

Funciona. Eu já entendi. Ele interrompe a otimização, mas ainda exibe os resultados, por isso achei que não funcionava.


Karlson:

Mas não foi isso que eu disse. Que essa interrupção (pelo menos antes de funcionar) levou à saída da genética no final.

É isso mesmo.

Mas se você redefinir os resultados de OnTester() para zero ou fizer como acima (atribuir o valor negativo -777), a genética poderá realmente se comportar de forma imprevisível, porque a seleção é realizada nos resultados apenas pelo valor de retorno de OnTester().

 
a questão continua sendo como remover resultados desnecessários do relatório.

Isso existia no MT4:

MT4


Certamente, isso pode ser feito com a ajuda das ferramentas MQL5, já que os desenvolvedores removeram completamente essas funções.

É claro que tudo pode ser copiado para o Excel, mas eu gostaria de aproveitar as vantagens da nova plataforma.

Resolvemos as limitações - podemos fazer isso com ExpertRemove().

E quanto a ignorar resultados inúteis no relatório?

 
sigma7i:

E quanto a ignorar resultados inúteis no relatório?

Você não pode fazer isso no relatório padrão e não precisa fazê-lo (sou contra isso). Crie seu próprio relatório.

Agora você pode gerar um relatório no estágio de otimização(https://www.mql5.com/pt/docs/optimization_frames) em qualquer formato que precisar.

E, em breve (hoo-hoo), será possível gerenciar a genética por conta própria.

 

Excelente.

Com base em meu trabalho anterior na área de redes neurais e algoritmos genéticos de previsão de futuros, percebi a importância de uma curva de patrimônio razoavelmente reta.

E escrevi algumas rotinas para levar isso em consideração. É realmente uma medida da "robustez" de um sistema de previsão.

 
E agora eu finalmente comecei a testar e explorar as possibilidades. E eu concordo. Um mundo totalmente novo está se abrindo. É uma ferramenta muito poderosa. Mais uma vez, obrigado pelo artigo
 

Encontros com trabalhos práticos.

O módulo de retidão é um bom começo, mas está incompleto. É possível obter uma classificação muito boa com lucro zero. Portanto, o lucro deve ser incluído na equação. Apenas adicionar algum tipo de medida do lucro total

não funciona. Você poderia obter uma linha reta com bom valor se tivesse alguns ganhos no início, alguns rebaixamentos no meio e alguns ganhos melhores no final. Isso produziria uma linha reta nivelada com bom ajuste e mostraria algum lucro. Mas isso não é realmente o que estamos procurando.

Na verdade, queremos uma linha de regressão que suba para cima com bom ajuste. Portanto, para que a ideia de usar uma linha de regressão com o menor desvio possível, o coeficiente para a inclinação ascendente deve ser incorporado à equação. É isso que

é o que queremos ver. Uma linha de regressão inclinada para cima com bom ajuste. Farei uma tentativa de incorporar isso. Sugestões e ajuda são bem-vindas :-)

 
O valor dos critérios personalizados é mostrado na listagem de resultados junto com os critérios "padrão". É possível criar dois valores nos critérios personalizados? Ainda não descobri uma boa maneira de combinar retidão e inclinação
 

Estou testando o código CSTS.

Acho esse resultado um pouco estranho:


Resultado Lucro #Trades Frofit factor DrawDown Expected Payoff Recovery Factor

0.58 1237 84 1.26 12.70 14.74 0.93

0.57 1598 90 1.38 8.69 17.36 1.76


Aqui está outro exemplo

0.61 3175 123 1.33 21.04 25.82 1.48

0.60 4460 145 1.49 11.32 30.77 2.56

De todos os pontos de vista, os valores da segunda linha são melhores!!! Mas a pontuação é menor

A única coisa que posso deduzir é que há uma penalidade em muitas negociações. Eu preferiria que fosse o contrário

E, por fim, uma última observação. Parece que há exatamente uma pessoa interessada nesse assunto. Eu.


Mais sobre isso. Cometi um erro em meu código e isso fez com que as ordens pendentes não fossem liberadas. Também resultou em apenas 5 ordens colocadas em um período de teste de 12 meses. Com um bom lucro.

Isso realmente aumentou o resultado da otimização para mais de 100. Claramente, o valor da "vitória média" foi extremamente alto, resultando nessa pontuação extrema. Tecnicamente, isso está correto, mas não tem sentido

no contexto do backtesting. Qual é a probabilidade de que tendências longas como essa sejam representativas? Então, pensei que o número de negociações deveria ser incorporado à equação de alguma forma.

Com algumas tentativas e erros, alterando o código, cheguei a um método que produz resultados que considero úteis.

mudanças:

// CSTS:
double tssf=real/teor;
if(tssf <= 0) return 0;

work = TesterStatistics( STAT_TRADES );
if( work <= 0) work = 1;
work = MathSqrt(work/4);

tssf = tssf * work;
if( tssf < 1 ) tssf = 0;
if(TesterStatistics(STAT_PROFIT) <= 0) tssf = 0;

return(tssf);

O método original provavelmente é bom para avaliar um sistema em execução, mas basicamente inútil para basear parâmetros em uma execução de backtest

Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Order Properties - Documentation on MQL5
 

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

Tenho experimentado o critério personalizado de retidão tentando 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. A simples adição do 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


//---------------------------------------------------------------------
// Obter o valor do resultado da otimização:
//---------------------------------------------------------------------
double  TBalanceSlopeCriterion::GetCriterion()
  {
// Vamos tentar calcular a inclinação da curva de equilíbrio:
   double   current_slope=1000.0*this.balance_Ptr.CalcSlope();

// Se estiver inclinado para baixo:
   if(current_slope<0.0)
     {
      return(-1.0);
     }

   double   temp=this.balance_Ptr.GetCurrentSKO();
   if(temp>0.0)
     {
      
   // return(this.scale/temp); //Isso apenas retorna a aderência dos resultados a uma linha reta que pode ser qualquer coisa, desde uma linha nivelada até uma linha apontando para cima
      double temp2 = this.scale/temp;   // acrescentou Ingvar
      
      return(temp2 * current_slope);    // acrescentou Ingvar
      
     }

   return(0.0);
  }
 
ingvar_e:

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. A simples adição do 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


ingvar_e, não está tão sozinho assim, gosto muito dessa área e fiquei surpreso com sua evolução, pois também acredito nessa linha de pensamento.

Por exemplo, para algoritmos genéticos, você deve ter um bom algoritmo de aptidão e, com certeza, criar um critério personalizado alinhado a essa aptidão.

Não tenho certeza de que calcular a inclinação da curva de equilíbrio seja a melhor maneira, pois temos várias outras maneiras, de qualquer forma, conte comigo para explorar e debater essas ideias.