Русский
preview
Símbolos personalizados em MQL5: Criando um símbolo customizado de barras 3D

Símbolos personalizados em MQL5: Criando um símbolo customizado de barras 3D

MetaTrader 5Indicadores |
22 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

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

Arquivos anexados |
3D_Bars_EA.mq5 (39.53 KB)
Últimos Comentários | Ir para discussão (1)
Andy An
Andy An | 17 jul. 2025 em 08:34
O indicador não funciona on-line.
Caminhe em novos trilhos: Personalize indicadores no MQL5 Caminhe em novos trilhos: Personalize indicadores no MQL5
Vou agora listar todas as possibilidades novas e recursos do novo terminal e linguagem. Elas são várias, e algumas novidades valem a discussão em um artigo separado. Além disso, não há códigos aqui escritos com programação orientada ao objeto, é um tópico muito importante para ser simplesmente mencionado em um contexto como vantagens adicionais para os desenvolvedores. Neste artigo vamos considerar os indicadores, sua estrutura, desenho, tipos e seus detalhes de programação em comparação com o MQL4. Espero que este artigo seja útil tanto para desenvolvedores iniciantes quanto para experientes, talvez alguns deles encontrem algo novo.
Introdução ao MQL5 (Parte 13): Um Guia para Iniciantes na Construção de Indicadores Personalizados (II) Introdução ao MQL5 (Parte 13): Um Guia para Iniciantes na Construção de Indicadores Personalizados (II)
Este artigo orienta você na construção de um indicador personalizado Heikin Ashi do zero e demonstra como integrar indicadores personalizados em um EA. Ele cobre cálculos de indicadores, lógica de execução de trades e técnicas de gerenciamento de risco para melhorar estratégias de trading automatizadas.
Está chegando o novo MetaTrader 5 e MQL5 Está chegando o novo MetaTrader 5 e MQL5
Esta é apenas uma breve resenha do MetaTrader 5. Eu não posso descrever todos os novos recursos do sistema por um período tão curto de tempo - os testes começaram em 09.09.2009. Esta é uma data simbólica, e tenho certeza que será um número de sorte. Alguns dias passaram-se desde que eu obtive a versão beta do terminal MetaTrader 5 e MQL5. Eu ainda não consegui testar todos os seus recursos, mas já estou impressionado.
Multiple Symbol Analysis With Python And MQL5 (Part 3): Taxas de Câmbio Triangulares Multiple Symbol Analysis With Python And MQL5 (Part 3): Taxas de Câmbio Triangulares
Traders frequentemente enfrentam drawdowns causados por sinais falsos, enquanto esperar por confirmação pode levar à perda de oportunidades. Este artigo apresenta uma estratégia de trading triangular utilizando a cotação da Prata em Dólares (XAGUSD) e em Euros (XAGEUR), juntamente com a taxa de câmbio EURUSD, para filtrar ruído. Ao aproveitar relações entre mercados, traders podem descobrir sentimento oculto do mercado e refinar suas entradas em tempo real.