Símbolos personalizados MQL5: Creamos un símbolo de barras 3D
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
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Teoría de grafos: Aplicación del algoritmo de Dijkstra al trading
Exploramos modelos de regresión para inferencia causal y operaciones bursátiles
Simulación de mercado: Position View (IV)
Algoritmo de mercado bursátil — Exchange Market Algorithm (EMA)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso