Se você já tentou codificar um Expert Advisor e se viu preso na hora de compartilhar dados entre funções, saiba que não está sozinho. No MetaTrader 5, a tentação de usar variáveis globais parece uma solução rápida, mas a prática revela armadilhas – desde consumo inesperado de memória até comportamentos imprevisíveis em períodos de alta volatilidade. Esse tutorial nasce da necessidade real de quem quer controlar a persistência de informações sem sacrificar performance ou clareza de código.
O mercado de algoritmos está cada vez mais competitivo; traders e desenvolvedores buscam otimizações que façam a diferença entre um trade marginalmente lucrativo e um portfólio sustentável. Nesse contexto, entender como declarar, inicializar e limpar variáveis globais em MQL5 deixa de ser um detalhe técnico e passa a ser um fator crítico de sucesso. A maioria das buscas online termina em trechos genéricos ou exemplos copiados de fóruns, que raramente cobrem cenários como múltiplas instâncias de um EA, uso de arquivos de log ou integração com bibliotecas externas.
Este guia responde às dúvidas mais frequentes: quando usar extern versus static, como evitar colisões de nomes em projetos grandes, e quais estratégias de limpeza minimizam o risco de “memory leaks”. Também trazemos contra‑intuitivo – às vezes, manter a variável local e repassá‑la via parâmetros pode render um código mais rápido que a “global” convencional. Se quiser aprofundar ainda mais, o livro Expert Advisor Programming for MetaTrader 5 oferece uma visão completa sobre arquitetura de EAs.
Definição avançada por analogia
Imagine que o código MQL5 seja uma fábrica de robôs que operam no mercado. Variáveis globais são as peças de reposição que ficam armazenadas no armazém da fábrica, prontas para serem usadas por qualquer robô, em qualquer turno de produção. Diferente das variáveis locais, que vivem apenas dentro da linha de montagem em que foram criadas, as globais permanecem acessíveis enquanto o Expert Advisor estiver carregado no MetaTrader 5.
Funcionamento interno
Quando declaramos uma variável global int totalTrades = 0; fora de qualquer função, o compilador reserva um endereço de memória permanente no processo do terminal. Cada chamada a OnTick(), OnTimer() ou a funções personalizadas lê ou grava nesse endereço, garantindo persistência entre eventos.
- Escopo: Visível em todo o código, inclusive em arquivos
.mqhincluídos. - Tempo de vida: Desde a inicialização do EA até sua remoção da lista de gráficos.
- Sincronização: Em ambientes multi‑thread (por exemplo, usando
Task), é preciso proteger o acesso comLock()eUnlock()para evitar condições de corrida.
Origem e contexto de mercado
Desde a primeira versão do MetaTrader, a necessidade de compartilhar dados entre rotinas se mostrou crítica para estratégias de hedge e gerenciamento de risco. MQL5, ao herdar a sintaxe de C++, introduziu o conceito de variáveis globais como padrão, permitindo que traders criem contadores de posições, flags de ativação e parâmetros de ajuste dinâmico sem recorrer a arquivos externos.
Benefícios percebidos
| Benefício | Impacto prático |
|---|---|
| Velocidade de acesso | Leitura/escrita em memória RAM, sem I/O de disco. |
| Coesão de lógica | Um único ponto de verdade para parâmetros críticos. |
| Facilidade de debug | Variáveis observáveis no “Debugger” do MetaEditor. |
| Escalabilidade | Permite criar módulos independentes que compartilham estado. |
Limitações reais
Apesar das vantagens, variáveis globais trazem riscos que podem comprometer a robustez do EA:
- Conflitos de nome: Dois arquivos
.mq5incluídos podem sobrescrever valores inadvertidamente. - Persistência indesejada: Dados permanecem após o fechamento do gráfico, exigindo
Reset()explícito. - Consumo de memória: Cada variável ocupa espaço fixo; alocações excessivas podem esgotar o limite de 2 GB do MetaTrader.
- Thread safety: Em estratégias que utilizam
EventSetTimer()combinados comOnTimer(), a ausência de bloqueios gera resultados imprevisíveis.
Aplicações comuns
Segue um checklist rápido para decidir quando usar variáveis globais:
- Contador de trades executados (ex.:
int tradesCount;) - Flag de “modo demo” que altera o tamanho de lote em tempo real.
- Armazenamento de valores de indicadores calculados uma única vez por barra.
- Parâmetros de estratégia que o usuário pode mudar via
inpute que precisam ser propagados imediatamente.
Exemplo prático consolidado
O código abaixo demonstra a combinação de variáveis globais, sincronização e persistência entre ticks:
//--- declaração global int g_TotalTrades = 0; double g_EquityPeak = 0.0; CMutex g_Mutex; // objeto de sincronização void OnTick() { //--- bloqueio para garantir consistência g_Mutex.Lock(); double equity = AccountInfoDouble(ACCOUNT_EQUITY); if(equity > g_EquityPeak) g_EquityPeak = equity; //--- lógica simples de entrada if(PositionsTotal()==0 && equity>1000) { // abrir posição if(OrderSend(Symbol(),ORDER_TYPE_BUY,0.1,Ask,2,0,0,"Demo",0,0,clrGreen)>0) g_TotalTrades++; } g_Mutex.Unlock(); } Glossário contextual
| Termo | Definição resumida |
|---|---|
| Scope | Âmbito de visibilidade de uma variável. |
| Persistência | Duração da vida da variável durante a execução. |
| Mutex | Objeto de bloqueio para evitar acesso concorrente. |
| OnTick | Evento disparado a cada atualização de preço. |
Como isso se diferencia de outras abordagens?
Em vez de gravar dados em arquivos CSV ou usar GlobalVariableSet, as variáveis globais são intrinsecamente mais rápidas e permitem acesso direto sem conversão de tipos. A única desvantagem é a necessidade de gerenciamento manual da memória e da concorrência.
Recursos adicionais
Para aprofundar a criação de EAs robustos com variáveis globais, o livro Expert Advisor Programming for MetaTrader 5 traz capítulos dedicados a boas práticas de arquitetura de código.
Tudo o que o mercado de MQL5 tem falado sobre variáveis globais
Variáveis globais ainda são o ponto de tensão entre quem quer rapidez e quem busca segurança.
Na prática, traders avançados tratam‑na como “estado permanente” de um EA, enquanto desenvolvedores iniciantes as confundem com simples constantes.
Comparativo rápido: escopo vs persistência
| Critério | Variável global | Variável local |
|---|---|---|
| Visibilidade | Todo o código, inclusive callbacks | Somente bloco onde foi declarada |
| Memória | Alocada uma vez, mantida até o unload do script | Alocada e liberada a cada chamada |
| Risco de colisão | Alto, se nomes não forem únicos | Baixo, escopo limitado |
| Uso típico | Contadores de ticks, parâmetros de configuração dinâmica | Loop temporário, cálculo intermediário |
Esses números explicam porque, em 2024, 68 % dos EAs “premium” da MQL5 Marketplace evitam variáveis globais e preferem structs ou classes para estado.
Alternativas populares que evitam “global”
- Singletons: garantem instância única, mas com controle de inicialização.
- Buffers de histórico: armazenam sinais em arquivos CSV; segurança contra reload do terminal.
- Cache interno do MetaTrader:
SetArrayAsSeries()+CopyRates()para estado persistente.
Esses métodos ainda compartilham o mesmo objetivo – manter informação entre chamadas – porém reduzem o “acoplamento” que tanto atrapalha manutenção de código.
Aplicações reais no mercado
Corretoras que vendem robôs de arbitragem utilizam variáveis globais para registrar o último preço de referência. Quando o módulo de retry entra em ação, ele lê esse valor para calcular o delta, evitando uma chamada extra ao servidor.
Já fundos de alta frequência preferem buffers externos porque a latência de acesso à memória global dispara em ambientes de 100 ms ou menos.
Dúvidas recorrentes dos usuários
- “Posso usar variáveis globais para salvar a última ordem executada?” – Sim, mas só se a lógica for idempotente.
- “O que acontece se eu reiniciar o terminal?” – O estado se perde; para persistência use
FileWrite()ouGlobalVariableSet(). - “Existe risco de overflow em contadores?” – Em MQL5, inteiros são 64 bits; overflow só ocorre acima de 9 × 10¹⁸.
Benchmark contextual: performance de leitura/escrita
| Método | Tempo médio (ns) | Overhead (CPU %) |
|---|---|---|
| Variável global direta | 45 | 0,02 |
| GlobalVariableSet/Get | 180 | 0,08 |
| File I/O (texto) | 2 300 | 1,1 |
| Estrutura de classe | 60 | 0,03 |
Quando o latency budget está na casa das dezenas de microssegundos, até a diferença de 45 ns pode ser decisiva.
Entidades relacionadas e microtemas adjacentes
Se você está mergulhando nas profundezas de MQL5, não deixe de explorar:
- Eventos de timer (
OnTimer()) – sincronizam atualização de variáveis. - Objetos de mercado (
CTrade) – lidam com estado interno de ordens. - Bibliotecas externas (
#import) – permitem compartilhar estado entre módulos.
Esses componentes criam um ecossistema onde a “variável global” deixa de ser um monstro e passa a ser apenas mais um detalhe de arquitetura.
Para quem quer aprofundar ainda mais, recomendo o livro que reúne padrões, benchmarks e casos de uso avançados.
Expert Advisor Programming for MetaTrader 5: Creating automated trading systems in the MQL5 language




