Neste artigo
Depois deste artigo, saberá…
- Distinguir zeros documentados de propriedades gráficas e null do modelo didático.
- Conferir igualdade no limiar sem esconder input indisponível.
- Registar modos e primeira divergência sem colocar ordens.
Conceitos sem sair do artigo
Expert Advisor (EA) Backtesting: teste histórico de regrasSe 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.
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.
| Via | Input | Avaliação no modelo |
|---|---|---|
| Número explícito | 1,1050 | Maior que 1,1040: verdadeiro |
| Objeto indisponível | null | Não avaliada |
| Substituição incorreta | 0 | 0 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.
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
- Congele uma dupla de corridas e registe versões, parâmetros, dados e intervalo, sem assumir igualdade por usar o mesmo nome de EA.
- 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.
- 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.
Verifique o que aprendeu
Aprox. 3 minutos de prática.
Ver resposta e explicação
É a semântica explícita do modelo, não uma afirmação de que a função de objeto MT5 devolve null.
Mais perguntas
Null significa que funções de objeto MT5 devolvem null?
Não. A documentação descreve valores zero fora do teste visual. Null representa aqui indisponibilidade explícita; o diagnóstico real exige conferir função, sucesso, modo e dados.
Uma condição verdadeira significa que o EA vai abrir uma ordem?
Não. A página compara números declarados, sem terminal ou conta. Prontidão, critérios adicionais, permissões e execução são etapas distintas; o exercício não produz sinal financeiro.
Remover objetos garante corridas iguais?
Não. Trata uma dependência possível. Versões, dados, inputs, ticks, custos e estado inicial continuam pertinentes. Preserve evidência e procure a primeira diferença, sem julgar só pelo lucro final.
O logger está pronto para negociar?
Não. É um exemplo autónomo com OnInit de diagnóstico e OnTick vazio. Não envia ordens nem gere posições. Compile e guarde o seu resultado real; não substitua a inicialização de outro programa sem compreender o fluxo.
Fontes e verificação
- MQL5 — Testing Trading Strategies
Objetos gráficos fora de visual, consultas com zero e exceção visual; exceção de impressão em OnInit durante otimização.
- MQL5 — Running Program Properties
Significado das flags MQL_TESTER, MQL_VISUAL_MODE e MQL_OPTIMIZATION.
- MQL5 — Client Terminal Properties
TERMINAL_BUILD é número da compilação do terminal; não prova igualdade de dados.
- MQL5 — OnInit
Assinatura int OnInit e INIT_SUCCEEDED, sem certificar outro programa ou execução do exemplo.
Os cálculos usam pressupostos explícitos. Não substituem os dados atuais do mercado nem as condições do prestador.
