Na prática, quem mexe com a API de negociação de MetaTrader percebe que ENUM_SYMBOL_INFO_INTEGER não é só mais um enum. Ele decide o que pode ser lido de forma segura sobre um símbolo – spread, volume mínimo, taxa de swap – e, ao mesmo tempo, bloqueia quem tenta acessar campos que só existem em versões mais novas do terminal. O ponto de dor costuma ser a falta de exemplos claros: o desenvolvedor sabe que precisa chamar SymbolInfoInteger(), mas não tem certeza de quais valores são válidos nem de como tratar retornos inesperados.
Quando usar ENUM_SYMBOL_INFO_INTEGER na vida real
- Construindo um scanner de oportunidades. Você quer filtrar pares que tenham digits igual a 5 e trade allowed ativo. O enum fornece os IDs exatos (por exemplo,
SYMBOL_DIGITSeSYMBOL_TRADE_ALLOWED). - Validando parâmetros antes de abrir ordens. Se o
SYMBOL_TRADE_EXEMODEindicar “no market”, aborta o trade para evitar rejeição. - Gerando relatórios de risco. Extrair
SYMBOL_TRADE_TICK_VALUEeSYMBOL_TRADE_TICK_SIZEajuda a calcular o valor de cada ponto.
Passo a passo com código comentado
| Etapa | Trecho | Observação |
|---|---|---|
| 1 | int digits = 0; if(!SymbolInfoInteger(_Symbol, SYMBOL_DIGITS, digits)) Print("Falha ao ler dígitos"); | Retorno false indica que o símbolo não está disponível ou que o enum não existe na build atual. |
| 2 | long tradeAllowed = 0; if(SymbolInfoInteger(_Symbol, SYMBOL_TRADE_ALLOWED, tradeAllowed) && tradeAllowed) Print("Negociação permitida"); | Mesmo que o enum exista, o valor pode ser 0 (não permitido). Verifique ambos. |
| 3 | ulong swapLong = 0; if(!SymbolInfoInteger(_Symbol, SYMBOL_SWAP_LONG, swapLong)) Print("Swap longo indisponível – possivelmente versão antiga"); | Um caso contra‑intuitivo: a ausência de SYMBOL_SWAP_LONG não significa que o swap é zero; pode ser que o terminal não suporte o campo ainda. |
Limitações e armadilhas comuns
O enum só aceita int ou ulong como tipo de retorno. Tentar ler um campo que realmente armazena um double (como SYMBOL_TRADE_TICK_VALUE) provocará truncamento e resultados absurdos. Além disso, alguns IDs são “deprecated” em versões recentes; usar SYMBOL_SPREAD_FLOAT em um terminal que ainda só aceita inteiros gera ERR_INVALID_PARAMETER.
Como driblar falhas inesperadas
- Cheque
GetLastError()logo após cada chamada. Erros 4100‑4105 apontam para enum não suportado. - Implemente fallback: se
SYMBOL_SWAP_LONGfalhar, recorra aSymbolInfoDouble()comSYMBOL_SWAP_LONG(alguns builds ainda aceitam). - Use documentação oficial da MQL5 como referência de versão; ela lista quais enums foram introduzidos em cada release.
Próximo passo prático
Monte um pequeno script que percorra todos os símbolos do seu servidor, colete SYMBOL_TRADE_ALLOWED, SYMBOL_DIGITS e SYMBOL_TRADE_TICK_VALUE, e armazene em um CSV. Essa rotina simples revela imediatamente quais pares são descartáveis por falta de liquidez ou por restrições de negociação – informação que, em muitos casos, economiza horas de backtesting.
Depois de instalar a biblioteca que contém ENUM_SYMBOL_INFO_INTEGER, o primeiro passo é mapear os símbolos que serão monitorados. Cada símbolo tem um identificador inteiro que pode ser recuperado via SymbolInfoInteger(). Abaixo, a lista completa das propriedades disponíveis:
| Propriedade | Descrição | Tipo |
|---|---|---|
| SYMBOL_TRADE_TICK_VALUE | Valor do tick em moeda base | double |
| SYMBOL_TRADE_TICK_SIZE | Tamanho mínimo de variação de preço | double |
| SYMBOL_VOLUME_MIN | Lote mínimo negociável | int |
| SYMBOL_VOLUME_MAX | Lote máximo negociável | int |
| SYMBOL_SPREAD | Spread atual em pontos | int |
| SYMBOL_TRADE_MODE | Modo de negociação (0=Desativado, 1=Ativo) | int |
Configuração inicial – checklist rápido
- 1. Definir lista de símbolos: crie um array
string symbols[] = {"EURUSD","GBPJPY","USDJPY"}; - 2. Carregar IDs: para cada símbolo, chame
int id = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);e armazene em ummapoudictionary. - 3. Validar disponibilidade: se
id == 0, o símbolo está desativado – remova da lista. - 4. Configurar timer: use
EventSetTimer(1);para atualizar valores a cada segundo. - 5. Testar em modo visual: rode o script no MetaEditor em modo “Strategy Tester” antes de colocar em produção.
Rotina recomendada – fluxo de trabalho diário
1️⃣ Início da sessão: execute a função InitSymbols() que preenche o dicionário de IDs e verifica limites de volume. 2️⃣ Loop de monitoramento: dentro de OnTimer(), recupere SYMBOL_SPREAD e SYMBOL_TRADE_TICK_VALUE para cada ativo. 3️⃣ Filtro de oportunidades: aplique regras simples, por exemplo, if(spread < 2 && tickValue > 0.1) signal = true;. 4️⃣ Execução de ordem: chame OrderSend() somente quando signal for true e o volume estiver dentro de SYMBOL_VOLUME_MIN e SYMBOL_VOLUME_MAX. 5️⃣ Fechamento: ao final do dia, salve um log CSV com FileWrite() contendo timestamp, símbolo, spread e resultado da ordem.
Erros comuns e como evitá‑los
- Uso de IDs desatualizados: sempre recarregue o dicionário após eventos de reconexão ou mudança de sessão.
- Ignorar o modo de negociação:
SYMBOL_TRADE_MODEpode mudar para 0 durante manutenção; verifique antes de enviar ordens. - Overflow de volume: ao somar múltiplas posições, some os volumes e compare com
SYMBOL_VOLUME_MAXpara evitar rejeição. - Timer excessivo: intervalos menores que 500 ms podem sobrecarregar o servidor; mantenha 1 s ou mais.
Mini‑dashboard de progresso (texto)
| Indicador | Status | Meta |
|---|---|---|
| Sinais gerados | 12 | ≥ 20/dia |
| Ordens executadas | 8 | ≥ 15/dia |
| Taxa de acerto | 66 % | ≥ 70 % |
| Tempo médio de resposta | 0.9 s | ≤ 1 s |
Monitorar esses números diariamente permite ajustar parâmetros antes que pequenos desvios se tornem perdas significativas.
Habitos complementares para acelerar resultados
• Revisar o log ao final de cada sessão e anotar padrões de spread.
• Atualizar a lista de símbolos semanalmente, removendo ativos com volume insuficiente.
• Integrar alertas por e‑mail ou Telegram usando SendNotification() para sinais críticos.
Seguindo esse roadmap, a implementação de ENUM_SYMBOL_INFO_INTEGER evolui de um simples mapeamento para um motor de decisões robusto, pronto para escalar conforme a carteira cresce.
Perfil ideal e limitações práticas do ENUM_SYMBOL_INFO_INTEGER
Quem trabalha com desenvolvimento de indicadores personalizados no MetaTrader 5 e precisa de acesso direto a valores numéricos de símbolos deve considerar seriamente o ENUM_SYMBOL_INFO_INTEGER. Não é brinquedo para quem apenas consulta preços.
Quem realmente ganha com esse enum
- Programadores de EAs avançados que manipulam margens, limites de lote e alavancagem via
SymbolInfoInteger; - Analistas quantitativos que constroem bancos de dados de propriedades de ativos para back‑testing de estratégias multi‑mercado;
- Consultores de risco que precisam validar parâmetros de negociação em tempo real antes de abrir posições.
Quem provavelmente vai desperdiçar tempo
- Traders de varejo que só fazem scalping visual e nunca mexem em código;
- Desenvolvedores iniciantes que ainda não dominam o conceito de enumerações em MQL5;
- Quem espera que o enum retorne valores de indicadores técnicos (ele não faz isso).
Limitações contextuais que não podem ser ignoradas
O ENUM_SYMBOL_INFO_INTEGER só entrega informações já disponíveis no cache interno do servidor. Se o corretor restringe a exposição de certos atributos (ex.: SYMBOL_TRADE_MODE para contas de demonstração), o retorno será NULL ou -1. Além disso, o acesso tem latência mínima, mas não é instantâneo; usar em loops de alta frequência pode gerar “overhead” perceptível.
FAQ rápido
| Pergunta | Resposta |
|---|---|
| Posso usar para obter o spread? | Não. Use SymbolInfoDouble com SYMBOL_SPREAD. |
| O enum funciona em contas de demonstração? | Parcialmente; alguns campos são bloqueados. |
| Qual a melhor prática de checagem? | Teste sempre o retorno contra -1 antes de usar. |
Checklist de aderência
- Já conhece
SymbolInfoInteger()? - Precisa de valores inteiros (não flutuantes) de propriedades de símbolos?
- Seu corretor fornece acesso total aos atributos de símbolo?
- Tem familiaridade com tratamento de erros em MQL5?
Parecer editorial
Em termos de custo‑benefício, o ENUM_SYMBOL_INFO_INTEGER se mostra indispensável para profissionais que constroem infraestruturas de negociação automatizada robustas. Não há “magia” escondida; ele simplesmente abre a porta para leitura de parâmetros críticos, sem nenhum recurso extra. Se você se encaixa no perfil acima, a expectativa realista é ganhar precisão de configuração e reduzir bugs de inicialização de EAs. Se seu nível ainda é básico, o investimento de tempo na curva de aprendizagem supera o ganho imediato.
Próximos passos: implemente um módulo de validação que capture -1 e registre fallback; depois, experimente combinar com ENUM_SYMBOL_INFO_DOUBLE para cobrir o espectro completo de atributos.



