Programadores que mexem com MetaTrader 5 ou plataformas de trading automatizado costumam tropeçar nos três blocos de código que controlam toda a vida de um Expert Advisor: OnInit(), OnTick() e OnDeinit(). O erro mais frequente não é desconhecer a sintaxe, mas aplicar cada função como se fosse um “script genérico”, ignorando o momento exato em que o motor da plataforma dispara cada evento. O resultado? Indicadores que “congelam”, ordens perdidas e, no pior caso, estratégias que deixam de reagir ao mercado.
OnInit(): preparação sem “surpresa”
- Objetivo: alocar buffers, validar parâmetros e conectar‑se a serviços externos antes do primeiro tick.
- Como fazer: use apenas código síncrono e verifique retornos imediatamente. Exemplo prático:
if(!SymbolInfoInteger(_Symbol,SYMBOL_TRADE_ALLOWED)) return(INIT_FAILED); - Limitação: nada que dependa de dados de mercado ainda não chegou. Tentar ler
Bidaqui gera0.0e pode levar a cálculos errôneos.
OnTick(): o coração pulsante
- Objetivo: analisar o novo preço, atualizar sinais e enviar ordens.
- Estratégia anti‑latência: mantenha o bloco < 1 ms. Priorize condições “early‑exit”:
if(!IsNewBar()) return;evita loops desnecessários. - Erro comum: loops “while(true)” para esperar confirmação de ordem. Isso bloqueia a fila de ticks e paralisa todo o EA.
- Contra‑intuitivo: às vezes, menos é mais. Remover cálculos de indicadores que podem ser pré‑processados em
OnTimer()reduz a carga emOnTick()sem perder precisão.
OnDeinit(): limpeza consciente
- Objetivo: liberar recursos, remover objetos gráficos e fechar conexões.
- Prática recomendada: sempre checar o parâmetro
reason(removal, reload, error). Umif(reason==REASON_REMOVE) ChartDelete();evita “ghost objects”. - Armadilha: chamar
ExpertRemove()dentro deOnDeinit()cria recursão e crash.
Fluxo típico de execução
| Etapa | Quando | O que fazer |
|---|---|---|
| 1 | Carregamento | Validação de parâmetros, alocação de buffers |
| 2 | Primeiro tick | Calcular indicadores, decidir entrada |
| 3 | Ticks subsequentes | Atualizar sinais, gerenciar posições |
| 4 | Desligamento | Limpar objetos, fechar sockets |
FAQ relâmpago
- Posso usar
OnTimer()dentro deOnInit()? Sim, mas registre o timer após a validação inicial para evitar chamadas prematuras. - O que acontece se eu lançar uma exceção em
OnTick()? O EA é desativado eOnDeinit()é chamado comREASON_ERROR. - Como garantir que buffers não “vazem”? Sempre libere com
ArrayFree()noOnDeinit().
Dominar o ciclo de vida desses eventos transforma um script “que funciona” em um motor robusto, pronto para operar 24/7. Se quiser aprofundar com exemplos prontos e um checklist de validação, dê uma olhada na documentação oficial – ela traz casos reais de falhas que podem ser evitados com ajustes simples.
Fluxo de execução padrão
Ao iniciar um Expert Advisor (EA) o MQL5 segue três marcos: OnInit(), OnTick() e OnDeinit(). Entender a ordem e a frequência de cada um evita sobrecarga e comportamentos inesperados.
| Evento | Quando ocorre | Objetivo principal |
|---|---|---|
| OnInit() | Logo após o carregamento do EA | Alocar recursos, validar parâmetros, criar objetos gráficos |
| OnTick() | A cada novo tick de preço | Processar lógica de negociação, atualizar indicadores |
| OnDeinit() | Quando o EA é removido ou o terminal fecha | Liberação de memória, remoção de objetos, registro de logs |
Checklist operacional de implantação
- 1. Validação de parâmetros – use
EventSetMillisecondTimer()somente se precisar de timers; caso contrário, mantenha a chamada padrão. - 2. Criação de objetos – insira linhas, retângulos ou labels dentro de
OnInit(). Marque-os comOBJPROP_TIMEpara garantir que desapareçam emOnDeinit(). - 3. Controle de risco – calcule lotes e stop‑loss uma única vez em
OnInit(). Recalcule apenas se parâmetros críticos mudarem. - 4. Loop de decisão – mantenha o código de
OnTick()enxuto: verifique apenas condições que realmente mudam a cada tick. - 5. Desligamento limpo – remova objetos, desative timers e escreva um resumo de performance em
OnDeinit().
Rotina recomendada para iniciantes
1. Carregue o EA em uma conta demo. Observe o log de OnInit() para confirmar que todos os parâmetros foram aceitos.
2. Monitore o primeiro minuto de ticks. Se o EA executar mais de 10 chamadas de OnTick() por segundo, revise a lógica – pode estar recalculando indicadores desnecessariamente.
3. Feche o gráfico e reabra. O OnDeinit() deve remover tudo; se objetos persistirem, adicione ObjectDelete() explícito.
Erros comuns e como evitá‑los
- Loop infinito dentro de OnTick() – causa travamento da plataforma. Sempre use condições de saída claras.
- Uso de Sleep() em OnInit() – bloqueia a inicialização e pode levar a “Expert initialization failed”. Prefira timers.
- Não liberar memória – objetos dinâmicos como
new CIndicatorsdevem ser deletados emOnDeinit(). - Recriar objetos a cada tick – gera sobrecarga gráfica. Crie uma vez, atualize propriedades.
Ferramentas de apoio
Para validar a sequência de eventos use o Debugger nativo do MetaEditor. Ele permite inserir breakpoints em OnInit(), OnTick() e OnDeinit(), facilitando a visualização de variáveis em tempo real.
FAQ rápido
- Posso chamar OnInit() manualmente? Não. O motor da plataforma o dispara automaticamente; chamadas manuais geram comportamento indefinido.
- O que fazer se OnDeinit() não for executado? Verifique se o EA está sendo finalizado por erro interno; habilite
Experts > Logpara rastrear a causa. - É possível usar OnTimer() ao invés de OnTick()? Sim, quando a estratégia não depende de cada tick. Defina o intervalo em
EventSetTimer()dentro deOnInit().
Perfil ideal e limites de uso de OnInit(), OnTick() e OnDeinit()
Quem domina MQL5 e precisa de controle fino sobre o ciclo de vida de um Expert Advisor (EA) encontrará nesses três gatilhos a ferramenta mais eficaz; quem ainda está no universo de scripts simples ou não depende de tempo real, perderá tempo.
Quem deve usar
- Desenvolvedores que criam EAs para estratégias que exigem alocação e liberação de recursos em tempo real (gerenciamento de memória, arquivos, sockets).
- Programadores que precisam sincronizar dados entre múltiplos objetos (gráficos, indicadores personalizados, DLLs).
- Profissionais que operam em contas de alta frequência, onde cada milissegundo conta.
Quem não terá bom aproveitamento
- Trader‑novatos que utilizam apenas “buy‑sell” sem lógica complexa.
- Usuários que rodam indicadores estáticos, onde o ciclo de vida do script é trivial.
- Quem desenvolve apenas back‑tests pontuais e não pretende rodar em tempo real.
Limitações práticas
- OnTick() dispara em cada tick de preço – em mercados voláteis pode ser milhares de chamadas por segundo, sobrecarregando o processador.
- OnDeinit() só é acionado na remoção explícita ou falha; se o terminal travar, recursos podem permanecer alocados.
- OnInit() não suporta chamadas assíncronas; operações de I/O pesadas devem ser adiadas para OnTick() ou threads externas.
FAQ contextual
| Pergunta | Resposta concisa |
|---|---|
| Posso abrir arquivos em OnInit()? | Sim, mas prefira abrir em modo leitura; gravações intensas devem ser delegadas ao OnTick(). |
| OnDeinit() garante liberação de objetos COM? | Não; é preciso chamar explicitamente ObjectRelease() antes de sair. |
| Como evitar “overrun” em OnTick()? | Implemente guardas de tempo (if (TimeCurrent()-last_call<0.02) return;). |
Checklist rápido antes de publicar
- ✔️ Todos os recursos alocados em OnInit() têm match em OnDeinit().
- ✔️ Loop interno de OnTick() está protegido por limites de tempo.
- ✔️ Logs de erro configurados para capturar falhas de inicialização.
- ✔️ Testes de carga simulando picos de tick (≥10 000 ticks/min).
Parecer editorial equilibrado
OnInit(), OnTick() e OnDeinit() são a espinha dorsal de EAs robustos. Quando usados por quem entende a carga de trabalho real, entregam performance e estabilidade. Para o amador, a complexidade pode gerar “over‑engineered” e bugs difíceis de rastrear. Avalie seu nível de expertise, a frequência de ticks esperada e a criticidade de recursos externos antes de mergulhar.
Próximos passos? Monte um protótipo mínimo, rode‑o em uma conta demo e monitore o uso de CPU por meio do “Performance Monitor” do MetaTrader. Se os números permanecerem dentro de 5 % CPU em cenários de pico, o design está adequado.


