Como ignorar combinações em uma otimização do Strategy Tester Backtest

 
Olá pessoal, já estou utilizando OnTester() para personalizar meus resultados de otimização. Gostaria agora de saber como eu faço para ignorar certas combinações de parâmetros para agilizar o processo de otimização. Por exemplo: Considere duas variáveis de otimização gain1 e gain2. Gostaria que a otimização ignorasse completamente os casos em que gain2 < gain1.
 
Rodolfo Andrade:
Olá pessoal, já estou utilizando OnTester() para personalizar meus resultados de otimização. Gostaria agora de saber como eu faço para ignorar certas combinações de parâmetros para agilizar o processo de otimização. Por exemplo: Considere duas variáveis de otimização gain1 e gain2. Gostaria que a otimização ignorasse completamente os casos em que gain2 < gain1.

Olá Rodolfo Andrade,

Por favor dê uma lida nesse artigo: https://www.mql5.com/en/code/914

Existe também outro artigo sobre o assunto: https://www.mql5.com/en/articles/403

Acredito que eles podem te ajudar em suas dúvidas.

Abraços,
Malacarne 

Visualization of Optimization Results in Real Time
Visualization of Optimization Results in Real Time
  • votos: 41
  • 2012.06.13
  • MetaQuotes Software Corp.
  • www.mql5.com
Introducing the example of visualization of optimization results in real time (balance curve dynamics and an Expert Advisor statistical parameters).
 
Rodrigo Malacarne:

Olá Rodolfo Andrade,

Por favor dê uma lida nesse artigo: https://www.mql5.com/en/code/914

Existe também outro artigo sobre o assunto: https://www.mql5.com/en/articles/403

Acredito que eles podem te ajudar em suas dúvidas.

Abraços,
Malacarne 

Obrigado pela ajuda mais uma vez Malacarne. O primeiro link que o amigo passou fala sobre a visualização dos resultados de otimização em tempo real. Basicamente ele fornece classes e descreve como implementar tal visualização. O segundo link também trata basicamente de como usufruir de mais recursos visuais proporcionados pelo Strategy Tester, repetindo inclusive o recurso de acompanhamento em tempo real do artigo anterior.

Infelizmente em ambos acabei não encontrando algo que imagino ser um pouco mais simples, mas que ainda desconheço, que é o de poupar processamento do Strategy Tester lhe informando um conjunto de combinações que ele não deve processar.

Lendo a documentação imaginei que eu iria simplesmente colocar a seguinte linha em OnTesterInit():

if(gain2 < gain1) return(INIT_FAILED);

Desta maneira imaginei que assim como em OnInit(), o controle iria passar imediatamente para OnTesterDeinit(), pulando assim OnTester(). Mas acontece que OnTesterInit() é void. Então pelo que estou vendo só me resta colocar esta mesma linha em OnTester() assim:

if(gain2 < gain1) return(-10000);

Assim eu estaria decretando o resultado com esta combinação como ruim, onde o Testador não iria passar tal resultado para a próxima geração ou simplesmente o indexando como ruim, mas ainda assim eu estaria usando processamento com a combinação indevida, visto que o evento ocorre somente após o teste. Isso no caso é justamente o que eu quero evitar para justamente obter novas gerações mais rapidamente.

 
Rodolfo Andrade:

Obrigado pela ajuda mais uma vez Malacarne. O primeiro link que o amigo passou fala sobre a visualização dos resultados de otimização em tempo real. Basicamente ele fornece classes e descreve como implementar tal visualização. O segundo link também trata basicamente de como usufruir de mais recursos visuais proporcionados pelo Strategy Tester, repetindo inclusive o recurso de acompanhamento em tempo real do artigo anterior.

Infelizmente em ambos acabei não encontrando algo que imagino ser um pouco mais simples, mas que ainda desconheço, que é o de poupar processamento do Strategy Tester lhe informando um conjunto de combinações que ele não deve processar.

Lendo a documentação imaginei que eu iria simplesmente colocar a seguinte linha em OnTesterInit():

 Desta maneira imaginei que assim como em OnInit(), o controle iria passar imediatamente para OnTesterDeinit(), pulando assim OnTester(). Mas acontece que OnTesterInit() é void. Então pelo que estou vendo só me resta colocar esta mesma linha em OnTester() assim:

Olá Rodolfo Andrade,

É um pouco mais complexo que isso... Na verdade, o "descarte" dos testes deve ser feito, infelizmente, após o processamento do mesmo. A ideia de estudar como visualizar as otimizações, é justamente para que você possa entender o processo de teste, visualização e manipulação dos resultados da otimização, geralmente feita posteriormente ao teste via arquivos.

O que você quer, na prática, é impossível. Afinal, como é possível saber o ganho de um teste sem ter feito o teste previamente?

Abraços,
Malacarne 

 

Na verdade então o amigo confirma que é impossível, infelizmente, descartar uma combinação mesmo antes de testá-la.

Naturalmente em alguns casos é claro saber que uma determinada combinação é impossível de produzir um resultado positivo ou relevante, como por exemplo, colocar um valor de alvo para breakeven superior a um valor de gain. Por exemplo alvoBreakeven otimizando de 0 a 100 e gain otimizando de 0 a 100.

Neste caso é um total desperdício de processamento testar os casos onde alvoBreakeven é maior que o gain, visto estaremos fora do trade atingindo o gain antes do alvo de breakeven.

Neste caso então, penso que devo simplesmente colocar a tal linha em OnTester(), mais ou menos, assim:

double OnTester() {
   if(alvoBreakeven > gain) return(-666);
   return(meuResultadoOtimizado);
}
 
Rodolfo Andrade:

Na verdade então o amigo confirma que é impossível, infelizmente, descartar uma combinação mesmo antes de testá-la.

Naturalmente em alguns casos é claro saber que uma determinada combinação é impossível de produzir um resultado positivo ou relevante, como por exemplo, colocar um valor de alvo para breakeven superior a um valor de gain. Por exemplo alvoBreakeven otimizando de 0 a 100 e gain otimizando de 0 a 100.

Neste caso é um total desperdício de processamento testar os casos onde alvoBreakeven é maior que o gain, visto estaremos fora do trade atingindo o gain antes do alvo de breakeven.

Neste caso então, penso que devo simplesmente colocar a tal linha em OnTester(), mais ou menos, assim:

Olá Rodolfo Andrade,

O mais correto é você descartar os testes pela combinação errada de parâmetros logo dentro de OnInit, utilizando a opção INIT_PARAMETERS_INCORRECT, disponível para a função de manipulação de eventos OnInit. Essa seria uma forma inteligente de evitar desperdício de processamento em otimizações.

Abraços,
Malacarne 

 
Hmmm aí sim... era essa dica que eu precisava. Parece que isso resolve o problema, pois apesar da lista de resultados ser preenchida com resultados zerados das combinações inválidas (pelo menos estão destacadas em vermelho), o processamento é poupado para as combinações de parâmetros consideradas incorretas. Legal, muito obrigado pela atenção!
 
Rodolfo Andrade:
Hmmm aí sim... era essa dica que eu precisava. Parece que isso resolve o problema, pois apesar da lista de resultados ser preenchida com resultados zerados das combinações inválidas (pelo menos estão destacadas em vermelho), o processamento é poupado para as combinações de parâmetros consideradas incorretas. Legal, muito obrigado pela atenção!
 
Boa tarde.

E não existe uma forma de filtrar estes parâmetros, sem mostrar os valores dos testes zerados?
Tenho a impressão que estes passos zerados acabam atrapalhando a continuidade da otimização.
 

Cansa não é meu caro?

Tem jeito sim, você pode usar a função:

TesterStop();

Assim, quando determinada condição, como a que mencionou não for satisfeita, você chama a função. 

Vale muito a pena, perde-se de fato muito tempo com resultado não nos interessam a depender da estratégia. 

Por exemplo; você pode querer uma estratégia que seja agressiva, então, se eu realizo um teste e ele não oferece x aberturas de posições em um dado período de tempo, eu o encerro.

Agora uma observação!

Planeje com cuidado suas restrições pois pode acabar sem resultado algum. 

Outra dica que acrescento é, no retorno da função OnTester() você entregar um número que lhe sirva de código para avaliar em qual restrição àquela otimização caiu. 

O valor é double, contudo você pode adicionar algo do tipo por exemplo;

9001 = Número de operações inferior ao desejado

9002 = Ganho semanal fora dos objetivos propostos

etc.

Agora vão pra o código e sucesso por aí.

Razão: