Cursos Para Traders Estratégias Trader Guia Definitivo: Domine OnInit, OnTick e OnDeinit na Prática

Guia Definitivo: Domine OnInit, OnTick e OnDeinit na Prática

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 Bid aqui gera 0.0 e 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 em OnTick() 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). Um if(reason==REASON_REMOVE) ChartDelete(); evita “ghost objects”.
  • Armadilha: chamar ExpertRemove() dentro de OnDeinit() cria recursão e crash.

Fluxo típico de execução

EtapaQuandoO que fazer
1CarregamentoValidação de parâmetros, alocação de buffers
2Primeiro tickCalcular indicadores, decidir entrada
3Ticks subsequentesAtualizar sinais, gerenciar posições
4DesligamentoLimpar objetos, fechar sockets

FAQ relâmpago

  • Posso usar OnTimer() dentro de OnInit()? 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 e OnDeinit() é chamado com REASON_ERROR.
  • Como garantir que buffers não “vazem”? Sempre libere com ArrayFree() no OnDeinit().

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.

EventoQuando ocorreObjetivo principal
OnInit()Logo após o carregamento do EAAlocar recursos, validar parâmetros, criar objetos gráficos
OnTick()A cada novo tick de preçoProcessar lógica de negociação, atualizar indicadores
OnDeinit()Quando o EA é removido ou o terminal fechaLiberaçã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 com OBJPROP_TIME para garantir que desapareçam em OnDeinit().
  • 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 CIndicators devem ser deletados em OnDeinit().
  • 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 > Log para 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 de OnInit().

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

PerguntaResposta 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.

Acesse o guia completo

Deixe uma resposta

Related Post