Se um EA só funciona no teste visual MT5, confira se a decisão depende de um valor explícito ou de algo desenhado no gráfico. Um objeto gráfico não deve substituir inadvertidamente a origem do sinal. Antes de mudar a estratégia, compare modos, versões e dados e procure a primeira diferença nos registos.

O exemplo deste artigo é um modelo didático, sem executar MT5, ligar uma conta ou enviar ordens. Separa um número de uma leitura indisponível. A ausência permanece desconhecida em vez de ser silenciosamente convertida em zero; isso é uma escolha explícita do nosso modelo, não o retorno documentado de todas as funções da plataforma.

O que a documentação diz sobre objetos gráficos

A documentação MQL5 informa que, fora do teste visual, os objetos gráficos não são desenhados durante teste/otimização e consultas às suas propriedades devolvem valores zero. A limitação não se aplica ao modo visual. Este é comportamento documentado, não um ensaio que tenhamos executado no seu EA nem explicação universal para divergências.

Se o código lê o preço de uma linha ou o estado de um botão, registe essa etapa separadamente dos dados de preço e indicador. Primeiro confirme disponibilidade naquele modo. Um estado explícito de indisponibilidade pode interromper a avaliação antes da comparação; um zero técnico aceite como preço esconde o problema. Um gráfico visível não confirma prontidão de todos os inputs.

Um número e uma ausência respondem a perguntas diferentes

Declare sinal numérico positivo 1,1050 e limiar 1,1040, com condição «sinal maior que limiar». A via numérica dá verdadeiro. Na via de objeto indisponível, usamos null e não avaliamos a condição. Não são cotações ou logs observados: escolhemos os valores e estados para demonstrar o fluxo.

Input indisponível não é preço zeroSimulação própria: sinal 1,1050, limiar 1,1040 e comparação estrita. Nenhum teste MT5 ou ordem é executado.EXEMPLO DE CÁLCULONúmero explícito1,1050 > 1,1040Objeto indisponívelnullSubstituição defeituosa0 > 1,1040
Input indisponível não é preço zero. Simulação própria: sinal 1,1050, limiar 1,1040 e comparação estrita. Nenhum teste MT5 ou ordem é executado.

A via numérica é verdadeira; a ausente fica desconhecida. Não atribua ao modelo o retorno de uma função real.

Número explícito
1,1050 > 1,1040 – Verdadeiro no modelo.
Objeto indisponível
null – Condição não avaliada.
Substituição defeituosa
0 > 1,1040 – Falso que esconderia a ausência.
ViaInputAvaliação no modelo
Número explícito1,1050Maior que 1,1040: verdadeiro
Objeto indisponívelnullNão avaliada
Substituição incorreta00 maior que 1,1040: falso aparentemente normal

A última linha é uma versão defeituosa separada, não o comportamento da via protegida. Se a condição fosse «abaixo do limiar», zero substituído poderia até satisfazê-la. Não repare o programa inserindo um fallback arbitrário: primeiro determine que informação devia existir e como reconhecer a falha.

Contraprova de igualdade e resultado económico

Como controlo próprio, fixe ambos os valores em 1,1040. «Maior que» é falso; «maior ou igual» seria verdadeiro. Uma ausência continua desconhecida em ambos os casos. A diferença 1,1050−1,1040=0,0010 é dez pips se estipular pip de 0,0001; não é lucro de uma ordem. Para uma quantidade nominal fictícia de 1000 EUR, esse intervalo corresponderia a 1 USD bruto só se fossem preços efetivos de entrada/saída num contrato linear. O modelo não realiza tais execuções nem calcula conversão líquida para EUR.

O exercício no navegador

Pode variar dois números positivos finitos e o modo assumido. Inputs usam ponto decimal, intervalo de 10⁻⁸ a 10⁸ e até 15 algarismos. No modo não visual estipulado, o objeto é indisponível; no visual, o modelo atribui-lhe o valor do sinal. A ferramenta não lê um gráfico, não executa um teste de plataforma e não cria recomendação de investimento.

Separar dados de um objeto gráfico

Este exemplo didático funciona localmente no navegador: não se liga a uma conta ou API, não envia as entradas nem as guarda persistentemente. Não introduza palavras-passe ou dados pessoais.

Isto simula a nossa regra, não um teste de EA em MT5. Use números positivos com ponto decimal, de 10⁻⁸ a 10⁸, até 15 algarismos. No modelo, dados de objeto ausentes são null; uma versão defeituosa separada substitui zero. Isto não estabelece a causa da falha do seu EA.

O exercício previsto trabalha localmente, sem enviar entradas, guardar dados persistentemente ou aceder a uma conta/API. Não introduza credenciais ou dados pessoais. A comparação distingue falso de impossível avaliar; não estabelece a causa de qualquer falha real nem eficácia do programa. As instruções e o exemplo resolvido continuam úteis sem JavaScript.

Registar o modo sem negociar

MQL_TESTER, MQL_VISUAL_MODE e MQL_OPTIMIZATION descrevem o ambiente do programa. TERMINAL_BUILD identifica a compilação do terminal. Registe as leituras reais em vez de inferir o modo pela aparência da janela; esses campos não demonstram dados ou parâmetros idênticos.

O pequeno EA autónomo seguinte escreve configuração em OnInit e tem OnTick vazio. Não envia nem modifica ordens, não calcula sinal nem gere posições. Guarde num ficheiro MQ5 separado, compile em MetaEditor e conserve o resultado e o log reais. Os rótulos técnicos na linha de registo ficam estáveis para comparar corridas.

#property strict
int OnInit()
{
   PrintFormat("tester=%d visual=%d optimization=%d build=%d symbol=%s period=%d",
      (int)MQLInfoInteger(MQL_TESTER),
      (int)MQLInfoInteger(MQL_VISUAL_MODE),
      (int)MQLInfoInteger(MQL_OPTIMIZATION),
      (int)TerminalInfoInteger(TERMINAL_BUILD),
      _Symbol, (int)_Period);
   return INIT_SUCCEEDED;
}
void OnTick() {}

Não crie um segundo OnInit num EA existente nem substitua a inicialização por este excerto. Adicionar registo exige preservar o fluxo original. A documentação do tester dá uma exceção para PrintFormat dentro de OnInit durante otimização; faltar saída de impressão noutras etapas não prova que nunca executaram. O código apresentado é para diagnóstico, sem teste nativo alegado neste artigo.

Encontrar a primeira divergência, em vez de comparar lucro

Prepare duas fichas: modo visual/não visual, versões do terminal e código, inputs, símbolo, timeframe, geração de ticks, início pedido e efetivo, snapshot dos dados, custos e estado inicial. Guarde ficheiros de configuração e identificadores. Se as declarações diferirem, não atribua toda a mudança à janela do gráfico. O comparador de corridas organiza esta verificação.

Procure a primeira etapa com valor diferente: sucesso de leitura, timestamp, prontidão de indicador, sinal, condição ou decisão. «Lucro 120 em vez de 80» não identifica essa etapa. Conserve logs originais e construa uma pequena tabela ao lado; não invente o que o programa não registou. Use identificador de observação, input pedido e posição temporal ou sequencial para alinhar eventos.

Registar tudo sem identificador estável pode dificultar a comparação. Se a via numérica recebe o mesmo valor, prossiga para condições e estado; se nem existe input, não classifique o resultado como falso normal. Sem código-fonte, envie ao autor a ficha e a primeira diferença documentada, assinalando campos ainda desconhecidos, em vez de experimentar ordens reais repetidamente.

Três ações para separar cálculo e desenho

  1. Congele uma dupla de corridas e registe versões, parâmetros, dados e intervalo, sem assumir igualdade por usar o mesmo nome de EA.
  2. Faça o cálculo devolver valor e estado de disponibilidade; deixe a camada gráfica apenas apresentá-los. Teste valor acima, igual e ausente.
  3. Recolha diagnóstico sem negociação em tester ou configuração demo separada e compare a primeira divergência antes de mudar vários componentes.

Retirar dependência de desenho trata uma causa possível, sem garantir igualdade de todo o tester: custos, versões e outros estados continuam relevantes. O guia MT4/MT5 aprofunda preparação. Um diagnóstico explicável melhora a investigação; não demonstra segurança ou rentabilidade do EA.