Símbolos personalizados em MQL5: Criando um símbolo customizado de barras 3D
O trading moderno exige abordagens fora do padrão para a análise de dados. Os gráficos de preços tradicionais, embora úteis, muitas vezes não mostram o quadro completo da dinâmica do mercado. O preço é apenas um dos aspectos, enquanto o volume de negociação, a volatilidade e os padrões temporais podem proporcionar uma compreensão mais profunda do mercado.
A plataforma MetaTrader 5 e a linguagem MQL5 oferecem uma ferramenta poderosa, os símbolos personalizados, que permitem aos traders criar ativos sintéticos com base em dados arbitrários. Neste artigo, vamos analisar em detalhes o indicador 3DBarCustomSymbol.mq5, que gera um símbolo personalizado representando barras 3D. Essas barras combinam preço, tempo, volume e volatilidade, criando uma ferramenta única para análise e visualização.

As barras 3D são uma forma de enriquecer os gráficos padrão com dimensões adicionais. Elas permitem que os traders vejam não apenas o movimento do preço, mas também parâmetros como intensidade das negociações, turbulência do mercado e padrões temporais cíclicos. Essa abordagem pode revelar padrões ocultos que passam despercebidos quando se usam gráficos comuns de velas.
O indicador 3DBarCustomSymbol mostra como usar os recursos do MQL5 para criar um símbolo customizado que pode ser integrado a estratégias de trading ou usado para análise visual.
Evolução da análise de dados de mercado
A evolução da análise de mercados percorreu o caminho dos simples gráficos em papel até métodos computacionais complexos e estudos de microestrutura, como volumes, book de ofertas, intervalos entre negociações e volatilidade em cluster. Mas a maioria das abordagens permaneceu fragmentada.
As barras 3D reúnem em um único gráfico quatro dimensões-chave:
- preço: dados OHLC, velocidade e aceleração dos movimentos, estatísticas de distribuição;
- volume: volume total, distribuição por níveis, intensidade, anomalias, relação entre compras e vendas agressivas;
- tempo: ciclos intrassessão, velocidade de formação, correlações temporais, efeitos sazonais;
- volatilidade: local e global, clusterização, picos anormais, relação com o volume.
Isso oferece uma visão completa do mercado e ajuda a identificar rapidamente padrões e anomalias. Além disso, as barras 3D são visualmente intuitivas, o que reduz a carga cognitiva e acelera a tomada de decisões, especialmente no trading de alta frequência. O indicador personalizado é facilmente integrado ao MetaTrader 5 para diferentes estratégias, do scalping ao longo prazo
Formalização matemática do conceito
A barra 3D pode ser descrita matematicamente como um vetor em um espaço multidimensional:
B₃D = (P, V, T, σ)
onde:
- P — vetor de preços (open, high, low, close, typical_price)
- V — vetor de volume (volume, volume_profile, volume_acceleration)
- T — vetor temporal (time_sin, time_cos, time_acceleration)
- σ — vetor de volatilidade (local_volatility, global_volatility, volatility_change)
Cada componente contém elementos tanto estáticos (históricos) quanto dinâmicos (em tempo real).
Arquitetura do indicador
A arquitetura do indicador é construída com base no princípio de separação de responsabilidades:
O módulo de inicialização é responsável por:
- verificar a disponibilidade do símbolo de origem,
- validar os parâmetros de entrada,
- configurar as variáveis globais,
- criar as estruturas de dados necessárias.
O módulo de criação do símbolo inclui:
- funções para criar o símbolo personalizado,
- configuração das propriedades do símbolo,
- configuração das sessões de negociação,
- definição dos metadados.
O módulo de processamento de dados contém:
- algoritmos de cálculo das métricas,
- funções de normalização e escalonamento,
- cálculos estatísticos,
- tratamento de situações excepcionais.
O módulo de atualização garante:
- monitoramento de novos dados,
- recálculo das métricas atuais,
- atualização do símbolo personalizado,
- otimização de desempenho.
Análise detalhada dos parâmetros de entrada
O indicador oferece flexibilidade graças aos parâmetros de entrada configuráveis. Aqui está um exemplo da definição deles no código:
input string SourceSymbol = "EURUSD"; // Símbolo de origem input string CustomSymbolName = "EURUSD_3D"; // Nome do símbolo personalizado input int LookbackPeriod = 20; // Período da janela deslizante input int HistoryDays = 100; // Número de dias do histórico input bool CreateWindow = true; // Criar janela do gráfico input bool UpdateInRealTime = true; // Atualizar em tempo real input bool ShowPrice = true; // Mostrar o preço normal input double MinSpreadMultiplier = 45; // Multiplicador do spread input double VolumeBrick = 500; // Tamanho do bloco de volume input double ScaleMin = 3.0; // Valor mínimo da escala input double ScaleMax = 9.0; // Valor máximo da escala
Aqui:
- SourceSymbol, instrumento financeiro base para análise. São suportados todos os símbolos disponíveis no MetaTrader 5, incluindo pares de moedas, ações, commodities, índices e criptomoedas.
- CustomSymbolName, nome único do símbolo personalizado criado. Recomenda-se usar nomes descritivos que reflitam a essência da transformação dos dados.
- LookbackPeriod, tamanho da janela móvel para o cálculo de métricas estatísticas. Influencia a sensibilidade do indicador a mudanças de curto prazo. Valores pequenos (5-10) dão alta sensibilidade, valores maiores (50-100), sinais mais suavizados.
- HistoryDays, profundidade dos dados históricos para inicialização. Influencia o tempo de carregamento e a precisão das estatísticas de longo prazo. Valores ideais: 30-365 dias, dependendo dos objetivos da análise.
- MinSpreadMultiplier e VolumeBrick, parâmetros criticamente importantes que determinam a sensibilidade do algoritmo às mudanças de preço e volume, respectivamente.
- ScaleMin e ScaleMax, limites de normalização de todas as métricas. O intervalo de 3-9 foi escolhido com base em considerações numerológicas e oferece praticidade para a percepção visual.
A função OnInit executa a configuração inicial. Ela verifica a existência do símbolo de origem, calcula o tamanho do bloco de preço com base no spread, cria o símbolo personalizado e o preenche com dados históricos. Aqui está o trecho principal do código:
int OnInit() { if(!SymbolSelect(SourceSymbol, true)) { Print( "Erro: símbolo ", SourceSymbol, " não encontrado!"); return INIT_FAILED; } double spread = SymbolInfoDouble(SourceSymbol, SYMBOL_ASK) - SymbolInfoDouble(SourceSymbol, SYMBOL_BID); double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT); minPriceBrick = spread * MinSpreadMultiplier * point; if(!Create3DBarSymbol()) { Print(" Erro ao criar o símbolo personalizado!"); return INIT_FAILED; } if(!GenerateHistorical3DBars()) { Print(" Erro ao gerar os dados históricos!"); return INIT_FAILED; } if(CreateWindow) { OpenCustomChart(); } if(UpdateInRealTime) { EventSetTimer(5); } Print(" Símbolo de barras 3D ", CustomSymbolName, " criado com sucesso!"); return(INIT_SUCCEEDED); }
A função Create3DBarSymbol configura as propriedades do símbolo personalizado, como precisão, tamanho do tick e moedas de cotação. Ela também define sessões de negociação disponíveis 24 horas por dia. Aqui está um exemplo:
bool Create3DBarSymbol() { if(SymbolSelect(CustomSymbolName, true)) { CustomRatesDelete(CustomSymbolName, 0, 0); Print(" O símbolo ", CustomSymbolName, " já existe. Histórico removido."); return true; } int digits = (int)SymbolInfoInteger(SourceSymbol, SYMBOL_DIGITS); double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT); double tickSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_TICK_SIZE); double contractSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_CONTRACT_SIZE); string baseCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_BASE); string profitCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_PROFIT); if(!CustomSymbolCreate(CustomSymbolName)) { Print(" Erro ao criar o símbolo personalizado: ", GetLastError()); return false; } CustomSymbolSetInteger(CustomSymbolName, SYMBOL_DIGITS, digits); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_POINT, point); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_TICK_SIZE, tickSize); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_CONTRACT_SIZE, contractSize); CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_BASE, baseCurrency); CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_PROFIT, profitCurrency); string description = " Barras 3D (preço, tempo, volume, volatilidade). Lookback: " + IntegerToString(LookbackPeriod); CustomSymbolSetString(CustomSymbolName, SYMBOL_DESCRIPTION, description); for(int day=0; day<7; day++) { datetime start_time = 0; datetime end_time = 24*60*60-1; CustomSymbolSetSessionQuote(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time); CustomSymbolSetSessionTrade(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time); } return true; }
A função GenerateHistorical3DBars processa os dados históricos, calculando métricas como: retornos de preço, aceleração do preço, mudanças de volume e volatilidade. Ela usa o timeframe M15 para obter os dados base. Aqui está parte do código:
bool GenerateHistorical3DBars() { datetime endTime = TimeCurrent(); datetime startTime = endTime - HistoryDays * 24 * 60 * 60; MqlRates rates[]; int copiedRates = CopyRates(SourceSymbol, PERIOD_M15, startTime, endTime, rates); if(copiedRates <= 0) { Print(" Erro ao copiar os dados históricos: ", GetLastError()); return false; } MqlRates threeDBars[]; ArrayResize(threeDBars, copiedRates); int validCount = 0; double typicalPrices[], priceReturns[], priceAccelerations[], volumeChanges[], volatilities[]; ArrayResize(typicalPrices, copiedRates); ArrayResize(priceReturns, copiedRates); ArrayResize(priceAccelerations, copiedRates); ArrayResize(volumeChanges, copiedRates); ArrayResize(volatilities, copiedRates); for(int i = 0; i < copiedRates; i++) { typicalPrices[i] = (rates[i].high + rates[i].low + rates[i].close) / 3.0; if(i > 0) { priceReturns[i] = (typicalPrices[i] - typicalPrices[i-1]) / typicalPrices[i-1]; priceAccelerations[i] = i > 1 ? priceReturns[i] - priceReturns[i-1] : 0; } else { priceReturns[i] = 0; priceAccelerations[i] = 0; } volumeChanges[i] = i > 0 ? (rates[i].tick_volume - rates[i-1].tick_volume) / (rates[i-1].tick_volume + 1e-10) : 0; if(i >= LookbackPeriod) { double returns[]; ArrayResize(returns, LookbackPeriod); for(int j = 0; j < LookbackPeriod; j++) returns[j] = priceReturns[i - LookbackPeriod + j + 1]; volatilities[i] = CalculateStdDev(returns); } else { volatilities[i] = 0; } } // Em seguida, são preenchidas as barras 3D e adicionadas ao histórico. }
A função UpdateCurrent3DBar garante a atualização da barra atual a cada 5 segundos, se o parâmetro UpdateInRealTime estiver ativado. Ela calcula as mesmas métricas para a barra atual e atualiza o símbolo personalizado.
double ScaleValue(double value, double &values[], int start, int end) { double minVal = values[start]; double maxVal = values[start]; for(int i = start; i <= end; i++) { if(values[i] < minVal) minVal = values[i]; if(values[i] > maxVal) maxVal = values[i]; } if(maxVal == minVal) return ScaleMin; return ScaleMin + (ScaleMax - ScaleMin) * (value - minVal) / (maxVal - minVal); }
A função OpenCustomChart abre o gráfico do símbolo personalizado, que pode ser exibido no formato de velas ou de linha, dependendo do parâmetro ShowPrice.
Uso prático
O indicador permite analisar a volatilidade, identificar anomalias no volume ou na aceleração do preço e integrar o símbolo personalizado a sistemas de trading.
Para começar a usar, compile o código no MetaEditor e adicione o indicador a um gráfico, por exemplo, EURUSD com timeframe M15. Configure parâmetros como CustomSymbolName e LookbackPeriod, e o indicador criará um símbolo personalizado que poderá ser aberto em uma janela separada. Se o parâmetro ShowPrice estiver ativado, o gráfico mostrará os preços padrão com as métricas sobrepostas, caso contrário, mostrará apenas barras 3D sintéticas.

Aqui está um gráfico comum:

Os traders podem usar as barras 3D para identificar períodos de volatilidade elevada, que sinalizam eventos de notícias, ou para detectar anomalias, como picos de volume. O símbolo personalizado pode ser combinado com indicadores, como médias móveis, ou usado em EAs para trading automatizado.
O indicador pode ser aprimorado com suporte a outros timeframes, como H1 ou D1, para analisar movimentos mais amplos. A inclusão de métricas adicionais, como correlação com outros ativos, pode aumentar o nível de informação. Para otimizar o desempenho, limite o valor de HistoryDays, especialmente em computadores mais fracos. A visualização pode ser melhorada com a adição de indicadores, como Bollinger Bands, ou filtros para destacar anomalias, por exemplo, barras com volatilidade extrema.
A geração de um grande volume de dados históricos pode exigir muitos recursos, por isso comece com um HistoryDays pequeno. O timeframe M15 é adequado para a maioria dos instrumentos, mas, para ativos com baixa liquidez, é melhor usar períodos mais longos. Antes de operar em conta real, teste o indicador em uma conta demo para garantir que ele funcione corretamente. A interpretação das barras 3D exige experiência, por isso vale estudar o comportamento delas em dados históricos.
Considerações finais
O indicador 3DBarCustomSymbol demonstra o poder dos símbolos personalizados no MQL5. Ao reunir preço, tempo, volume e volatilidade, ele cria uma ferramenta única para análise de mercado. As barras 3D são adequadas para análise visual, criação de sistemas de trading e identificação de padrões ocultos. Adapte o indicador às suas necessidades, experimente os parâmetros e teste em uma conta demo. O MQL5 abre possibilidades ilimitadas para inovação no trading, e o 3DBarCustomSymbol é um exemplo claro de como esses recursos podem ser usados para criar ferramentas analíticas poderosas.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/18681
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Caminhe em novos trilhos: Personalize indicadores no MQL5
Introdução ao MQL5 (Parte 13): Um Guia para Iniciantes na Construção de Indicadores Personalizados (II)
Está chegando o novo MetaTrader 5 e MQL5
Multiple Symbol Analysis With Python And MQL5 (Part 3): Taxas de Câmbio Triangulares
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso