- Tipos de otimização - Trading algorítmico, robôs comerciais
- Assistente MQL5, desenvolvimento de robôs de negociação
- Como usar - MQL5 Cloud Network
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

- votos: 41
- 2012.06.13
- MetaQuotes Software Corp.
- www.mql5.com
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.
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); }
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!

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í.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso