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_id | Descrição | Valor típico |
|---|---|---|
| SYMBOL_BID | Preço de compra (bid) | 1.23456 |
| SYMBOL_ASK | Preço de venda (ask) | 1.23478 |
| SYMBOL_POINT | Tamanho do ponto | 0.00001 |
| SYMBOL_TRADE_TICK_VALUE | Valor de um tick | 0.1 |
| SYMBOL_VOLUME_MIN | Lote mínimo negociável | 0.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
FALSEcomo 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_VALUEpara calcular o valor monetário de cada ponto e dimensionar o lote. - Filtragem de ativos com spread elevado: compare
SYMBOL_ASK - SYMBOL_BIDe descarte pares acima de um limiar predefinido. - Construção de indicadores personalizados: obtenha
SYMBOL_VOLUME_MINpara validar a viabilidade de estratégias de scalping.
Limitações e armadilhas
- Algumas propriedades retornam
NaNem sessões de pré‑abertura; teste sempre com!DoubleIsNaN(). - O valor de
SYMBOL_POINTpode 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_VALUEcomSYMBOL_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 chamarSymbolInfoDouble().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.
| Etapa | Ação | Resultado esperado |
|---|---|---|
| 1 | Declarar string symbol = "EURUSD"; | Variável pronta para uso em todas as chamadas. |
| 2 | Checar SymbolInfoInteger(symbol,SYMBOL_SELECT) | Retorna true se o ativo está disponível. |
| 3 | Invocar 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 serTRADE_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.
| Passo | Condição | Ação |
|---|---|---|
| 1 | Spread ≤ 2 pips? | Prosseguir |
| 2 | Volatilidade (ATR) < 0.0015? | Continuar |
| 3 | Preço atual ≥ SMA(20)? | Enviar ordem de compra |
| 4 | Senão | Abortar 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_POINTrepresenta a menor variação de preço;SYMBOL_PIPSIZEpode 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.
- Exportar
SymbolInfoDouble()para CSV (useFileWrite()). - Comparar spreads médios da semana com o histórico.
- Ajustar
SYMBOL_TRADE_TICK_VALUEse houver mudança de corretora. - 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
doubleeintde forma explícita. - Usuários que operam exclusivamente em modo teste offline – o valor retornado costuma ser
0.0sem 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)
| Pergunta | Resposta |
|---|---|
| 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_VALUEimplementado. - ✔️ 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.

