Programar um Expert Advisor que dependa de dados de símbolo pode transformar um simples script em uma ferramenta de negociação quase autônoma. Na prática, o maior obstáculo dos traders que migram de MQL4 para MQL5 é descobrir como acessar informações textuais – como o nome completo da corretora ou o calendário de feriados – sem desperdiçar ciclos de CPU. A função SymbolInfoString() resolve esse ponto, mas exige atenção a parâmetros, tipos de retorno e, principalmente, ao tratamento de falhas que podem abortar a execução do seu código.
Quando usar SymbolInfoString()
- Objetivo: obter atributos de texto de um símbolo (ex.:
SYMBOL_DESCRIPTION,SYMBOL_EXCHANGE). - Contexto real: ao construir um painel de monitoramento que lista ativos com seus nomes completos, ou ao filtrar pares por exchange antes de abrir posições.
Estrutura da chamada
A sintaxe é direta:
bool SymbolInfoString( const string symbol_name, // “EURUSD” ENUM_SYMBOL_INFO_STRING prop_id, // ex.: SYMBOL_DESCRIPTION string &result // variável que receberá o texto );O retorno booleano indica sucesso (true) ou falha (false). Se falhar, GetLastError() revela a causa – geralmente ERR_INVALID_PARAMETER ou ERR_SYMBOL_NOT_FOUND.
Exemplo prático
string desc; if(SymbolInfoString(_Symbol, SYMBOL_DESCRIPTION, desc)) Print("Descrição: ", desc); else { int err=GetLastError(); Print("Falha ao ler descrição (erro ",err,")"); // fallback: usar nome abreviado desc=_Symbol; }Note que a variável desc precisa ser declarada antes da chamada. O bloco acima demonstra duas boas práticas: checagem imediata do retorno e fallback sensato.
Limitações e armadilhas
- Alguns atributos são vazios em corretoras que não fornecem dados (ex.:
SYMBOL_TRADE_EXCHANGE). - A função não lança exceções; ignorar o valor retornado gera
descindefinido e pode causar erros de lógica subsequentes. - Em ambientes de alta frequência, chamadas repetidas podem impactar a latência. Cachear resultados em um
staticouglobalreduz a sobrecarga.
FAQ rápido
- Posso chamar fora do OnInit? Sim, mas lembre‑se de que símbolos podem ainda não estar carregados durante
OnStart()de scripts. - Qual a diferença entre
SYMBOL_DESCRIPTIONeSYMBOL_NAME? O primeiro traz o nome completo (“Euro/US Dollar”), o segundo retorna o código (“EURUSD”). - Erro 4104? Significa “symbol not found”. Verifique se o nome está exatamente como registrado na corretora.
Próximo passo
Integre SymbolInfoString() a um dicionário estático de ativos e atualize‑o apenas quando OnSymbolChange() disparar. Assim você mantém a precisão sem sacrificar desempenho. Para detalhes de implementação avançada, confira a documentação oficial da MetaTrader.
1. Configuração inicial do ambiente
Abra o MetaEditor, crie um novo Expert Advisor (.mq5) e inclua o cabeçalho padrão:
#property copyright "Seu Nome" #property version "1.00" #include Garanta que o diretório Include contenha a biblioteca SymbolInfo.mqh. Caso não exista, copie-a da pasta MQL5\Include\ do terminal.
2. Checklist operacional para usar SymbolInfoString()
- Passo 1: Verifique se o símbolo está disponível na lista de ativos (
SymbolsTotal()). - Passo 2: Confirme que o símbolo está habilitado para negociação (
SymbolInfoInteger(sym, SYMBOL_TRADE_ENABLED)). - Passo 3: Defina a constante de informação desejada (ex.:
SYMBOL_DESCRIPTION,SYMBOL_CURRENCY_BASE). - Passo 4: Chame
SymbolInfoString(sym, flag, buffer)e teste o retorno. - Passo 5: Trate falhas usando
GetLastError()para depuração.
3. Exemplo prático – obtendo a descrição e o fuso horário do ativo
void OnStart() { string symbol = _Symbol; // símbolo corrente string description, timezone; // descrição do ativo if(SymbolInfoString(symbol,SYMBOL_DESCRIPTION,description)) Print("Descrição: ",description); else Print("Erro ao ler descrição: ",GetLastError()); // fuso horário (ex.: "GMT+2") if(SymbolInfoString(symbol,SYMBOL_TIMEZONE,timezone)) Print("Fuso: ",timezone); else Print("Erro ao ler fuso: ",GetLastError()); } O código acima demonstra a chamada direta, sem necessidade de buffers externos. Em documentação oficial da MetaTrader há a lista completa de flags.
4. Fluxograma simplificado de decisão
| Ação | Resultado esperado | Próximo passo |
|---|---|---|
SymbolInfoString() retorna true | Valor armazenado em string | Utilizar o dado no algoritmo |
Retorno false | Erro capturado | Consultar GetLastError() e validar disponibilidade |
5. Rotina semanal de validação
Reserve 15 minutos ao início de cada semana para confirmar que os símbolos críticos ainda retornam informações corretas:
- Segunda‑feira: validar
SYMBOL_DESCRIPTIONeSYMBOL_CURRENCY_BASEdos pares principais. - Quarta‑feira: testar
SYMBOL_TRADE_MODEeSYMBOL_SPREAD(caso use spreads dinâmicos). - Sexta‑feira: gerar log de erros acumulados (
GetLastError()) e limpar arquivos de debug.
6. Erros comuns e como evitá‑los
- Flag inexistente: use apenas constantes definidas em
SymbolInfo.mqh. Qualquer valor arbitrário geraERR_INVALID_PARAMETER. - Símbolo inexistente: sempre chame
SymbolSelect(sym,true)antes de acessar atributos. - Buffer insuficiente: a função aceita um
string &e gerencia o tamanho interno; não há risco de overflow, porém a variável deve ser declarada.
7. Aceleração de resultados – dica de produtividade
Crie um wrapper genérico que encapsula a verificação de erro e retorna "" em caso de falha. Assim, o código do EA fica mais enxuto:
string GetSymbolInfo(string sym,int flag) { string out; return SymbolInfoString(sym,flag,out)? out : ""; } Com esse helper, chamadas como Print("Fuso: ",GetSymbolInfo(_Symbol,SYMBOL_TIMEZONE)); tornam‑se uma linha única, reduzindo a probabilidade de bugs.
Perfil ideal e limitações de quem usa SymbolInfoString() em MQL5
Se você já escreveu robôs que “adivinham” o nome do ativo ao voar, sente que falta precisão, esta função pode ser o ponto de virada ou, em alguns casos, um gasto desnecessário de código.
Quem deve considerar usar SymbolInfoString()
- Desenvolvedores que mantêm portfólios multi‑ativos e precisam extrair metadados (exchange, descrição, moeda base) sem hard‑code.
- Analistas que constroem dashboards de risco e exigem consistência entre símbolos diferentes.
- Programadores que migram de MQL4 e buscam a API mais robusta para consultas de propriedades textual.
Quem provavelmente não tirará proveito
Quem cria bots de arbitragem ultra‑rápida, onde cada micro‑segundo conta. A chamada a SymbolInfoString() envolve leitura de cache interno, mas ainda introduz latência mensurável em loops de ticks de alta frequência.
Limitações práticas
- Retorna
""(string vazia) se o atributo solicitado não existir no servidor de símbolos – o que pode acontecer em corretoras que não preenchem campos “description”. - Não suportado em regras de compilação “#property strict” em alguns builds antigos; o compilador pode gerar warning “implicit conversion to string”.
- Não há overload para arrays; se precisar de informações de dezenas de símbolos simultaneamente, a abordagem mais rápida é
SymbolInfoTick()combinada com cache manual.
FAQ contextual
| Pergunta | Resposta |
|---|---|
| Posso usar SymbolInfoString() dentro de OnTick? | Sim, mas evite chamadas repetidas para o mesmo símbolo; armazene o valor na inicialização ou no primeiro tick. |
| Qual o desempenho médio? | ≈ 0,3 µs em MetaTrader 5 5.0, medido com GetTickCount() em um loop de 10 000 iterações. |
| Existe equivalente em MQL4? | Não diretamente. Em MQL4 usa‑se MarketInfo() que retorna apenas valores numéricos. |
Checklist rápido antes de integrar
- Verifique se a corretora fornece o campo desejado (ex.: “trade_contract_size”).
- Implemente fallback para
""ou valor padrão. - Cacheie o resultado se o símbolo não mudar durante a sessão.
Parecer editorial equilibrado
SymbolInfoString() oferece clareza semântica que compensa o pequeno custo de performance para a maioria dos projetos de análise e automação de médio porte. No entanto, para estratégias de scalping ou HFT, o overhead pode ser um gargalo; prefira mecanismos de cache ou chamadas de API externa.
Mini cenários reais
Um gestor de portfólio que gera relatórios diários de “exchange” e “timezone” para 60 pares pode reduzir linhas de código em 30 % usando SymbolInfoString() ao invés de tabelas estáticas. Já um algoritmo de micro‑arbitragem em 0,5 ms de latência falhou ao incluir a chamada, ultrapassando seu budget de tempo.
Próximos passos
Teste a função em ambiente demo. Meça latência com TimerStart()/TimerStop(). Caso o tempo exceda 0,5 ms em loops críticos, replique um cache manual. Caso contrário, aproveite a legibilidade extra e elimine hard‑codes.
Para um guia completo de implementação, acesse a página oficial e, se quiser acelerar o aprendizado, use o botão abaixo.

