Quando você abre um gráfico e tenta descobrir se o ativo aceita negociação de posições negativas, quantas casas decimais tem o spread ou se o mercado está aberto, a primeira parada costuma ser a função SymbolInfoInteger(). Na prática, traders que escrevem robôs em MQL5 tropeçam nessa chamada porque ela mistura tipos de dados, requer IDs corretos e ainda devolve zero em situações silenciosas – exatamente onde a maioria dos erros de lógica aparece.
Objetivo da chamada
O método devolve um int que representa um atributo inteiro do símbolo corrente ou de outro especificado. É a porta de entrada para informações como SYMBOL_TRADE_MODE, SYMBOL_DIGITS ou SYMBOL_VOLUME_MIN. Sem ele, seu EA ficaria às cegas, forçando suposições arriscadas.
Configuração mínima
- Inclua
#include(opcional, mas ajuda na legibilidade). - Garanta que o símbolo exista:
if(!SymbolSelect(_Symbol,true)) return; - Use constantes da enum
ENUM_SYMBOL_INFO_INTEGER– elas evitam erros de digitação.
Como usar na prática
Um trecho típico para checar se o símbolo permite posições vendidas:
| Código | Explicação |
|---|---|
long tradeMode = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE); if(tradeMode==TRADE_MODE_DISABLED) Print("Operar fechado"); | Retorna o modo de negociação; TRADE_MODE_DISABLED indica que nada pode ser aberto. |
Para descobrir a precisão de preço:
int digits = (int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS); Print("Precisão: ",digits," casas decimais");Note que SymbolInfoInteger() devolve 0 tanto para valores realmente zero quanto para falha na chamada. Sempre verifique GetLastError() quando o retorno for inesperado.
Limitações e armadilhas
- Falha silenciosa: Em símbolos não carregados, a função retorna 0 sem disparar erro – o que pode gerar decisões de trading baseadas em dados falsos.
- Cache interno: O valor pode ficar desatualizado se o servidor mudar de regime (ex.: de Daylight Saving). Atualize com
RefreshRates()antes de chamar. - Tipos incompatíveis: Tentar ler um atributo que na verdade é
double(comoSYMBOL_TRADE_TICK_VALUE) retornará truncado. UseSymbolInfoDouble()nesses casos.
FAQ rápido
- “Por que meu EA não abre posições quando o spread é 0?” – Você leu
SYMBOL_SPREADcomSymbolInfoInteger(), mas ele édouble. UseSymbolInfoDouble(). - “O que fazer se GetLastError() = 4105?” – Significa “symbol not found”. Verifique o nome ou chame
SymbolSelect()novamente. - “Posso usar o mesmo código para futuros e forex?” – Sim, mas atente aos atributos específicos (ex.:
SYMBOL_TRADE_EXECUTIONvaria entre mercados).
Dominar SymbolInfoInteger() elimina boa parte da “adivinhação” na criação de EAs. Teste cada chamada em um script isolado, valide com Print() e, se quiser aprofundar, dê uma olhada na documentação oficial da MetaTrader para ver a lista completa de constantes.
Primeiros passos após instalar o MetaEditor
- Abra o MetaEditor e crie um novo Expert Advisor (EA) ou script.
- Inclua a biblioteca padrão
#includepara garantir acesso às funções de negociação. - Declare a variável que armazenará o código do símbolo:
ulong symbol_code;
Configuração inicial de SymbolInfoInteger()
| Parâmetro | Valor esperado | Uso típico |
|---|---|---|
symbol | Nome do ativo (ex.: "EURUSD") | Identifica o ativo a ser consultado. |
prop_id | Constante da enumeração ENUM_SYMBOL_INFO_INTEGER | Define a informação desejada (ex.: SYMBOL_TRADE_TICK_SIZE). |
result | Variável ulong ou int | Recebe o valor retornado. |
Exemplo rápido:
ulong tick_size; if(SymbolInfoInteger("EURUSD",SYMBOL_TRADE_TICK_SIZE,tick_size)) Print("Tick size: ",tick_size); else Print("Falha ao ler tick size. Erro: ",GetLastError()); Rotina recomendada para coleta de dados críticos
Evite chamadas redundantes dentro de loops de alta frequência; armazene o valor em cache por, no máximo, 5 segundos.
- Na inicialização (
OnInit()), carregue os parâmetros estáticos:SYMBOL_DIGITS,SYMBOL_POINT,SYMBOL_TRADE_CONTRACT_SIZE. - No
OnTick(), recupere apenas informações que mudam dinamicamente, comoSYMBOL_VOLUMEouSYMBOL_TRADE_MODE. - Utilize
EventSetTimer()para atualizar valores cacheados a intervalos definidos (ex.: 3 s).
Checklist operacional – evitando erros comuns
- ✅ Verificar
GetLastError()após cada chamada falha. - ✅ Confirmar que o símbolo está ativo no Market Watch antes de consultar.
- ✅ Não misturar
SymbolInfoInteger()comSymbolInfoDouble()no mesmo parâmetro. - ✅ Garantir que a conta possui permissão para acessar o ativo (modo demo ou live).
Fluxograma de decisão para uso avançado
| Ação | Condição | Próximo passo |
|---|---|---|
Solicitar SYMBOL_TRADE_MODE | Retorno = TRADE_MODE_DISABLED | Abortar operação e logar alerta. |
Solicitar SYMBOL_TRADE_MODE | Retorno = TRADE_MODE_LONGONLY | Permitir apenas ordens de compra. |
Solicitar SYMBOL_TRADE_MODE | Retorno = TRADE_MODE_SHORTONLY | Permitir apenas ordens de venda. |
Solicitar SYMBOL_TRADE_MODE | Retorno = TRADE_MODE_FULL | Habilitar compra e venda. |
Ferramentas complementares
Para visualizar rapidamente os valores retornados, abra o Journal do MetaTrader e habilite a opção Debug. Isso permite rastrear cada SymbolInfoInteger() chamado, facilitando a identificação de gargalos de performance.
FAQ rápido
- Posso usar SymbolInfoInteger() dentro de um indicador? Sim, mas prefira
OnCalculate()apenas para parâmetros estáticos; para dados dinâmicos useOnTimer(). - Qual a diferença entre SYMBOL_TRADE_TICK_VALUE e SYMBOL_TRADE_TICK_SIZE? O primeiro representa o valor monetário de um tick; o segundo, a variação mínima de preço.
- Erro 4108 (Invalid symbol) persiste mesmo com o símbolo visível? Verifique se o nome está exatamente igual ao exibido no Market Watch (maiúsculas, sem espaços).
Com a estrutura acima, você transforma SymbolInfoInteger() de um simples leitor de propriedades em um componente central da lógica de negociação, reduzindo latência e aumentando a robustez do seu EA.
Perfil ideal e limitações práticas do SymbolInfoInteger() em MQL5
Se você já programou robôs que precisam de informações explícitas sobre o ativo – como lotes mínimos, margem de garantia ou tipo de contrato – o SymbolInfoInteger() pode ser a chave que falta.
Quem deve investir tempo nessa função
- Desenvolvedores de EAs que exigem precisão de parâmetros de símbolo antes de abrir posições.
- Analistas que constroem indicadores com base em restrições de corretora (ex.:
SYMBOL_TRADE_TICK_SIZE). - Traders avançados que rodam múltiplas contas e precisam validar uniformidade entre elas.
Quem provavelmente não terá bom aproveitamento
- Iniciantes que ainda não dominam a arquitetura básica de MQL5 (event handling, OnTick, OnInit).
- Usuários que só operam com um único par e não pretendem mudar de corretora.
- Quem procura “atalho mágico” para melhorar performance sem revisitar a lógica de gerenciamento de risco.
Limitações contextuais
O retorno de SymbolInfoInteger() depende do servidor de negociação. Em corretoras que limitam a exposição de algumas propriedades (por exemplo, SYMBOL_TRADE_MODE), o valor pode ser UNKNOWN ou simplesmente não estar disponível. Além disso, a chamada só reflete o estado atual: mudanças de margem ou tamanho de lote durante o horário de negociação exigem nova consulta, caso contrário o EA opera com dados desatualizados.
FAQ contextual
| Pergunta | Resposta curta |
|---|---|
Posso usar SymbolInfoInteger() fora de OnInit? | Sim, mas revalide sempre antes de cada operação. |
| O que faço se o retorno for -1? | Trate como “não suportado” e caia para uma configuração padrão. |
| É possível ler propriedades de símbolos inexistentes? | Retorna FALSE. Verifique com SymbolSelect() antes. |
Checklist final de compatibilidade
- Servidor devolve valores consistentes em
SymbolInfoInteger()para todos os símbolos desejados. - Seu código re‑consulta parâmetros críticos a cada mudança de condição de mercado.
- Tratamento de erros implementado (verifique
GetLastError()). - Teste em conta demo com diferentes corretoras antes de migrar para produção.
Parecer editorial equilibrado
Em termos de custo de implementação, a função pesa menos que 0,5 KB de código, mas a decisão de adotá‑la deve ser guiada por necessidades reais de controle de parâmetros. Não é um “coringa” para melhorar a taxa de acerto; é uma ferramenta de precisão que, bem utilizada, impede ordens rejeitadas por requisitos de lote ou margem. Usuários que já mantêm um dicionário estático de símbolos podem ganhar pouco – o risco de dados obsoletos aumenta.
Para quem precisa validar dinamicamente o ambiente de negociação, SymbolInfoInteger() entrega a informação essencial sem sobrecarga. Para quem ainda está aprendendo a sintaxe de MQL5, o esforço adicional pode ultrapassar o benefício imediato.
Próximos passos recomendados
Integre uma camada de “fallback” que use valores padrão caso a chamada falhe. Em seguida, execute um teste de regressão cruzado entre duas corretoras para confirmar que os limites de lote e margem permanecem iguais. Caso tudo funcione, libere o módulo em produção e monitore a taxa de erros de submissão nas primeiras 500 operações.
Quer aprofundar? Acesse a documentação oficial completa e explore exemplos avançados.



