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

Para adicionar comentários, por favor Faça o login ou registrar
Rodolfo Andrade
1059
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.
Rodrigo Malacarne
Moderador
8087
Rodrigo Malacarne  
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).
Rodolfo Andrade
1059
Rodolfo Andrade  
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.

Rodrigo Malacarne
Moderador
8087
Rodrigo Malacarne  
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 

Rodolfo Andrade
1059
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:

double OnTester() {
   if(alvoBreakeven > gain) return(-666);
   return(meuResultadoOtimizado);
}
Rodrigo Malacarne
Moderador
8087
Rodrigo Malacarne  
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 

Rodolfo Andrade
1059
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!
Rodrigo Malacarne
Moderador
8087
Rodrigo Malacarne  
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!
Para adicionar comentários, por favor Faça o login ou registrar