O Testador de Estratégias retorna valores incorretos ao utilizar critérios definidos pelo usuário

 

O Testador de Estratégias não retorna o valor correto de `OnTester` ao executar passagens consecutivas ao longo de vários dias. Passei dias tentando descobrir se o erro estava no meu código, mas não está. A plataforma exibe um valor na tabela com base no critério de máximo definido pelo usuário, mas esse não é o valor real que deveria aparecer ali; ela seleciona um valor de algum ponto intermediário da passagem, em vez do valor final. O Testador de Estratégias retorna valores incorretos ao utilizar critérios definidos pelo usuário. Aqui está o log de uma única execução de teste utilizando os mesmos parâmetros de passagem: Seria ótimo se houvesse uma opção para um "valor mínimo garantido" nos testes — mas não existe, então temos que desenvolver algo simples por conta própria e lidar com as dores de cabeça resultantes. O valor correto deveria ser 64, mas o sistema retorna 233; esse valor de 233 realmente ocorreu, mas durante uma execução de teste dentro de um período de dois meses. Ele simplesmente ignorou todas as atualizações do meu valor. Verifiquei absolutamente tudo — metas atualizadas, agentes atualizados, logs dos agentes — e não encontrei nada.

CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   [GRADIENTE ] m_candleInicialParaFrente = 8
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   ═══════════════════════════════════════════════════════════
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   🔄 [OnInit] RESETANDO VARIÁVEIS!
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00      melhorMaxMinTester ANTES = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   ═══════════════════════════════════════════════════════════
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00      melhorMaxMinTester DEPOIS = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00
CS 0 06:25:16.412 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   ═══════════════════════════════════════════════════════════
CS 0 06:33:56.276 Tester 42 OnTester result 233 : passed in 0:08:40.138
CS 0 06:33:56.288 DuploHalfTrend_Robot (WIN$N,M3) 2026.07.01 00:00:00   ═════════════════════ should be CS 0 06:33:56.276 Tester 42 OnTester result 64!!!!!!!!! 


double OnTester()
{
   // Se nunca atualizou max, retorna 0
   if(melhorMaxMinTester == DBL_MAX)
   {
      Print("❌ NENHUM DIA MAXMINTESTER REGISTRADO! Retornando 0");
      return 0;
   }
   
   Print("═══════════════════════════════════════════════════════════");
   Print("🏆 MAXMIN FINAL = $", DoubleToString(melhorMaxMinTester, 2));
   Print("═══════════════════════════════════════════════════════════");
 
   return melhorMaxMinTester;
} 


void OnTick()      // Só executa UMA VEZ, exatamente no momento que o dia termina
      if (melhorMaxMinTester > maxGanhoDia) {
        melhorMaxMinTester = maxGanhoDia;
        melhorMaxMinData = TimeCurrent();
      }
      if (maxDrawdown > minGanhoDia) {
        maxDrawdown = minGanhoDia;
        maxDrawdownData = TimeCurrent();
      }   
  
      Print("═══════════════════════════════════════════════════════════");
      Print("🛑 [TOTAL GERAL FINAL]   Valor: $", DoubleToString(totalGeralFinal, 2));         
      Print("-----------------------------------------------------------");
      Print("🛑 [MAX DRAWDOWN]   Valor: $", DoubleToString(maxDrawdown, 2));
      Print("🛑 [MAX DRAWDOWN]   Data: ", TimeToString(maxDrawdownData, TIME_DATE|TIME_MINUTES));
      Print("-----------------------------------------------------------");
      Print("🛑 [maxGanhoDia]    Valor: $", DoubleToString(maxGanhoDia, 2));
      Print("-----------------------------------------------------------");
      Print("🛑 [minGanhoDia]    Valor: $", DoubleToString(minGanhoDia, 2));
      Print("-----------------------------------------------------------");            
      Print("📊 [MAXMIN]         Valor: $", DoubleToString(melhorMaxMinTester, 2));
      Print("📊 [MAXMIN]         Data: ", TimeToString(melhorMaxMinData, TIME_DATE|TIME_MINUTES));
      Print("-----------------------------------------------------------");
      Print("📊 [StatusFinalDia] StatusFinalDia: $", StatusFinalDia);
      if(g_DebugPrints) Print("═══════════════════════════════════════════════════════════");


⚠️ Editado por moderador (https://www.mql5.com/pt/forum/339131):

  • Tradução automática aplicada. Cada idioma tem seu respectivo fórum e, portanto, é proibido se comunicar em um idioma diferente daquele do fórum em questão.
  • Código formatado incorretamente. Utilize o botão CÓDIGO (Alt+S) ao inserir o seu código:

          Botão de código no editor

Arquivos anexados:
log.jpg  115 kb
tabela.jpg  133 kb
 

ajcmrjO Testador de Estratégias não retorna o valor correto de `OnTester` ao executar passagens consecutivas ao longo de vários dias. Passei dias tentando descobrir se o erro estava no meu código, mas não está. A plataforma exibe um valor na tabela com base no critério de máximo definido pelo usuário, mas esse não é o valor real que deveria aparecer ali; ela seleciona um valor de algum ponto intermediário da passagem, em vez do valor final. O Testador de Estratégias retorna valores incorretos ao utilizar critérios definidos pelo usuário. Aqui está o log de uma única execução de teste utilizando os mesmos parâmetros de passagem: Seria ótimo se houvesse uma opção para um "valor mínimo garantido" nos testes — mas não existe, então temos que desenvolver algo simples por conta própria e lidar com as dores de cabeça resultantes. O valor correto deveria ser 64, mas o sistema retorna 233; esse valor de 233 realmente ocorreu, mas durante uma execução de teste dentro de um período de dois meses. Ele simplesmente ignorou todas as atualizações do meu valor. Verifiquei absolutamente tudo — metas atualizadas, agentes atualizados, logs dos agentes — e não encontrei nada.

Opa! Para conseguirmos investigar isso de forma útil, precisaríamos poder reproduzir o comportamento. Com os trechos de código isolados que você postou, não é possível.

O ideal seria você preparar um exemplo mínimo reproduzível: um EA simples e completo (pode ser uma estratégia qualquer, bem básica) que contenha só o necessário para o problema aparecer. Se esse código, ao ser compilado e rodado, mostrar a divergência entre o valor do OnTester e o que aparece na tabela de otimização, aí temos algo concreto para analisar - e, se realmente for um problema da plataforma, um caso sólido para reportar à MetaQuotes.

Junto com o código, seria importante informar:

  • Período exato usado na otimização e no teste único (precisam ser idênticos para a comparação fazer sentido);
  • Modelo de geração de ticks em cada caso;
  • Os parâmetros da passagem específica que está comparando;
  • Build do terminal.

Uma observação sobre o log que você postou: o teste único mostra MAXMIN FINAL = $64.00 e logo em seguida OnTester result 64 - ou seja, nesse teste o OnTester retornou corretamente. Isso sugere que a divergência pode estar na comparação entre execuções feitas com configurações diferentes, e não no OnTester em si. Você mesmo menciona que o valor 233 ocorreu "durante uma execução de teste dentro de um período de dois meses" - se os períodos forem diferentes, os valores naturalmente serão diferentes. O teste decisivo seria rodar um teste único com exatamente os mesmos parâmetros, período e modelo de ticks.

 
Vinicius Pereira De Oliveira #:

Opa! Para conseguirmos investigar isso de forma útil, precisaríamos poder reproduzir o comportamento. Com os trechos de código isolados que você postou, não é possível.

O ideal seria você preparar um exemplo mínimo reproduzível: um EA simples e completo (pode ser uma estratégia qualquer, bem básica) que contenha só o necessário para o problema aparecer. Se esse código, ao ser compilado e rodado, mostrar a divergência entre o valor do OnTester e o que aparece na tabela de otimização, aí temos algo concreto para analisar - e, se realmente for um problema da plataforma, um caso sólido para reportar à MetaQuotes.

Junto com o código, seria importante informar:

  • Período exato usado na otimização e no teste único (precisam ser idênticos para a comparação fazer sentido);
  • Modelo de geração de ticks em cada caso;
  • Os parâmetros da passagem específica que está comparando;
  • Build do terminal.

Uma observação sobre o log que você postou: o teste único mostra MAXMIN FINAL = $64.00 e logo em seguida OnTester result 64 - ou seja, nesse teste o OnTester retornou corretamente. Isso sugere que a divergência pode estar na comparação entre execuções feitas com configurações diferentes, e não no OnTester em si. Você mesmo menciona que o valor 233 ocorreu "durante uma execução de teste dentro de um período de dois meses" - se os períodos forem diferentes, os valores naturalmente serão diferentes. O teste decisivo seria rodar um teste único com exatamente os mesmos parâmetros, período e modelo de ticks.

Salve Vinicius! Bom saber ate que vc é da Lingua portuguesa! Rapaz eu vou tentar muito recriar um ea mais simples pra tentar colocar o cenario similar. Mas depois do meu post eu fiz diversas coisas e realemnet achei o culpado. e com certeza nao é meu codigo. Eu tenho um ryzen 9 5950x, minha maquina na qual programo e testos os robos e ponho eles em testes em massa criterio do usuario. quando eu desativo todos os agentes e deixo apenas os cores da minha maquina local! todos os passes sao integros. respondem certinho ao codigo, e o ontester retorna perfeito! É so eu usar minha maquinas locais, da minha farm local, nao uso a nuvem, comecam a vir resultados divergentes. resultados acima. nao sei explicar é como se o retorno do ontester dessas maquinas parassem no meio do caminho ao me entregar. um exemplo: estou fazendo tiragem de julho e agosto. parece quena minha maquina local o ontester retorna o valor do ultimo dia, ao passo que nas maquinas da farm, eles retornam o ontester de sei la 2 de agosto, ficitio.   essa imagem é da maquina local, todos os resultados estao certos, abaixo dew 100, quando eu uso o da minha farm comecam vir os valores maiores que sao mentira, eram valores do meio do caminho.   os passes de 64 estao certos. mas os passes acima de 100reais. estao errados. sao os provenientes dos agentes das outras maquinas, entao sim ha um bug do ontester que sao retornados das maquinas dos agentes locais, e provavelmente das nuvens, que eu nao uso. eu poderia ate fazer um video sobre isso e tentar por no YT pra vc ver. e com certeza nao é do meu codigo, se fosse minha maquina local daria valores errados tb pelos parametros. ja atualizei meus agentes pra versao de build mais nova e mesma coisa. limpei tudo, cache, log, history. sincronizei e nada. reinstalei os agentes na maquina da farm do zero e nada. por mim a gente ate faria uma live no discord pra mostra kkk
Arquivos anexados:
 
ajcmrj #:
Salve Vinicius! Bom saber ate que vc é da Lingua portuguesa! Rapaz eu vou tentar muito recriar um ea mais simples pra tentar colocar o cenario similar. Mas depois do meu post eu fiz diversas coisas e realemnet achei o culpado. e com certeza nao é meu codigo. Eu tenho um ryzen 9 5950x, minha maquina na qual programo e testos os robos e ponho eles em testes em massa criterio do usuario. quando eu desativo todos os agentes e deixo apenas os cores da minha maquina local! todos os passes sao integros. respondem certinho ao codigo, e o ontester retorna perfeito! É so eu usar minha maquinas locais, da minha farm local, nao uso a nuvem, comecam a vir resultados divergentes. resultados acima. nao sei explicar é como se o retorno do ontester dessas maquinas parassem no meio do caminho ao me entregar. um exemplo: estou fazendo tiragem de julho e agosto. parece quena minha maquina local o ontester retorna o valor do ultimo dia, ao passo que nas maquinas da farm, eles retornam o ontester de sei la 2 de agosto, ficitio.   essa imagem é da maquina local, todos os resultados estao certos, abaixo dew 100, quando eu uso o da minha farm comecam vir os valores maiores que sao mentira, eram valores do meio do caminho.   os passes de 64 estao certos. mas os passes acima de 100reais. estao errados. sao os provenientes dos agentes das outras maquinas, entao sim ha um bug do ontester que sao retornados das maquinas dos agentes locais, e provavelmente das nuvens, que eu nao uso. eu poderia ate fazer um video sobre isso e tentar por no YT pra vc ver. e com certeza nao é do meu codigo, se fosse minha maquina local daria valores errados tb pelos parametros. ja atualizei meus agentes pra versao de build mais nova e mesma coisa. limpei tudo, cache, log, history. sincronizei e nada. reinstalei os agentes na maquina da farm do zero e nada. por mim a gente ate faria uma live no discord pra mostra kkk
resolvido
 
ajcmrj #resolvido
Que boa notícia, @ajcmrj! 👏 Você poderia compartilhar o que era? Fica registrado para quem passar pelo mesmo problema depois - e como o tópico levantou a hipótese de um bug no OnTester com agentes locais, seria bom deixar claro qual era a causa real. Vai que outra pessoa esbarra nisso e encontra este tópico. 👍