Cursos Para Traders Estratégias Trader Guia Técnico: Como usar SymbolInfoDouble() no MQL5 na prática

Guia Técnico: Como usar SymbolInfoDouble() no MQL5 na prática

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.0 pode 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ódigoExplicaçã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 false até que o terminal os carregue.
  • Algumas propriedades são “read‑only” em modo demo, gerando 0.0 mesmo com true como 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 strict para 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?

ConstanteDescriçãoTipo de retorno
SYMBOL_TRADE_TICK_VALUEValor do tick em moeda da contadouble
SYMBOL_TRADE_TICK_SIZETamanho do tick (ponto mínimo)double
SYMBOL_VOLUME_MINLote mínimo permitidodouble
SYMBOL_VOLUME_MAXLote máximo permitidodouble
SYMBOL_MARGIN_INITIALMargem inicial requeridadouble

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

  1. 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); }
  1. 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 _Symbol está habilitado para negociação (SYMBOL_TRADE_MODE).
  • ✅ Normalizar todos os valores com NormalizeDouble() antes de enviar ordens.
  • ✅ Tratar GetLastError() sempre que SymbolInfoDouble() retornar FALSE.
  • ✅ Verificar se o spread atual não supera o SYMBOL_TRADE_TICK_SIZE multiplicado 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 _Symbol por symbolName passado como parâmetro.
  • O que acontece se o símbolo não suportar SYMBOL_TRADE_TICK_VALUE? A função retorna FALSE. Trate o erro e, se necessário, use um valor padrão.
  • Existe diferença entre SymbolInfoDouble() e SymbolInfoInteger()? 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_SIZE ou SYMBOL_SWAP_LONG em 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.0 para 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

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

Acesse o guia completo

Deixe uma resposta

Related Post