Programadores que já lidam com MQL5 sabem que a maior dor de cabeça costuma ser obter dados precisos do mercado sem desperdiçar ciclos de CPU. Quando a necessidade é ler um valor de ponto flutuante – como o spread atual ou o tamanho mínimo de lote – a função SymbolInfoDouble() surge como a solução “única”. Na prática, porém, ela tem pegadinhas que atrapalham até o desenvolvedor mais experiente, especialmente ao lidar com símbolos que ainda não foram carregados ou que operam em modos de negociação diferentes.
Quando e por que usar SymbolInfoDouble()
- Objetivo: extrair um double de qualquer propriedade do símbolo (ex.:
SYMBOL_BID,SYMBOL_TRADE_TICK_SIZE). - Contexto real: estratégias de scalping que dependem do tick size para calcular o risco por ponto.
- Dificuldade prática: o retorno
0.0pode significar “valor real zero” ou “propriedade não disponível”.
Como garantir a validade do retorno
O padrão é envolver a chamada em uma checagem de bool:
| Código | Explicação |
|---|---|
double spread; if(SymbolInfoDouble(_Symbol, SYMBOL_SPREAD, spread)) Print("Spread: ", spread); else Print("Falha ao ler spread"); | O terceiro parâmetro recebe o valor somente se a função retornar true. Caso contrário, o conteúdo de spread permanece inalterado. |
Limitações e cenários de falha
- Símbolos não inicializados (ex.: recém‑adicionados ao Market Watch) retornam
falseaté que o terminal os carregue. - Algumas propriedades são “read‑only” em modo demo, gerando
0.0mesmo comtruecomo retorno. - Em períodos de alta volatilidade, o valor pode mudar entre a chamada e o próximo cálculo, exigindo bloqueio de dados ou re‑leitura imediata.
Exemplo prático de ajuste dinâmico de lote
Imagine uma EA que quer arriscar 0,5% do capital por ponto, mas o tick size varia entre pares. O código abaixo ilustra a lógica completa:
double tickSize; if(!SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tickSize)) return; // aborta se não houver tick size double riskPct = 0.005; double account = AccountInfoDouble(ACCOUNT_BALANCE); double lot = (account * riskPct) / (tickSize * 10); // 10 = margem de segurança lot = NormalizeDouble(lot, 2); // ajusta ao passo de lote Print("Lote calculado: ", lot); FAQ rápido
- Posso usar SymbolInfoDouble() dentro de OnTick? Sim, mas faça-o apenas quando precisar atualizar parâmetros críticos; chamadas excessivas podem degradar a performance.
- E se a propriedade for inteira? Use
SymbolInfoInteger(); misturar tipos gera erro de compilação. - Existe alternativa mais rápida?
CopyRates()traz preços históricos em lote, mas não substitui a leitura de propriedades específicas.
Para quem ainda duvida se vale a pena investir tempo na implementação correta, vale lembrar que a documentação oficial da MetaTrader detalha cada constante e suas particularidades. Dominar SymbolInfoDouble() pode transformar um script rústico em uma ferramenta de negociação responsiva e economicamente eficiente.
Primeiros passos após abrir o MetaEditor
- Crie um novo Expert Advisor (arquivo
.mq5) e inclua#property strictpara evitar warnings. - No início do
OnInit(), declare a variável que armazenará o valor desejado:
double lotSize;Com isso, o ambiente já está pronto para receber chamadas de SymbolInfoDouble().
Configuração inicial – quais propriedades podem ser lidas?
| Constante | Descrição | Tipo de retorno |
|---|---|---|
| SYMBOL_TRADE_TICK_VALUE | Valor do tick em moeda da conta | double |
| SYMBOL_TRADE_TICK_SIZE | Tamanho do tick (ponto mínimo) | double |
| SYMBOL_VOLUME_MIN | Lote mínimo permitido | double |
| SYMBOL_VOLUME_MAX | Lote máximo permitido | double |
| SYMBOL_MARGIN_INITIAL | Margem inicial requerida | double |
Essas constantes são usadas como primeiro argumento da função. O segundo argumento indica o símbolo (ex.: "EURUSD").
Rotina recomendada – como integrar no ciclo de negociação
- OnInit(): verifique se o símbolo está disponível.
if(!SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE,lotSize)) { Print("Erro ao ler ticker: ",GetLastError()); return(INIT_FAILED); }- OnTick(): ajuste o tamanho da posição com base no risco.
double riskPct=0.02; // 2% da conta double accountEquity=AccountInfoDouble(ACCOUNT_EQUITY); double stopLossPips=30; double tickValue=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); double lot= (accountEquity*riskPct)/(stopLossPips*tickValue); lot=NormalizeDouble(lot,2); if(lotSymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX)) lot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX); Esse bloco garante que o EA nunca ultrapasse limites predefinidos.
Checklist operacional – evitar erros comuns
- ✅ Confirmar
_Symbolestá habilitado para negociação (SYMBOL_TRADE_MODE). - ✅ Normalizar todos os valores com
NormalizeDouble()antes de enviar ordens. - ✅ Tratar
GetLastError()sempre queSymbolInfoDouble()retornarFALSE. - ✅ Verificar se o spread atual não supera o
SYMBOL_TRADE_TICK_SIZEmultiplicado por 10 (indicador de alta volatilidade).
Fluxograma simplificado – da leitura ao envio da ordem
[Início OnTick] → [Ler TickValue] → [Calcular Lote] → [Validar Limites] → [Abrir Ordem] → [Log Resultado] → [Fim]
FAQ rápido
- Posso usar o mesmo código para múltiplos símbolos? Sim. Basta substituir
_SymbolporsymbolNamepassado como parâmetro. - O que acontece se o símbolo não suportar
SYMBOL_TRADE_TICK_VALUE? A função retornaFALSE. Trate o erro e, se necessário, use um valor padrão. - Existe diferença entre
SymbolInfoDouble()eSymbolInfoInteger()? Sim. A primeira lida com valores de ponto flutuante; a segunda, com inteiros (ex.: número de dígitos).
Com esse fluxo, você transforma a leitura de propriedades em decisões de risco automatizadas, reduzindo a margem de erro humano e acelerando a curva de aprendizagem. Para aprofundar, consulte a documentação oficial da MQL5 e experimente variações de riskPct em contas demo antes de migrar para produção.
Perfil Ideal e Limitações Práticas de Quem Usa SymbolInfoDouble() em MQL5
Se você vive de decisões baseadas em preços exatos – scalper, market‑maker ou desenvolvedor de robôs de alta frequência – SymbolInfoDouble() pode ser a ponta de lança do seu arsenal. Se, ao contrário, sua estratégia opera em bases de tempo amplas ou utiliza apenas indicadores simples, o ganho real será mínimo.
Quem realmente tira proveito
- Programadores que precisam de precisão de ponto (pips, ticks ou frações de ponto) para cálculo de stops, limites e trailing stops.
- Operadores que trabalham com multi‑symbol em contas de alta volatilidade, onde o spread e o tick‑size variam entre ativos.
- Desenvolvedores que integram dados de corretoras diferentes e exigem valores de
SYMBOL_TRADE_TICK_SIZEouSYMBOL_SWAP_LONGem tempo real.
Quem pode ficar frustrado
- Traders que utilizam apenas estratégias de “buy‑and‑hold” e não mexem em níveis de preço dentro do código.
- Iniciantes que ainda não dominam a hierarquia de funções de mercado; a curva de aprendizado de SymbolInfoDouble() inclui entender tipos de dado, constantes de enum e tratamento de erros.
- Quem opera exclusivamente em plataformas que já expõem esses valores como variáveis globais (ex.: alguns brokers que mostram tick‑size em interface).
Limitações contextuais
- Depende da disponibilidade da informação no broker. Alguns símbolos retornam
0.0para propriedades não suportadas (ex.: swap em contas islâmbicas). - Não há cache interno; cada chamada dispara uma consulta ao servidor – usar em laços intensos pode degradar performance.
- Valores são “snapshot” no momento da chamada; alterações de spread ou tick‑size durante a execução requerem nova invocação.
FAQ rápido
| Pergunta | Resposta |
|---|---|
| Preciso fechar e reabrir o terminal para atualizar valores? | Não. Basta chamar novamente SymbolInfoDouble() quando precisar da informação mais recente. |
| É seguro usar em scripts de 1‑second? | É, mas recomenda‑se limitar chamadas a propriedades críticas (tick‑size, spread) e armazenar em variáveis locais. |
| Como detectar erro? | Verifique se o retorno é NaN ou 0.0 e use GetLastError() para detalhes. |
Checklist de decisão editorial
- Preciso de precisão < 0,0001 de preço? – Sim → avança.
- Seu código já faz múltiplas chamadas ao servidor por tick? – Reavalie ou cache resultados.
- O broker oferece suporte total às propriedades que você quer? – Teste com SymbolInfoDouble() antes de lançar.
Mini cenários reais
Scenario 1: Um EA de breakout que calcula stop‑loss em 1,5 × tick‑size. Sem SymbolInfoDouble(), o valor seria hard‑coded e perderia adaptabilidade ao mudar de Forex para CFDs.
Scenario 2: Um script de análise que apenas plota SMA. SymbolInfoDouble() é sobremesa; o esforço extra pode ser descartado.
Observações finais e próximos passos
O juízo de valor final: SymbolInfoDouble() é indispensável para quem exige precisão dinâmica e opera em ambientes multi‑ativo. Não é um recurso “must‑have” para estratégias estáticas, e seu uso indiscriminado pode inflar a latência do EA. Avalie a necessidade de atualização em tempo real, teste a resposta do seu broker e, se tudo estiver alinhado, integre a função com um mecanismo de cache simples. Para quem ainda não se aventurou, comece com um pequeno protótipo que verifica apenas SYMBOL_TRADE_TICK_SIZE e expanda a partir daí.



