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

Guia Técnico: Como usar ENUM_SYMBOL_INFO_DOUBLE na prática

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âmetroTipoDescrição
symbolstringNome do ativo (ex.: “EURUSD”)
prop_idENUM_SYMBOL_INFO_DOUBLEIdentificador da propriedade desejada
valuedouble&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_BID e SYMBOL_ASK pertencem a ENUM_SYMBOL_INFO_DOUBLE, mas SYMBOL_TRADE_TICK_SIZE está 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 CopyRates para 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

EnumDescriçãoTipo de retorno
SYMBOL_BIDPreço de compra (Bid)double
SYMBOL_ASKPreço de venda (Ask)double
SYMBOL_POINTTamanho do pontodouble
SYMBOL_TRADE_TICK_VALUEValor do tickdouble
SYMBOL_TRADE_TICK_SIZETamanho do tickdouble
SYMBOL_VOLUME_MINLote mínimo negociáveldouble
SYMBOL_VOLUME_MAXLote máximo negociáveldouble
SYMBOL_VOLUME_STEPIncremento de lotedouble

Checklist operacional – primeira hora de uso

  • 1. Verificar conexão: ConnectionStatus() deve retornar CONNECTION_OK.
  • 2. Testar um enum básico: obter SYMBOL_BID e 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, Ask e Point em um struct para uso posterior.
  • 5. Validar limites de lote: compare VolumeMin, VolumeMax e VolumeStep antes 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 _Symbol ou o nome exato do ativo.
  • Erro 4108 – Valor nulo: indica que o símbolo não possui a propriedade requisitada (ex.: SYMBOL_TRADE_TICK_VALUE em ativos sem tick). Use SymbolInfoInteger() 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)

DiaBid médioAsk médioErros detectados
11.23451.23480
21.23501.23531 (4108)
31.23621.23650

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_DOUBLE impacta 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

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

Deixe uma resposta

Related Post