Русский Português
preview
Símbolos personalizados MQL5: Creamos un símbolo de barras 3D

Símbolos personalizados MQL5: Creamos un símbolo de barras 3D

MetaTrader 5Indicadores |
45 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

El comercio moderno requiere enfoques no convencionales para el análisis de datos. Los gráficos de precios tradicionales, si bien resultan útiles, a menudo no reflejan la dinámica completa del mercado. El precio supone solo un aspecto, mientras que el volumen de negociación, la volatilidad y los patrones temporales pueden proporcionar una visión más profunda del mercado.

La plataforma MetaTrader 5 y el lenguaje MQL5 ofrecen una poderosa herramienta —los símbolos personalizados— que permite a los tráders crear activos sintéticos basados en datos arbitrarios. En este artículo, analizaremos con detalle el indicador 3DBarCustomSymbol.mq5, que genera un símbolo personalizado que representa barras 3D. Estas barras combinan precio, tiempo, volumen y volatilidad, creando una herramienta única para el análisis y la visualización.

Las barras 3D son una forma de enriquecer los gráficos estándar con dimensiones adicionales. Permiten a los tráders ver no solo los movimientos de precios, sino también parámetros como la intensidad de las operaciones, la volatilidad del mercado y los patrones temporales cíclicos. Este enfoque puede revelar patrones ocultos que pasan desapercibidos cuando se utilizan gráficos de velas japonesas convencionales.

El indicador 3DBarCustomSymbol muestra cómo utilizar las capacidades de MQL5 para crear un símbolo personalizado que se puede integrar en estrategias de trading o utilizar para análisis visual.



La evolución del análisis de datos de mercado

La evolución del análisis de mercado ha pasado de simples gráficos en papel a sofisticados métodos informáticos y estudios de microestructura (volúmenes, flujo de órdenes, intervalos de negociación, clustering de volatilidad). Pero la mayoría de los enfoques han seguido fragmentados.

Las barras 3D combinan cuatro dimensiones clave en un solo gráfico:

  • Precio: datos OHLC, velocidad y aceleración de los movimientos, estadísticas de distribución;
  • Volumen: volumen total, distribución por niveles, intensidad, anomalías, proporción entre compras y ventas agresivas;
  • Tiempo: ciclos intrasesionales, tasa de formación, correlaciones temporales, efectos estacionales;
  • Volatilidad: local y global, clusterización, picos anormales, relación con el volumen.

Esto proporciona una visión integral del mercado y ayuda a identificar rápidamente patrones y anomalías. Además, las barras 3D se perciben con facilidad, lo que reduce la carga cognitiva y acelera la toma de decisiones, especialmente en el trading de alta frecuencia. El indicador personalizado se integra fácilmente en MetaTrader 5 para diversas estrategias, desde scalping hasta operaciones a largo plazo.



Formalización matemática del concepto

Una barra 3D puede describirse matemáticamente como un vector en un espacio multidimensional:

B₃D = (P, V, T, σ)

donde:

  • P — vector de precios (open, high, low, close, typical_price)
  • V — vector de volumen (volume, volume_profile, volume_acceleration)
  • T — vector de tiempo (time_sin, time_cos, time_acceleration)
  • σ — vector de volatilidad (local_volatility, global_volatility, volatility_change)

Cada componente contiene elementos tanto estáticos (históricos) como dinámicos (en tiempo real).



Arquitectura del indicador

La arquitectura del indicador se basa en el principio de división de responsabilidades:

El módulo de inicialización es responsable de:

  • comprobar la disponibilidad del símbolo de origen,
  • validar los parámetros de entrada,
  • establecer variables globales,
  • crear las estructuras de datos necesarias.

El módulo de creación de símbolos incluye:

  • funciones para crear un símbolo personalizado,
  • configuración de las propiedades del símbolo,
  • configuración de las sesiones de negociación,
  • establecimiento de metadatos.

El módulo de procesamiento de datos contiene:

  • algoritmos para calcular métricas,
  • funciones de normalización y escalado,
  • computación estadística,
  • procesamiento de situaciones excepcionales.

El módulo de actualización posibilita:

  • la monitorización de nuevos datos,
  • el recálculo de las métricas actuales,
  • la actualización de un símbolo personalizado,
  • la optimización del rendimiento.



Análisis detallado de los parámetros de entrada

El indicador ofrece flexibilidad gracias a la posibilidad de personalizar los parámetros de entrada. Aquí hay un ejemplo de cómo se definen en el código:

input string   SourceSymbol = "EURUSD";        // Исходный символ
input string   CustomSymbolName = "EURUSD_3D"; // Название кастомного символа
input int      LookbackPeriod = 20;            // Период скользящего окна
input int      HistoryDays = 100;              // Количество дней истории
input bool     CreateWindow = true;            // Создать окно графика
input bool     UpdateInRealTime = true;        // Обновлять в реальном времени
input bool     ShowPrice = true;               // Показывать обычную цену
input double   MinSpreadMultiplier = 45;       // Множитель спреда
input double   VolumeBrick = 500;              // Размер блока объема
input double   ScaleMin = 3.0;                 // Минимальное значение масштаба
input double   ScaleMax = 9.0;                 // Максимальное значение масштаба

Aquí:

  • SourceSymbol — herramienta básica de análisis financiero. MetaTrader 5 admite todos los símbolos disponibles, incluidos pares de divisas, acciones, materias primas, índices y criptomonedas.
  • CustomSymbolName — nombre único del símbolo personalizado que se está creando. Le recomendamos utilizar nombres descriptivos que reflejen la esencia de la transformación de datos.
  • LookbackPeriod — tamaño de la ventana deslizante para calcular las métricas estadísticas. Afecta a la sensibilidad del indicador a los cambios a corto plazo. Los valores pequeños (5-10) ofrecen una sensibilidad alta, los valores grandes (50-100) proporcionan señales suavizadas.
  • HistoryDays — profundidad de los datos históricos para la inicialización. Afecta al tiempo de carga y a la precisión de las estadísticas a largo plazo. Valores óptimos: Entre 30 y 365 días, dependiendo de los objetivos del análisis.
  • MinSpreadMultiplier y VolumeBrick — parámetros críticos que determinan la sensibilidad del algoritmo a los cambios de precio y volumen, respectivamente.
  • ScaleMin y ScaleMax — límites de normalización para todas las métricas. El rango de 3 a 9 se elige según consideraciones numerológicas y garantiza una fácil percepción visual.

La función OnInit realiza la configuración inicial. Comprueba la existencia del símbolo original, calcula el tamaño del bloque de precios según el spread, crea un símbolo personalizado y lo rellena con datos históricos. Aquí está el fragmento de código clave:

int OnInit()
{
   if(!SymbolSelect(SourceSymbol, true))
   {
      Print("Ошибка: символ ", SourceSymbol, " не найден!");
      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("Ошибка при создании кастомного символа!");
      return INIT_FAILED;
   }
   
   if(!GenerateHistorical3DBars())
   {
      Print("Ошибка при генерации исторических данных!");
      return INIT_FAILED;
   }
   
   if(CreateWindow)
   {
      OpenCustomChart();
   }
   
   if(UpdateInRealTime)
   {
      EventSetTimer(5);
   }
   
   Print("Символ 3D-баров ", CustomSymbolName, " успешно создан!");
   return(INIT_SUCCEEDED);
}

La función Create3DBarSymbol configura las propiedades de un símbolo personalizado, como la precisión, el tamaño del tick y las divisas de cotización. También establece sesiones de negociación disponibles las 24 horas del día. Aquí tiene un ejemplo:

bool Create3DBarSymbol()
{
   if(SymbolSelect(CustomSymbolName, true))
   {
      CustomRatesDelete(CustomSymbolName, 0, 0);
      Print("Символ ", CustomSymbolName, " уже существует. История удалена.");
      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("Ошибка при создании кастомного символа: ", 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 = "3D-бары (цена, время, объем, волатильность). 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;
}

La función GenerateHistorical3DBars procesa datos históricos y calcula métricas como la rentabilidad de los precios, la aceleración de los precios, los cambios de volumen y la volatilidad. Usa el marco temporal M15 para obtener datos básicos. Aquí tenemos una parte del 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("Ошибка при копировании исторических данных: ", 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;
      }
   }
   // Далее следует заполнение 3D-баров и их добавление в историю
}

La función UpdateCurrent3DBar garantiza que la barra actual se actualice cada 5 segundos si el parámetro UpdateInRealTime está habilitado. Calcula las mismas métricas para la barra actual y actualiza el 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);
}

La función OpenCustomChart abre un gráfico de un símbolo personalizado, que puede mostrarse en formato de velas japonesas o de líneas, según el parámetro ShowPrice.



Uso práctico

Este indicador nos permite analizar la volatilidad, identificar anomalías en el volumen o la aceleración del precio, e integrar un símbolo personalizado en los sistemas de negociación.

Para empezar, compilamos el código en MetaEditor y añadimos el indicador a un gráfico, por ejemplo, EURUSD con un marco temporal de M15. Luego configuramos parámetros como CustomSymbolName y LookbackPeriod, y el indicador creará un símbolo personalizado que podrá abrirse en una ventana aparte. Si el parámetro ShowPrice está habilitado, el gráfico mostrará precios estándar con métricas superpuestas; de lo contrario, solo mostrará barras sintéticas 3D.

Este es un gráfico normal:

Los tráders pueden usar gráficos de barras 3D para identificar periodos de mayor volatilidad que indiquen la llegada de noticias o para detectar anomalías como picos de volumen. El símbolo personalizado se puede combinar con indicadores como las medias móviles o utilizarse en asesores expertos para el trading automatizado.

El indicador se puede mejorar añadiendo compatibilidad con otros marcos temporales, como H1 o D1, para analizar movimientos de mayor envergadura. La inclusión de métricas adicionales, como la correlación con otros activos, puede aumentar el valor informativo. Para optimizar el rendimiento, conviene limitar HistoryDays, especialmente en equipos poco potentes. La visualización se puede mejorar añadiendo indicadores como las Bandas de Bollinger o filtros para resaltar anomalías como barras con volatilidad extrema.

La generación de una gran cantidad de datos históricos puede requerir muchos recursos, así que empieza con una versión pequeña de HistoryDays. El marco temporal M15 resulta adecuado para la mayoría de los instrumentos, pero para los activos de baja liquidez es mejor utilizar periodos más largos. Antes de negociar con dinero real, pruebe el indicador en una cuenta demo para asegurarse de que funciona correctamente. Interpretar gráficos de barras 3D requiere experiencia, por lo que conviene estudiar su comportamiento con datos históricos.



Conclusión

El indicador 3DBarCustomSymbol muestra el potencial de los símbolos personalizados en MQL5. Combinando precio, tiempo, volumen y volatilidad, crea una herramienta única para el análisis de mercado. Los gráficos de barras 3D resultan adecuados para el análisis visual, la creación de sistemas de negociación y la identificación de patrones ocultos. Adapte el indicador a sus necesidades, experimente con los parámetros y pruébelo en una cuenta demo. MQL5 abre un sinfín de posibilidades para la innovación en el trading, y 3DBarCustomSymbol es un ejemplo perfecto de cómo podemos utilizar estas capacidades para crear potentes herramientas analíticas. 

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/18681

Archivos adjuntos |
3D_Bars_EA.mq5 (39.53 KB)
Andy An
Andy An | 17 jul 2025 en 08:34
El indicador no funciona en línea.
Teoría de grafos: Aplicación del algoritmo de Dijkstra al trading Teoría de grafos: Aplicación del algoritmo de Dijkstra al trading
El algoritmo de Dijkstra, una solución clásica para hallar el camino más corto en la teoría de grafos, puede optimizar las estrategias de trading mediante la modelización de las redes de mercado. Los traders pueden utilizarlo para encontrar las rutas más eficientes en los datos del gráfico de velas.
Exploramos modelos de regresión para inferencia causal y operaciones bursátiles Exploramos modelos de regresión para inferencia causal y operaciones bursátiles
Este artículo explora la posibilidad de usar modelos de regresión en el trading algorítmico. Los modelos de regresión, a diferencia de la clasificación binaria, permiten crear estrategias de trading más flexibles mediante la evaluación cuantitativa de los cambios de precio previstos.
Simulación de mercado: Position View (IV) Simulación de mercado: Position View (IV)
Aquí comenzaremos a unir diversos componentes o aplicaciones que antes estaban completamente aisladas entre sí. Aunque Chart Trade, el Indicador de Mouse y el Asesor Experto ya mantenían cierta relación, todavía no había una forma de observar directamente en el gráfico las posiciones abiertas en el servidor de trading, muchas veces usando un sistema de órdenes cruzadas. A partir de este momento, esto empieza a ser posible, abriendo diversas puertas a nuevas ideas e implementaciones futuras. Aunque apenas estamos comenzando a poner estos componentes en funcionamiento, ya tendremos un rumbo que seguir.
Algoritmo de mercado bursátil — Exchange Market Algorithm (EMA) Algoritmo de mercado bursátil — Exchange Market Algorithm (EMA)
Este artículo ofrece un análisis detallado del algoritmo de mercado bursátil (EMA), inspirado en el comportamiento de los tráders en el mercado de valores. El algoritmo simula el proceso de negociación de acciones, donde los participantes del mercado con distintos niveles de éxito emplean distintas estrategias para maximizar sus beneficios.