Cursos Para Traders Estratégias Trader Guia Técnico: Como usar SymbolInfoInteger() em MQL5

Guia Técnico: Como usar SymbolInfoInteger() em MQL5

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ódigoExplicaçã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 (como SYMBOL_TRADE_TICK_VALUE) retornará truncado. Use SymbolInfoDouble() nesses casos.

FAQ rápido

  • “Por que meu EA não abre posições quando o spread é 0?” – Você leu SYMBOL_SPREAD com SymbolInfoInteger(), mas ele é double. Use SymbolInfoDouble().
  • “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_EXECUTION varia 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 #include para 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âmetroValor esperadoUso típico
symbolNome do ativo (ex.: "EURUSD")Identifica o ativo a ser consultado.
prop_idConstante da enumeração ENUM_SYMBOL_INFO_INTEGERDefine a informação desejada (ex.: SYMBOL_TRADE_TICK_SIZE).
resultVariável ulong ou intRecebe 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.

  1. Na inicialização (OnInit()), carregue os parâmetros estáticos: SYMBOL_DIGITS, SYMBOL_POINT, SYMBOL_TRADE_CONTRACT_SIZE.
  2. No OnTick(), recupere apenas informações que mudam dinamicamente, como SYMBOL_VOLUME ou SYMBOL_TRADE_MODE.
  3. 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() com SymbolInfoDouble() 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çãoCondiçãoPróximo passo
Solicitar SYMBOL_TRADE_MODERetorno = TRADE_MODE_DISABLEDAbortar operação e logar alerta.
Solicitar SYMBOL_TRADE_MODERetorno = TRADE_MODE_LONGONLYPermitir apenas ordens de compra.
Solicitar SYMBOL_TRADE_MODERetorno = TRADE_MODE_SHORTONLYPermitir apenas ordens de venda.
Solicitar SYMBOL_TRADE_MODERetorno = TRADE_MODE_FULLHabilitar 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 use OnTimer().
  • 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

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

Deixe uma resposta

Related Post