Русский
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 |
220 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.
Do básico ao intermediário: Recursos Do básico ao intermediário: Recursos
Neste artigo você será apresentado a um conceito que pode ser de extrema utilidade em muitos casos. Facilitando em muito o compartilhamento de suas aplicações e projetos. Apesar de não ser um conceito muito simples de ser totalmente explicando em um único artigo. O que será explicado e exposto aqui, já nos irá permitir fazer diversas coisas no futuro. Inclusive algumas que de outra maneira não seriam possíveis de serem feitas. Justamente por que este artigo ainda não havia sido publicado, para que você, pudesse ter um material de apoio e uma base inicial de estudo.
Introdução ao MQL5 (Parte 13): Um Guia para Iniciantes na Criação de Indicadores Personalizados (II) Introdução ao MQL5 (Parte 13): Um Guia para Iniciantes na Criação de Indicadores Personalizados (II)
Este artigo orienta você na construção de um indicador Heikin Ashi personalizado do zero e demonstra como integrar indicadores personalizados em um EA. Ele aborda cálculos de indicadores, lógica de execução de trades e técnicas de gerenciamento de risco para aprimorar estratégias de negociação automatizadas.
Redes neurais em trading: Previsão probabilística de séries temporais (Codificador) Redes neurais em trading: Previsão probabilística de séries temporais (Codificador)
Apresentamos uma nova abordagem que combina métodos clássicos e redes neurais modernas para a análise de séries temporais. O artigo descreve detalhadamente a arquitetura e os princípios de funcionamento do modelo K²VAE.
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.