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
| Passo | O que fazer |
|---|---|
| 1 | Declarar a variável MqlTick tick; no escopo global. |
| 2 | No OnTick(), chamar CopyTick(_Symbol,0,1,tick); para preencher a estrutura. |
| 3 | Validar 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
CopyTickdentro de loops intensos; prefira armazenar o último tick em memória. - Thread‑safe: evite modificar variáveis globais sem
Lock/Unlockquando usarOnTimer()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
HistoryTickou 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
MqlTicke definindo o número desejado no terceiro parâmetro deCopyTick.
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
datetimede 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.
| Atributo | Tipo | Descrição |
|---|---|---|
| price | double | Preço do tick |
| volume | long | Volume negociado |
| time | datetime | Timestamp 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
Arrayestá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
#includeem todos os scripts. - ☑️ Definir
MAX_TICKS = 500no arquivo de configuração. - ☑️ Implementar função
PushTick(MqlTick &t)que verificaQueueSize()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 timezone – datetime 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
| Pergunta | Resposta |
|---|---|
| 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.

