Cursos Para Traders Estratégias Trader Guia Definitivo: Tratamento de Exceções em MQL5 na Prática

Guia Definitivo: Tratamento de Exceções em MQL5 na Prática

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çãoCódigo de erro típicoReação recomendada
CopyRatesERR_HISTORY_NOT_AVAILABLEEsperar 1 s e tentar novamente até 3 vezes.
FileOpenERR_FILE_NOT_FOUNDCriar o arquivo ou abortar com mensagem clara.
OrderSendERR_TRADE_CONTEXT_BUSYRecolher 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 throw com strings? Não. MQL5 aceita apenas inteiros; use códigos de erro.
  • O finally roda se eu chamar return dentro do try? 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 .mq5 do seu EA/Indicador.
  • Inclua a diretiva #include para acessar a classe CTrade, que já contém tratamento interno de erros.

Roadmap visual de implementação

EtapaObjetivoPrazo estimado
1️⃣ Configuração básicaDefinir OnInit() e OnDeinit()1 dia
2️⃣ Captura de erros de APIUsar GetLastError() após cada chamada2 dias
3️⃣ Wrapper de funçõesEncapsular chamadas críticas em funções que retornam bool3 dias
4️⃣ Log estruturadoGravar mensagens em FileLog ou Print() com timestamp1 dia
5️⃣ Testes de stressExecutar o EA em modo Strategy Tester com parâmetros extremos2 dias

Tratamento de erros recorrentes

  • Erro 4107 – “invalid price”: antes de enviar OrderSend() verifique SymbolInfoDouble(_Symbol, SYMBOL_BID) e NormalizeDouble() 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 CTrade seguidas por if(!trade.ResultRetcode()) e registro de trade.ResultRetcode().
  • ✅ Função ClearError() que repete ResetLastError() até GetLastError()==0.
  • ✅ Timeout de reconexão: se GetLastError()==ERR_NETWORK, aguarde Sleep(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

EventoAçã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 erroProsseguir 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 via SendNotification().
  • Posso reutilizar o mesmo wrapper em indicadores? – Sim, basta incluir o mesmo arquivo .mqh nos 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

PerguntaResposta
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

Deixe uma resposta

Related Post