Na prática, quem programa indicadores personalizados no MetaTrader 5 logo de cara se depara com a função ENUM_SYMBOL_INFO_DOUBLE. Ela promete acesso direto a valores numéricos de um ativo – preço médio, spread, margem – mas, sem entender a assinatura correta, o código trava ou devolve zeros misteriosos. O ponto de dor mais comum é confundir o tipo de dado esperado (double) com o identificador da propriedade (enum) e ainda esquecer de checar o retorno da chamada.
Quando usar?
Use EnumSymbolInfoDouble sempre que precisar de um valor de ponto flutuante que o servidor mantém em tempo real, como Bid, Ask ou Point. É ideal em estratégias de scalping que dependem de precisão de 1/10.000 de ponto, ou em scripts de risco que calculam margem disponível antes de abrir posições.
Assinatura da função
| Parâmetro | Tipo | Descrição |
|---|---|---|
| symbol | string | Nome do ativo (ex.: “EURUSD”) |
| prop_id | ENUM_SYMBOL_INFO_DOUBLE | Identificador da propriedade desejada |
| value | double& | Variável que receberá o resultado |
Exemplo rápido – obtendo o spread
- Declare a variável:
double spread; - Chame a função:
if(SymbolInfoDouble("EURUSD", SYMBOL_SPREAD, spread)) - Use o valor:
Print("Spread atual: ", spread);
Se a chamada falhar, spread permanece inalterado. Por isso, o if é obrigatório – ele evita que seu algoritmo siga com um zero que, na prática, pode gerar ordens errôneas.
Armadilhas frequentes
- Confundir enums.
SYMBOL_BIDeSYMBOL_ASKpertencem a ENUM_SYMBOL_INFO_DOUBLE, masSYMBOL_TRADE_TICK_SIZEestá em ENUM_SYMBOL_INFO_INTEGER. Misturar gera falha silenciosa. - Negligenciar o fuso horário. O preço retornado está em tempo de servidor, não no seu relógio local. Em sessões de alta volatilidade, um atraso de segundos pode mudar o spread de 1,2 para 3,4 pontos.
- Limite de chamadas. O terminal impõe um teto de 1000 consultas por segundo. Em loops intensos, agrupe leituras ou use
CopyRatespara batch.
Quando a função falha?
Se o símbolo não existir ou estiver offline, o retorno é false. Em backtests, símbolos de dados históricos que não possuem informação de margem retornam zero, apesar de o if indicar sucesso. Teste sempre em ambiente real antes de confiar no número.
Aplicação prática – ajuste de stop‑loss dinâmico
Imagine um robô que abre uma compra e, a cada tick, reposiciona o stop‑loss a 1,5×SYMBOL_POINT abaixo do preço de entrada. O código ficaria:
double point; if(SymbolInfoDouble(_Symbol, SYMBOL_POINT, point)) { double sl = OrderOpenPrice() - 1.5 * point; OrderModify(OrderTicket(), OrderOpenPrice(), sl, 0, 0); } Sem a verificação, point poderia ser zero, resultando em um stop‑loss fixo que nunca se move – exatamente o que traders experientes temem.
Link de referência
Para detalhes completos da enumeração, consulte a documentação oficial da MQL5. Ela traz a lista exaustiva de propriedades e exemplos de uso avançado.
Próximo passo: implemente a leitura de SYMBOL_TRADE_TICK_VALUE em seu cálculo de tamanho de lote. A precisão extra pode salvar 0,5% do capital em mercados de alta frequência.
Configuração inicial de ENUM_SYMBOL_INFO_DOUBLE
Após incluir o cabeçalho da API, declare a variável que receberá o enum:
ENUM_SYMBOL_INFO_DOUBLE infoType = SYMBOL_BID;Em seguida, associe‑a ao símbolo desejado usando SymbolInfoDouble():
double bid = 0.0; if(!SymbolInfoDouble(_Symbol, infoType, bid)) Print("Falha ao obter BID: ", GetLastError());O retorno true garante que bid contém o preço de compra atual.
Tabela de propriedades suportadas
| Enum | Descrição | Tipo de retorno |
|---|---|---|
| SYMBOL_BID | Preço de compra (Bid) | double |
| SYMBOL_ASK | Preço de venda (Ask) | double |
| SYMBOL_POINT | Tamanho do ponto | double |
| SYMBOL_TRADE_TICK_VALUE | Valor do tick | double |
| SYMBOL_TRADE_TICK_SIZE | Tamanho do tick | double |
| SYMBOL_VOLUME_MIN | Lote mínimo negociável | double |
| SYMBOL_VOLUME_MAX | Lote máximo negociável | double |
| SYMBOL_VOLUME_STEP | Incremento de lote | double |
Checklist operacional – primeira hora de uso
- 1. Verificar conexão:
ConnectionStatus()deve retornarCONNECTION_OK. - 2. Testar um enum básico: obter
SYMBOL_BIDe confirmar que o valor > 0. - 3. Log de erro padrão: implementar
Print("Erro: ", GetLastError())logo após cada chamada. - 4. Salvar valores críticos: grave
Bid,AskePointem umstructpara uso posterior. - 5. Validar limites de lote: compare
VolumeMin,VolumeMaxeVolumeStepantes de enviar ordens.
Rotina recomendada para traders iniciantes
1. Coleta diária: no início de cada sessão, execute um script que preencha um array com os valores de SYMBOL_BID, SYMBOL_ASK e SYMBOL_POINT.
2. Validação de consistência: se a diferença entre Bid e Ask for maior que 5 × Point, dispare um alerta.
3. Atualização de parâmetros de risco: ajuste o tamanho de lote usando a fórmula (AccountFreeMargin * risco%) / (SYMBOL_TRADE_TICK_VALUE * 10).
4. Execução de ordem: utilize OrderSend() somente após confirmar que VolumeMin ≤ lote ≤ VolumeMax e que (lote - VolumeMin) % VolumeStep == 0.
Erros comuns e como evitá‑los
- Erro 4107 – Enum desconhecido: acontece quando o enum não corresponde ao símbolo ativo. Sempre passe
_Symbolou o nome exato do ativo. - Erro 4108 – Valor nulo: indica que o símbolo não possui a propriedade requisitada (ex.:
SYMBOL_TRADE_TICK_VALUEem ativos sem tick). UseSymbolInfoInteger()para checar a existência antes. - Erro 4109 – Falha de memória: evita‑lo alocando variáveis estáticas ou globais ao invés de criar objetos dentro de loops intensos.
Mini dashboard de progresso (texto)
| Dia | Bid médio | Ask médio | Erros detectados |
|---|---|---|---|
| 1 | 1.2345 | 1.2348 | 0 |
| 2 | 1.2350 | 1.2353 | 1 (4108) |
| 3 | 1.2362 | 1.2365 | 0 |
Atualize a tabela ao final de cada dia. A visualização rápida ajuda a identificar padrões de erro e a calibrar os parâmetros de lote.
Próximo passo – integração com biblioteca de indicadores
Combine os valores de ENUM_SYMBOL_INFO_DOUBLE com indicadores de volatilidade (ATR, Bollinger) para criar gatilhos de entrada mais precisos. A estratégia de “spread máximo” pode ser implementada em menos de 30 linhas de código, mantendo a legibilidade e a robustez.
Perfil ideal e limitações práticas de “Como utilizar ENUM_SYMBOL_INFO_DOUBLE”
Quem opera MetaTrader 5 em estratégias que dependem de precisão numérica avançada tirará proveito imediato desta enumeração; quem busca um atalho para cálculos triviais ficará frustrado.
Quem deve considerar o recurso
- Desenvolvedores de EAs que extraiam dados de símbolos (volatilidade, spread médio, precisão de preço).
- Analistas quantitativos que cruzem informações de vários ativos em tempo real.
- Consultores que criam dashboards internos onde a granularidade de
ENUM_SYMBOL_INFO_DOUBLEimpacta a visualização de métricas.
Quem provavelmente não encontrará valor
- Traders iniciantes que ainda não dominam conceitos básicos de programação MQL5.
- Usuários que utilizam apenas indicadores padrão sem necessidade de personalizar parâmetros de símbolo.
- Quem opera em plataformas que não suportam MQL5 (cTrader, NinjaTrader).
Limitações contextuais
O enum só devolve valores do tipo double. Se precisar de string (nome do ativo) ou inteiro (tempo de negociação), será preciso combinar com ENUM_SYMBOL_INFO_STRING ou ENUM_SYMBOL_INFO_INTEGER. Além disso, algumas propriedades (por exemplo, SYMBOL_TRADE_TICK_VALUE) podem retornar NaN em ativos com negociação suspensa, exigindo tratamento de exceção.
Checklist rápido antes de adotar
- Verificar se o ativo está ativo na sessão corrente.
- Confirmar disponibilidade da propriedade desejada via
SymbolInfoDouble()(consultar documentação oficial). - Implementar fallback para valores nulos ou zero.
- Testar em modo Strategy Tester antes de mover para produção.
Mini cenários reais
Cenário A: Um robô de arbitragem precisa do SYMBOL_TRADE_TICK_VALUE de EUR/USD e GBP/USD para calibrar spreads. O ENUM entrega valores precisos em 0.00001, permitindo cálculo de lucro bruto imediato.
Cenário B: Um script de relatório semanal tenta exibir o SYMBOL_VOLUME como double; o resultado vem truncado, gerando números absurdos. O desenvolvedor percebe que volume é inteiro e migra para SymbolInfoInteger().
FAQ contextual
| Pergunta | Resposta curta |
|---|---|
| Posso usar o enum dentro de um indicador? | Sim, mas só se o indicador precisar ler parâmetros de preço em alta frequência. |
| O que acontece se a propriedade não existir? | Retorna EMPTY_VALUE (−2147483648) e gera GetLastError() 4109. |
| É compatível com MetaEditor 5.00? | Com suporte total a partir da build 2000; versões antigas podem lançar ERR_NO_RESULT. |
Parecer editorial equilibrado
Em resumo, ENUM_SYMBOL_INFO_DOUBLE é ferramenta de nicho com alto retorno para quem realmente precisa de precisão numérica ao consultar propriedades de símbolos. Não há “efeito wow” para quem apenas testa indicadores básicos. A expectativa realista: ganho de performance de 10‑20 % em algoritmos que dependem de tick‑value e spread, contanto que o código esteja preparado para valores nulos.
Próximos passos recomendados
- Baixe a documentação oficial aqui para validar cada constante.
- Implemente um wrapper que capture
GetLastError()e registre logs de falha. - Execute testes de stress com 10 000 chamadas por segundo para medir overhead.



