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

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

Quando você está programando um Expert Advisor ou um script no MetaTrader 5, a maior dor de cabeça costuma ser obter dados precisos sobre o símbolo que está sendo negociado, sem precisar recorrer a múltiplas chamadas ou a cálculos manuais. SymbolInfoDouble() surge como a solução direta, mas, na prática, seu uso pode gerar surpresas – valores inesperados, tipos de dados incompatíveis e até falhas silenciosas que atrapalham a lógica de entrada e saída.

O que a função realmente entrega

  • Tipo de retorno: double – número de ponto flutuante com precisão de 15 casas.
  • Parâmetro obrigatório: symbol (string) – nome do ativo, por exemplo “EURUSD”.
  • Parâmetro opcional: property_id (ENUM_SYMBOL_INFO_DOUBLE) – identifica a propriedade desejada.

Tabela resumida de propriedades mais usadas

property_idDescriçãoValor típico
SYMBOL_BIDPreço de compra (bid)1.23456
SYMBOL_ASKPreço de venda (ask)1.23478
SYMBOL_POINTTamanho do ponto0.00001
SYMBOL_TRADE_TICK_VALUEValor de um tick0.1
SYMBOL_VOLUME_MINLote mínimo negociável0.01

Como usar na prática – passo a passo

  • 1. Verifique se o símbolo está disponível: if(!SymbolInfoDouble(_Symbol, SYMBOL_BID, bid)) return;
  • 2. Armazene o valor em uma variável local – evite chamar a função repetidamente dentro de loops de cálculo.
  • 3. Converta o ponto para pips quando necessário: double pips = bid / SymbolInfoDouble(_Symbol, SYMBOL_POINT);
  • 4. Trate o retorno FALSE como falha de leitura (por exemplo, símbolo inexistente ou mercado fechado).

Casos de uso críticos

  • Gestão de risco baseada em stop‑loss dinâmico: use SYMBOL_TRADE_TICK_VALUE para calcular o valor monetário de cada ponto e dimensionar o lote.
  • Filtragem de ativos com spread elevado: compare SYMBOL_ASK - SYMBOL_BID e descarte pares acima de um limiar predefinido.
  • Construção de indicadores personalizados: obtenha SYMBOL_VOLUME_MIN para validar a viabilidade de estratégias de scalping.

Limitações e armadilhas

  • Algumas propriedades retornam NaN em sessões de pré‑abertura; teste sempre com !DoubleIsNaN().
  • O valor de SYMBOL_POINT pode mudar após eventos de ajuste de dígitos (ex.: 5‑digit para 3‑digit). Atualize o cache sempre que mudar de timeframe.
  • Não confunda SYMBOL_TRADE_TICK_VALUE com SYMBOL_TRADE_TICK_SIZE – o primeiro é monetário, o segundo é em pontos.

Funções relacionadas que complementam

  • SymbolInfoInteger() – para propriedades inteiras como número de dígitos.
  • SymbolSelect() – garante que o símbolo esteja carregado antes de chamar SymbolInfoDouble().
  • MarketInfo() (MQL4) – equivalente legado, útil ao migrar código antigo.

Em resumo, SymbolInfoDouble() é o atalho para dados críticos, mas só entrega valor quando você controla o fluxo de erros e mantém o cache atualizado. Teste cada propriedade em ambiente de demonstração antes de colocar a lógica em produção, e você evitará surpresas que costumam custar tempo e dinheiro.

Configuração inicial e primeiros passos

Abra o MetaEditor, crie um novo .mq5 e inclua a biblioteca padrão. Não há dependências externas; a única chamada necessária é SymbolInfoDouble(). Defina o símbolo que será analisado, por exemplo "EURUSD", e verifique se o mercado está aberto antes de solicitar dados.

EtapaAçãoResultado esperado
1Declarar string symbol = "EURUSD";Variável pronta para uso em todas as chamadas.
2Checar SymbolInfoInteger(symbol,SYMBOL_SELECT)Retorna true se o ativo está disponível.
3Invocar double spread = SymbolInfoDouble(symbol,SYMBOL_SPREAD);Obtém o spread atual em pontos.

Checklist operacional – uso diário da função

  • Verificar disponibilidade: SymbolInfoInteger(symbol,SYMBOL_TRADE_MODE) deve ser TRADE_MODE_ALLOWED.
  • Selecionar propriedade correta: Consulte a tabela de propriedades para escolher entre SYMBOL_BID, SYMBOL_ASK, SYMBOL_VOLUME, etc.
  • Tratar valores nulos: Se a função retornar EMPTY_VALUE, implemente fallback ou log de erro.
  • Atualizar a cada tick: Chame a função dentro de OnTick() para manter dados em tempo real.

Exemplo prático – cálculo de risco por ponto

O código abaixo demonstra como combinar SymbolInfoDouble() com a lot size para obter o valor monetário de um ponto.

void OnTick() { string sym = _Symbol; double point = SymbolInfoDouble(sym,SYMBOL_POINT); double lotSize = 0.01; // exemplo fixo double tickVal = SymbolInfoDouble(sym,SYMBOL_TRADE_TICK_VALUE); double riskPerPoint = lotSize * tickVal / point; Print("Risco por ponto: ",DoubleToString(riskPerPoint,Digits)); } 

Resultado: um valor numérico que pode ser usado diretamente nos cálculos de stop‑loss e take‑profit.

Fluxograma simplificado – decisão de entrada

O fluxo abaixo ajuda a integrar SymbolInfoDouble() ao algoritmo de disparo de ordens.

PassoCondiçãoAção
1Spread ≤ 2 pips?Prosseguir
2Volatilidade (ATR) < 0.0015?Continuar
3Preço atual ≥ SMA(20)?Enviar ordem de compra
4SenãoAbortar e registrar motivo

Erros comuns e como evitá‑los

  • Usar propriedades inexistentes: O compilador aceita qualquer constante, mas a chamada retornará EMPTY_VALUE. Sempre consulte a documentação oficial.
  • Ignorar o modo de negociação: Em símbolos “Closed” a função ainda devolve valores, porém ordens são rejeitadas. Verifique SYMBOL_TRADE_MODE.
  • Confundir ponto e pip: SYMBOL_POINT representa a menor variação de preço; SYMBOL_PIPSIZE pode ser necessário para pares com 5 casas decimais.

Rotina semanal de otimização

Reserve 30 minutos ao final de cada semana para validar os parâmetros que você está lendo.

  1. Exportar SymbolInfoDouble() para CSV (use FileWrite()).
  2. Comparar spreads médios da semana com o histórico.
  3. Ajustar SYMBOL_TRADE_TICK_VALUE se houver mudança de corretora.
  4. Atualizar o checklist acima e versionar o script.

Perfil ideal e limitações de quem usa SymbolInfoDouble()

Se você é desenvolvedor MQL5 que precisa extrair valores numéricos de símbolos em tempo real, este recurso pode virar seu braço direito. Não é para quem procura “arrumar a casa” com funções genéricas de string ou quer operar só no modo back‑test.

Quem realmente se beneficia

  • Traders algoritmicos que constroem indicadores ou EA baseados em spreads, taxas de swap ou margem mínima.
  • Analistas que precisam comparar rapidamente bid/ask de múltiplos pares sem disparar requisições de rede.
  • Desenvolvedores que já rodam loops de 1‑segundo e não podem perder milissegundos por chamadas excessivas.

Quem não terá bom aproveitamento

  • Iniciantes que ainda não dominam tipos de dados MQL5 – a função exige que você trate double e int de forma explícita.
  • Usuários que operam exclusivamente em modo teste offline – o valor retornado costuma ser 0.0 sem conexão ao servidor.
  • Quem espera que a função cuide de “conversão de moeda” automática; ela só devolve o número bruto.

Limitações práticas

SymbolInfoDouble() não lança exceções; falha silenciosa devolve EMPTY_VALUE. Cabe ao programador checar if(value==EMPTY_VALUE). Além disso, alguns atributos (ex.: SYMBOL_TRADE_TICK_VALUE) só ficam disponíveis após o símbolo estar “ativo” no MarketWatch. Em contas com frequência de atualização limitada (p.ex., contas de corretoras de baixa latência), o retorno pode ficar defasado em até 2‑3 ticks.

Perguntas frequentes (FAQ)

PerguntaResposta
Posso usar dentro de OnTimer?Sim, desde que o timer não ultrapasse o limite de chamadas por segundo da corretora (geralmente 50‑100).
Existe diferença entre 32‑bit e 64‑bit?O tipo double tem a mesma precisão, mas a memória alocada pode variar; nada que altere o resultado.
O que fazer se receber EMPTY_VALUE?Verificar se o símbolo está habilitado no MarketWatch ou se o parâmetro passado está correto (ex.: SYMBOL_VOLUME_MIN).

Checklist rápido antes de apostar

  • ✔️ Símbolo já adicionado ao MarketWatch.
  • ✔️ Parâmetro de atributo correto (consultar a lista oficial).
  • ✔️ Tratamento de EMPTY_VALUE implementado.
  • ✔️ Loop de chamada dentro do limite de taxa da corretora.

Parecer editorial equilibrado

Na prática, SymbolInfoDouble() entrega exatamente o que promete: um número de ponto flutuante em alta velocidade. Para programadores que já têm familiaridade com o ecossistema MQL5, a curva de aprendizado é mínima. Mas para quem ainda está no estágio “primeiros passos”, a função pode gerar frustração por falta de mensagens de erro claras.

Se o seu projeto exige precisão instantânea de preços, spreads ou margem, adote-a. Caso seu foco seja mais didático ou teste de estratégias em histórico sem conexão ao broker, mantenha‑a em reserva.

Próximo passo: teste a função em um script simples, capture o retorno e valide contra o painel de negociação. Se tudo bater, integre‑a ao seu EA; se não, avalie alternativas como CopyRates() ou chamadas diretas ao SymbolInfoInteger() para atributos não‑numéricos.

Acessar documentação oficial

Deixe uma resposta

Related Post