Programar um Expert Advisor que rode sem travar o MetaTrader 5 parece simples até o primeiro erro inesperado aparecer no log. A maioria dos desenvolvedores de MQL5 acaba gastando horas — ou dias — depurando chamadas que falham porque um preço não chegou, um arquivo não abriu ou a conexão com o servidor caiu. O objetivo aqui é transformar esse caos em um fluxo previsível: detectar a falha, registrar o que aconteceu e decidir se o EA continua, reinicia ou aborta.
1. Estrutura básica de tratamento de exceções
- try – agrupa o código que pode gerar erro.
- catch – captura a exceção e permite reagir.
- finally – garante a liberação de recursos, como handles.
Em MQL5, a sintaxe é idêntica ao C++. O truque está em escolher os pontos de corte corretos: não envolva toda a lógica de cálculo, apenas as chamadas de API que retornam códigos de erro (por exemplo, CopyRates, FileOpen).
2. Tratamento de erros comuns
| Função | Código de erro típico | Reação recomendada |
|---|---|---|
| CopyRates | ERR_HISTORY_NOT_AVAILABLE | Esperar 1 s e tentar novamente até 3 vezes. |
| FileOpen | ERR_FILE_NOT_FOUND | Criar o arquivo ou abortar com mensagem clara. |
| OrderSend | ERR_TRADE_CONTEXT_BUSY | Recolher a fila de ordens e reenviar após 500 ms. |
Esses padrões evitam que o EA “morra” silenciosamente. Quando o erro for crítico (por exemplo, falta de margem), o catch pode chamar Alert() e, em seguida, ExpertRemove() para encerrar o script.
3. Robustez em ambientes reais
Um cenário típico: o feed de dados sofre um pequeno gap durante o fim de semana. Sem tratamento, CopyRates devolve 0 e o cálculo gera divisão por zero. Ao envolver a chamada em try { … } e validar ArraySize no catch, o EA pula o período sem interromper a estratégia.
Um ponto contra‑intuitivo: inserir Sleep() dentro do catch pode melhorar a taxa de sucesso, mas exagerar aumenta o lag e pode perder oportunidades. Teste com EventSetTimer() para limitar o tempo total de espera.
4. Exemplo prático
void OnTick() { try { MqlRates rates[]; if(CopyRates(_Symbol,_Period,0,10,rates)!=10) throw(GetLastError()); // cálculo da média móvel… } catch(int err) { Print("Erro ao obter candles: ",err); if(err==ERR_HISTORY_NOT_AVAILABLE) Sleep(1000); } finally { // limpa buffers temporários } } Observe como o throw converte o código de erro em exceção, simplificando o fluxo de controle.
5. FAQ rápido
- Posso usar
throwcom strings? Não. MQL5 aceita apenas inteiros; use códigos de erro. - O
finallyroda se eu chamarreturndentro dotry? Sim, garante a liberação de handles. - Exceções afetam o desempenho? Marginalmente, mas o ganho em estabilidade supera o custo.
Implementar esse padrão reduz drasticamente o tempo gasto em depuração. A próxima etapa é instrumentar o log com este guia de boas práticas e monitorar a taxa de falhas em produção.
Primeiros passos após a compra
- Instale o MetaEditor (versão 5.0 ou superior).
- Abra o arquivo
.mq5do seu EA/Indicador. - Inclua a diretiva
#includepara acessar a classeCTrade, que já contém tratamento interno de erros.
Roadmap visual de implementação
| Etapa | Objetivo | Prazo estimado |
|---|---|---|
| 1️⃣ Configuração básica | Definir OnInit() e OnDeinit() | 1 dia |
| 2️⃣ Captura de erros de API | Usar GetLastError() após cada chamada | 2 dias |
| 3️⃣ Wrapper de funções | Encapsular chamadas críticas em funções que retornam bool | 3 dias |
| 4️⃣ Log estruturado | Gravar mensagens em FileLog ou Print() com timestamp | 1 dia |
| 5️⃣ Testes de stress | Executar o EA em modo Strategy Tester com parâmetros extremos | 2 dias |
Tratamento de erros recorrentes
- Erro 4107 – “invalid price”: antes de enviar
OrderSend()verifiqueSymbolInfoDouble(_Symbol, SYMBOL_BID)eNormalizeDouble()para a precisão do ativo. - Erro 131 – “invalid trade volume”: calcule o lote mínimo com
SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)e ajuste dinamicamente. - Erro 150 – “invalid stop loss/take profit”: utilize
OrderCheck()para validar SL/TP antes da execução.
Checklist operacional de robustez
- ✅ Todas as chamadas de
CTradeseguidas porif(!trade.ResultRetcode())e registro detrade.ResultRetcode(). - ✅ Função
ClearError()que repeteResetLastError()atéGetLastError()==0. - ✅ Timeout de reconexão: se
GetLastError()==ERR_NETWORK, aguardeSleep(1000)e tente novamente até 3 vezes. - ✅ Ambiente de teste: habilite
SetTestingMode(true)para suprimir mensagens ao vivo durante a depuração.
Exemplo prático de wrapper
bool SendBuy(double volume) { CTrade trade; if(!trade.Buy(volume,_Symbol,0,0,0)) { int err=trade.ResultRetcode(); Print(__FUNCTION__,": falha (",err,") - ",ErrorDescription(err)); LogError(err); return false; } return true; } O padrão acima garante que toda tentativa de operação retorne um booleano claro e que o erro seja registrado em um arquivo dedicado (LogError()).
Fluxograma simplificado de resposta a exceção
| Evento | Ação |
|---|---|
| Erro crítico (>=1000) | Desconectar, enviar alerta por MQL5 Docs, encerrar EA. |
| Erro de validação (100‑999) | Recalcular parâmetros, repetir chamada. |
| Sem erro | Prosseguir para próximo ciclo. |
FAQ rápido
- Preciso de try/catch? – MQL5 ainda não suporta exceções nativas; o modelo
if(!func())é o padrão recomendado. - Como monitorar erros em tempo real? – Use
EventSetMillisecondTimer()para disparar um log a cada 500 ms e enviar notificações viaSendNotification(). - Posso reutilizar o mesmo wrapper em indicadores? – Sim, basta incluir o mesmo arquivo
.mqhnos dois projetos.
Quem realmente tira proveito deste guia?
Desenvolvedores que já navegam em MQL5 e precisam passam de scripts frágeis para EAs robustos.
Operadores que confiam em sinais automáticos e não aguentam falhas silenciosas no meio de um trade.
- Programadores intermediários (3‑6 meses de experiência).
- Trader‑analistas que entendem lógica de mercado, mas ainda escrevem código “na mão”.
- Equipes de quants que buscam padronizar tratamento de exceções em múltiplos robôs.
Quem deve evitar?
Iniciantes absolutos que ainda não dominam variáveis básicas ou a API da plataforma.
Quem busca “plug‑and‑play” sem adaptar os exemplos ao próprio fluxo de trade.
Limitações práticas do material
O conteúdo aborda apenas erros de execução e de lógica dentro do terminal MetaTrader 5; não cobre falhas de conectividade de broker.
Não há tratamento automático de eventos externos (web‑hooks, APIs HTTP) – requer extensão própria.
As demonstrações assumem que o usuário já configurou o teste de estratégia; caso contrário, a robustez diminuirá.
FAQ contextual
| Pergunta | Resposta |
|---|---|
| Posso usar o mesmo padrão em MQL4? | Em parte. A sintaxe de try‑catch mudou; a lógica de eventos de erro permanece similar. |
| O guia resolve “out‑of‑memory”? | Não. Esse erro exige gerenciamento manual de buffers, fora do escopo do tratamento de exceções. |
| Como testar a robustez? | Utilize o “Strategy Tester” com parâmetros extremos e habilite Allow live trading para validar em tempo real. |
Checklist de compatibilidade
- Já escreveu ao menos um Expert Advisor.
- Entende conceitos de “return codes” da API.
- Possui acesso ao MetaEditor com debugger ativo.
- Não depende de bibliotecas externas não‑documentadas.
Parecer editorial
O material entrega mais do que um tutorial básico; oferece um arcabouço que reduz quase 80 % das falhas inesperadas durante a execução ao vivo. Contudo, quem não tem disciplina para inserir try‑catch em cada ponto crítico verá pouco ganho.
Em termos de custo‑benefício, o investimento de tempo (≈ 5 horas de leitura + prática) paga dividendos rápidos para quem já opera com volume. Para quem ainda está no “modo teste” e aceita perdas menores, o retorno pode ser marginal.
Próximos passos recomendados
Implemente o padrão de captura em um EA simples que já esteja em produção. Depois, escalone para estratégias mais complexas, inserindo logs estruturados (ex.: PrintFormat) para auditoria.
Confira a página oficial para download da versão completa e material complementares: Baixe aqui

