Cursos Para Traders Estratégias Trader Guia Definitivo: Como Trabalhar com MqlTick na Prática

Guia Definitivo: Como Trabalhar com MqlTick na Prática

Se você já tentou usar o MqlTick em um Expert Advisor e acabou com dados vazios ou atrasados, sabe que o problema não é falta de código, mas de entendimento da cadência de ticks do mercado. O objetivo aqui é mostrar, passo a passo, como capturar e manipular ticks de forma confiável, sem criar gargalos que comprometam a performance da estratégia.

Como o MqlTick chega ao seu EA

  • Tick = atualização de preço, volume e horário enviada pelo servidor.
  • O evento OnTick() dispara a cada novo tick, mas a frequência varia de acordo com a liquidez do ativo.
  • Em pares de baixa volatilidade, pode haver segundos entre ticks; em Forex de alta liquidez, dezenas por segundo.

Estrutura mínima para usar o MqlTick

PassoO que fazer
1Declarar a variável MqlTick tick; no escopo global.
2No OnTick(), chamar CopyTick(_Symbol,0,1,tick); para preencher a estrutura.
3Validar tick.time antes de usar – garante que o dado não está desatualizado.

Exemplo prático – filtrando spikes de preço

Imagine que você quer abrir uma posição apenas se o spread real estiver abaixo de 2 pips e o preço não variar mais que 0,5% nos últimos 5 ticks.

void OnTick() { MqlTick t; if(CopyTick(_Symbol,0,1,t)!=1) return; // falha ao ler tick static double last_price[5]; static datetime last_time[5]; // shift array ArrayCopy(last_price,0,last_price,1,4); ArrayCopy(last_time,0,last_time,1,4); last_price[0]=t.last; last_time[0]=t.time; // cálculo de variação double max_change=0; for(int i=1;i<5;i++) if(last_time[i]!=0) max_change=MathMax(max_change,MathAbs((last_price[0]-last_price[i])/last_price[i])); if(t.spread<2 && max_change<0.005) OpenBuy(); // abre compra } 

Boas práticas que evitam gargalos

  • Limite de chamadas: não use CopyTick dentro de loops intensos; prefira armazenar o último tick em memória.
  • Thread‑safe: evite modificar variáveis globais sem Lock/Unlock quando usar OnTimer() simultaneamente.
  • Checagem de erros: sempre teste o retorno de CopyTick. Um retorno 0 indica perda de conexão ou símbolo inexistente.
  • Descarte de dados antigos: limite o tamanho de buffers (ex.: 50 ticks) para não estourar a memória.

Quando o MqlTick falha

Em períodos de “no‑trade” (ex.: feriados locais), o servidor pode parar de enviar ticks, deixando OnTick() inativo por minutos. Nesses casos, o EA fica “congelado” até que um novo tick apareça. Uma solução é complementar OnTimer() para checar a última hora recebida e, se ultrapassar um limite, disparar uma rotina de fallback.

FAQ rápido

  • Posso usar MqlTick para backtest? Não diretamente – o testador gera candles, não ticks. Use HistoryTick ou simule ticks a partir de candles.
  • O que fazer se o spread ficar negativo? Verifique a corretora; spreads negativos são artefato de dados corrompidos e devem ser descartados.
  • É possível obter mais de um tick por chamada? Sim, passando um array de MqlTick e definindo o número desejado no terceiro parâmetro de CopyTick.

Com a estrutura correta e as salvaguardas acima, você transforma o MqlTick de um ponto fraco em um aliado preciso. Quer aprofundar ainda mais? confira o guia avançado e teste cada bloco em um ambiente demo antes de migrar para produção.

Primeiros passos após a compra

Instale o MetaEditor e abra o diretório Files\MQL4\Include. Crie MqlTick.mqh e inclua‑o nos seus scripts com #include . Essa ação garante que o compilador reconheça a classe antes de qualquer chamada.

  • Verifique a versão – MQL5 ≥ 600 garante suporte total a datetime de alta resolução.
  • Compile – Use Compile (F7) e corrija warnings; eles costumam indicar incompatibilidades de tipos.
  • Teste – Rode o Expert Advisor (EA) em modo Strategy Tester com “Every tick” para validar a captura de ticks.

Configuração inicial da classe MqlTick

A estrutura mínima requer três atributos: price, volume e time. Defina-os no construtor para evitar valores nulos.

AtributoTipoDescrição
pricedoublePreço do tick
volumelongVolume negociado
timedatetimeTimestamp com precisão de milissegundos

Exemplo de construtor:

class MqlTick { public: double price; long volume; datetime time; MqlTick(double p,long v,datetime t){price=p;volume=v;time=t;} }; 

Rotina recomendada para captura e processamento

Utilize o evento OnTick() para instanciar a classe a cada novo tick. Em seguida, armazene o objeto em um queue circular de tamanho configurável (ex.: 500). Essa abordagem evita estouro de memória e facilita a análise de séries temporais.

⚠️ Não armazene o objeto diretamente em um Array estático sem controle de índice; isso gera gaps e dificulta o cálculo de médias móveis.

Fluxograma resumido:

  • OnTick() → criar MqlTick → push na fila → validar tamanho → calcular indicadores → disparar sinal.

Checklist operacional para iniciantes

  • ☑️ Incluir #include em todos os scripts.
  • ☑️ Definir MAX_TICKS = 500 no arquivo de configuração.
  • ☑️ Implementar função PushTick(MqlTick &t) que verifica QueueSize() antes de inserir.
  • ☑️ Testar em Strategy Tester com “Every tick” por pelo menos 1 000 ticks.
  • ☑️ Logar PrintFormat("Tick %d – %f @ %s",t.volume,t.price,TimeToString(t.time,true)) nas primeiras 10 iterações.

Erros comuns e como evitá‑los

1. Uso de int para volume – o volume pode exceder 2 147 483 647 em ativos de alta liquidez. Sempre use long.

2. Ignorar o timezonedatetime retorna UTC; converta com TimeLocal() se precisar de horário de bolsa.

3. Falha ao liberar recursos – ao encerrar o EA, chame QueueClear() para evitar vazamento de memória.

FAQ rápido

  • Posso usar MqlTick em indicadores? Sim, basta incluir a classe e chamar a fila de ticks dentro de OnCalculate().
  • Qual a precisão máxima de datetime? Até milissegundos (3 casas decimais).
  • Existe suporte a multithreading? Não nativamente; use EventSetTimer() para tarefas assíncronas leves.

Para aprofundar, acesse a documentação oficial da MetaTrader e explore exemplos prontos de captura de ticks.

Perfil Ideal e Limitações Práticas

Se você já domina o básico de MQL4/5 e precisa extrair dados de tick em tempo real sem travar o algoritmo, este guia será seu ponto de partida. Não serve para quem ainda está preso ao Hello World de Expert Advisors.

Quem deve utilizar

  • Desenvolvedores que criam scanners de alta frequência.
  • Traders que constroem indicadores baseados em micro‑movimentos.
  • Equipamentos de back‑testing que exigem precisão de milissegundo.

Quem não terá bom aproveitamento

  • Iniciantes que mal sabem usar OnTick().
  • Estratégias de longo prazo que operam apenas em barra diária.
  • Plataformas que limitam o acesso ao histórico de tick (contas de corretoras com bloqueio de dados).

Limitações contextuais

Mesmo com código otimizado, MqlTick está sujeito a:

  • Latência da corretora – o tick pode chegar com atraso de 0,2 s em mercados voláteis.
  • Conexão instável – perda de pacotes pode gerar gaps no vetor de ticks.
  • Restrição de memória – buffers de 10 000 ticks saturam rapidamente em PCs com 4 GB RAM.

FAQ contextual

PerguntaResposta
Posso usar MqlTick em estratégias de scalping?Sim, mas somente se o EA for compilado em modo Release e usar ArraySetAsSeries para acesso invertido.
O que fazer quando o buffer estoura?Implemente um RingBuffer manual ou reduza o tamanho máximo via ArrayResize.
É possível salvar ticks para análise offline?Claro: escreva em um arquivo CSV com FileOpen em modo FILE_WRITE|FILE_CSV.

Checklist final

  • Hardware: CPU ≥ i5 3.0 GHz, RAM ≥ 8 GB.
  • Conexão: latência < 100 ms, banda ≥ 10 Mbps.
  • Configuração MQL: #property strict, #define MAX_TICKS 5000.
  • Teste: 100 000 ticks em modo *Strategy Tester* antes de rodar ao vivo.

Parecer editorial equilibrado

O material entrega o essencial para quem já tem um background sólido em MQL. Ele não é um tutorial passo‑a‑passo, mas um mapa de navegação para quem precisa evitar gargalos de desempenho. A expectativa realista deve ser: ganhar precisão de 10‑15 % nas execuções de alta frequência, pagando o preço de maior uso de memória e necessidade de infraestrutura de rede estável.

Para quem se identifica com o perfil acima, a próxima etapa lógica é implementar um buffer circular e rodar um teste de carga. Caso contrário, siga com indicadores de barra padrão.

Acesse o guia completo

Deixe uma resposta

Related Post