Русский Português
preview
Análisis de las brechas temporales de precios en MQL5 (Parte I): Creando un indicador básico

Análisis de las brechas temporales de precios en MQL5 (Parte I): Creando un indicador básico

MetaTrader 5Sistemas comerciales |
65 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

En el trading algorítmico moderno, una de las tareas clave consiste en detectar la presencia de los grandes participantes del mercado. Los inversores institucionales, los fondos de cobertura y los bancos dejan huellas distintivas de sus actividades que los tráders experimentados pueden aprender a reconocer y utilizar en sus operaciones. Uno de los fenómenos más interesantes y menos estudiados es el de las brechas temporales: las zonas que el mercado atraviesa con tal rapidez que solo un sistema automatizado puede detectar ese patrón de eficiencia.

En este artículo, analizaremos el desarrollo de un indicador único para MetaTrader 5 que se especializa en la detección y el análisis automáticos de brechas temporales. Nuestra hipótesis principal es que, cuando entra un gran volumen de operaciones en el mercado, el precio se mueve a través de ciertas zonas de precios tan rápidamente que se crea una brecha temporal: un periodo en el que prácticamente no hay actividad de negociación en esa zona.


Fundamentos teóricos de las brechas temporales

Cuando un gran operador institucional toma la decisión de entrar en una posición, se enfrenta a un problema fundamental de liquidez. Para ejecutar el volumen requerido sin afectar significativamente el precio, se usa la ejecución algorítmica, con grandes órdenes distribuidas a lo largo del tiempo. También se utiliza la liquidez oculta a través de órdenes iceberg y dark pools, y a menudo se coordinan las acciones de varios fondos para sincronizar las entradas.

El resultado de dicha actividad es una situación en la que el precio atraviesa muy rápidamente una zona determinada, "vaciando" por completo toda la liquidez disponible. Después de eso, dicha zona permanece prácticamente "vacía" durante un tiempo prolongado, ya que los algoritmos institucionales ya han cumplido su tarea y han pasado a otros niveles de precios.

Un análisis de los distintos tipos de influencia institucional nos permite comprender mejor la mecánica de la formación de las brechas temporales:

Tipo de impacto institucional
Carácter del volumen
Velocidad de ejecución
Duración de la ausencia  Reacción típica durante el retesteo
Fondos de cobertura (de tamaño mediano)
5-20 millones de USD
Rápida (2-5 barras)
 8-15 barras Rebote fuerte (75%)
Fondos de pensiones
50-200 millones de USD
Lenta (10-20 barras)
 20-40 barras Rebote moderado (60%)
Bancos centrales
Más de 500 millones de USD
Muy rápida (1-3 barras)
 30-60 barras Rebote contundente (85%)


Modelo matemático

Para cuantificar las brechas temporales, hemos desarrollado un coeficiente de impacto volumétrico (CIV) que se calcula utilizando la fórmula:

КОВ = (V × ΔP × LF × SF) / (T²)

где:
V - объем сделок в зоне
ΔP - изменение цены при прохождении
LF - фактор ликвидности
SF - сессионный фактор активности
T - время исполнения в барах

La relación cuadrática con respecto al tiempo refleja un hecho fundamental: cuanto más rápido ocurre el movimiento del precio con un volumen significativo, más probable es el impacto de un gran operador institucional. Este aparato matemático permite la identificación automática de zonas con velocidades de ejecución de transacciones anormalmente altas.


Arquitectura del indicador

El indicador "Volume Time Gap Analysis" se basa en una arquitectura modular que incluye un módulo de escaneo para identificar posibles zonas de impacto, un motor analítico para calcular las características de las brechas, un sistema de monitoreo para rastrear las zonas activas y un módulo de visualización para mostrar los resultados en un gráfico.

La arquitectura se basa en la estructura VolumeTimeGap, que encapsula todas las características necesarias de la brecha temporal:

struct VolumeTimeGap
{
   datetime formation_time;           // Момент образования разрыва
   double   price_low, price_high;    // Границы ценовой зоны
   double   volume_concentration;     // Концентрация объемного воздействия
   double   institutional_footprint;  // Отпечаток институционального воздействия
   double   memory_strength;          // Сила рыночной памяти
   double   liquidation_speed;        // Скорость ликвидации позиций
   int      test_count;               // Количество тестирований зоны
   double   success_rate;             // Процент успешных отбоев
   bool     is_active;                // Статус активности разрыва
};

Esta estructura contiene tanto parámetros estáticos, determinados en el momento en que se forma la brecha, como características dinámicas, que se actualizan cada vez que el precio interactúa con la zona.


Algoritmo de detección de brechas temporales

El proceso de detección de brechas temporales es una secuencia compleja de operaciones. El primer paso consiste en crear una cuadrícula adaptativa que divida el rango de precios actual en zonas de análisis. La densidad de la cuadrícula se adapta de forma automática a la volatilidad del instrumento y a la profundidad del análisis.

La segunda fase consiste en un análisis forense de cada zona, que incluye un análisis detallado de las brechas temporales de presencia y ausencia del precio, el cálculo de las características volumétricas y la determinación de la velocidad de entrada y salida de la zona.

La tercera etapa consiste en la validación de la evidencia: una comprobación sistemática de si la evidencia es suficiente para confirmar la formación de una brecha temporal basada en criterios estadísticos rigurosos.

void ScanForVolumeTimeGaps(int analysis_depth)
{
   double highs[], lows[], opens[], closes[], volumes[];
   datetime times[];
   
   if(!PrepareMarketData(highs, lows, opens, closes, volumes, times, analysis_depth))
       return;
       
   double price_range_max = highs[ArrayMaximum(highs)];
   double price_range_min = lows[ArrayMinimum(lows)];
   double total_range = price_range_max - price_range_min;
   
   int grid_density = CalculateOptimalGridDensity(total_range);
   double grid_step = total_range / grid_density;
   
   for(int level = 0; level < grid_density; level++)
   {
       double zone_center = price_range_min + (level * grid_step);
       double zone_width = grid_step * Price_Zone_Sensitivity;
       
       AnalyzeZoneForVolumeGaps(zone_center - zone_width/2, 
                               zone_center + zone_width/2,
                               highs, lows, opens, closes, volumes, times);
   }
}
Cada zona potencial se somete a un análisis detallado. ZoneForensics, una estructura especializada, acumula sistemáticamente evidencia sobre la naturaleza del comportamiento de los precios en la zona analizada:
struct ZoneForensics
{
   int total_appearances;            // Общее количество появлений цены в зоне
   int longest_absence;              // Самый длинный период отсутствия
   double volume_burst_intensity;    // Интенсивность объемных всплесков
   double exit_velocity;             // Скорость покидания зоны
   datetime first_contact;           // Время первого контакта с зоной
   datetime last_contact;            // Время последнего контакта
};

El proceso de examen incluye el análisis de cada barra histórica determinando el hecho de si el precio se encuentra en la zona investigada, la medición de la intensidad de la actividad del volumen en cada contacto y el cálculo de las características de la velocidad de entrada y salida de la zona.


Criterios para la suficiencia de la evidencia

La creación de una brecha temporal solo se produce cuando se cumplen criterios estrictos de suficiencia de la señal. El sistema comprueba la duración mínima de ausencia de un precio en la zona, el tiempo máximo de estancia permitido, los valores umbral del impacto volumétrico y las características de velocidad.

bool IsEvidenceSufficientForGap(const ZoneForensics &evidence)
{
   if(evidence.longest_absence < Min_Gap_Bars) return false;
   if(evidence.total_appearances > Max_Time_In_Zone) return false;
   
   double volume_impact = CalculateVolumeImpactCoefficient(evidence);
   if(volume_impact < Volume_Impact_Threshold) return false;
   
   double velocity_score = evidence.exit_velocity / GetAverageMarketVelocity();
   if(velocity_score < VELOCITY_THRESHOLD) return false;
   
   double confidence_score = (volume_impact * 0.4) + 
                            (velocity_score * 0.3) + 
                            (evidence.longest_absence / Min_Gap_Bars * 0.3);
   
   return confidence_score > CONFIDENCE_THRESHOLD;
}

La evaluación integral del índice de confianza combina tres componentes clave: impacto volumétrico, características de velocidad y duración del brecha. Solo cuando se supera el valor umbral se crea una nueva brecha temporal.

La principal innovación de este indicador reside en el cálculo de la "huella institucional", una métrica compleja que evalúa cuantitativamente la probabilidad de presencia de un actor institucional importante en la formación de una zona. El cálculo se basa en el análisis de tres componentes: la concentración temporal de la actividad, la intensidad relativa del volumen y las características de velocidad del movimiento de los precios.

double CalculateInstitutionalFootprint(const ZoneForensics &evidence)
{
   double speed_component = (evidence.total_appearances > 0) ? 
       evidence.longest_absence / evidence.total_appearances : 0.0;
   
   double volume_component = evidence.volume_burst_intensity / GetAverageVolume(100);
   double velocity_component = evidence.exit_velocity / GetAverageMarketVelocity();
   
   return (speed_component * 0.4 + volume_component * 0.3 + velocity_component * 0.3);
}

El componente temporal refleja el grado de concentración de la actividad de negociación a lo largo del tiempo: cuanto mayor sea la proporción entre el periodo de ausencia y el periodo de presencia, mayor será la probabilidad de influencia institucional. El componente de volumen normaliza la intensidad de las operaciones en relación con la actividad media del mercado, mientras que el componente de velocidad mide la anomalía de la velocidad de los movimientos de precios.

Cada brecha temporal tiene una característica dinámica de "intensidad de memoria" que refleja el grado de influencia de la zona en el comportamiento actual del precio. La fuerza de la memoria evoluciona con el tiempo según una fórmula compleja que considera tanto el proceso natural de olvido del mercado de los acontecimientos históricos como los factores cíclicos de la actividad comercial.

void UpdateGapMemoryStrength(VolumeTimeGap &gap)
{
   double time_elapsed_hours = (double)(TimeCurrent() - gap.formation_time) / 3600.0;
   double base_decay_rate = 0.05;
   
   double daily_cycle = MathCos(2.0 * M_PI * time_elapsed_hours / 24.0);
   double cycle_factor = 1.0 + 0.1 * daily_cycle;
   
   gap.memory_strength = gap.institutional_footprint * 
                        MathExp(-base_decay_rate * time_elapsed_hours) * 
                        cycle_factor;
}

El decaimiento exponencial modela el proceso natural de la disminución de la influencia de los eventos históricos en los precios actuales. El componente cíclico considera las fluctuaciones diarias de la actividad comercial, lo que refleja el hecho de que la influencia de las zonas institucionales puede fortalecerse o debilitarse dependiendo de la hora de la sesión comercial.

Un elemento importante del sistema es el seguimiento automático del momento en que se “cierra” o “rellena” la brecha temporal. Esto ocurre cuando el precio atraviesa completamente la zona, lo cual demuestra que el interés institucional en este nivel se ha agotado.

bool IsGapBeingMitigated(double current_price, const VolumeTimeGap &gap)
{
   for(int i = 0; i < 5; i++)
   {
      double high = iHigh(_Symbol, PERIOD_CURRENT, i);
      double low = iLow(_Symbol, PERIOD_CURRENT, i);
      double open = iOpen(_Symbol, PERIOD_CURRENT, i);
      double close = iClose(_Symbol, PERIOD_CURRENT, i);
      
      if((high >= gap.price_high && low <= gap.price_low) ||
         (open >= gap.price_high && close <= gap.price_low) ||
         (open <= gap.price_low && close >= gap.price_high))
      {
         return true;
      }
   }
   return false;
}

Cuando se detecta el cierre de una brecha, el sistema cambia automáticamente la visualización de la zona, pasando al estado de "cerrada" y notificando al tráder sobre el final del ciclo de vida de este nivel institucional.


Adaptación a las particularidades de los diferentes instrumentos.

Los instrumentos Forex se caracterizan por una alta liquidez y una volatilidad relativamente baja, lo cual requiere reducir Volume_Impact_Threshold al rango de 1,5-2,0 y reducir Min_Gap_Bars a 5-10 barras. La naturaleza continua del comercio de divisas hace que las brechas temporales sean menos pronunciadas, pero más estables a lo largo del tiempo.

El mercado de valores, con su estructura de sesiones y periodos de cierre, crea las condiciones naturales para la formación de brechas temporales. Los ajustes recomendados incluyen un Volume_Impact_Threshold en el rango de 2,0 a 3,0 y un Min_Gap_Bars de 8 a 15 barras. Debemos prestar especial atención a las brechas que se producen durante los periodos de eventos corporativos y elaboración de informes.

Los mercados de criptomonedas se caracterizan por una volatilidad extrema y la presencia de grandes actores institucionales, lo cual requiere aumentar el Volume_Impact_Threshold a 2,5-4,0 y, simultáneamente, reducir el Min_Gap_Bars a 3-8 barras debido a la alta velocidad de los movimientos de precios.


Señales del indicador

Las brechas temporales ofrecen oportunidades únicas para generar señales de trading de alta calidad. La señal más efectiva es un rebote desde el límite de la brecha cuando el precio se acerca a la zona y muestra signos de reversión. La probabilidad de un rebote exitoso está directamente correlacionada con la fuerza de la memoria de la brecha y sus estadísticas de pruebas anteriores.

La señal de cierre de la brecha surge cuando el precio atraviesa completamente la zona y puede utilizarse para negociar si continúa el movimiento en la dirección del cierre. Resultan de particular interés las señales de ruptura falsas, que se producen cuando un intento fallido de cerrar una brecha da lugar a un fuerte movimiento en la dirección opuesta.

En mi caso, lo que mejor funciona son los rebotes:

Este indicador ha sido probado con bastante éxito en la cuenta:


Conclusión y perspectivas

El indicador identifica zonas de actividad institucional usando un modelo matemático, la evaluación de la memoria del mercado y un sistema de notificación. Mejora las señales de otros métodos y ayuda a gestionar los riesgos con mayor precisión.

Este indicador muestra una eficacia particular como parte de sistemas de negociación complejos, complementando y mejorando las señales de otros métodos de análisis técnico. La capacidad de cuantificar la calidad de cada señal de negociación permite adoptar enfoques diferenciados para la gestión de riesgos y el posicionamiento.

Los planes de desarrollo incluyen:

  • aprendizaje automático para la adaptación a instrumentos específicos;
  • nuevas métricas basadas en la microestructura del mercado;
  • versiones para diferentes clases de activos;
  • análisis en múltiples marcos temporales para la elaboración de estrategias multinivel.

La implementación del análisis de múltiples marcos temporales nos permitirá identificar estructuras jerárquicas de brechas temporales, donde grandes zonas institucionales en marcos temporales superiores contienen muchas brechas más pequeñas en periodos inferiores. Esto descubrirá nuevas oportunidades para desarrollar estrategias de negociación multinivel con diferentes horizontes de planificación.


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

Archivos adjuntos |
Валерий Смирнов
Валерий Смирнов | 28 jun 2025 en 08:14

Buenos días! Hay advertencias durante la compilación, he adjuntado una captura de pantalla.

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 26): Herramienta de patrones pin bar y envolventes con divergencia del RSI (patrones múltiples) Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 26): Herramienta de patrones pin bar y envolventes con divergencia del RSI (patrones múltiples)
En línea con nuestro objetivo de desarrollar herramientas prácticas basadas en la acción del precio, este artículo analiza la creación de un Asesor Experto (EA) que detecta patrones de «pin bar» y «engulfing», utilizando la divergencia del RSI como señal de confirmación antes de generar cualquier señal de trading.
Algoritmo de ecolocalización de delfines — Dolphin Echolocation Algorithm (DEA) Algoritmo de ecolocalización de delfines — Dolphin Echolocation Algorithm (DEA)
En este artículo, analizaremos más de cerca el algoritmo DEA, un método de optimización metaheurística inspirado en la capacidad única de los delfines para encontrar presas mediante la ecolocalización. Desde los fundamentos matemáticos hasta la implementación práctica en MQL5, desde el análisis hasta la comparación con algunos algoritmos clásicos, examinaremos con detalle por qué este método relativamente nuevo merece un lugar en el arsenal de quienes se enfrentan a problemas de optimización.
Particularidades del trabajo con números del tipo double en MQL4 Particularidades del trabajo con números del tipo double en MQL4
En estos apuntes hemos reunido consejos para resolver los errores más frecuentes al trabajar con números del tipo double en los programas en MQL4.
Automatización de estrategias de trading en MQL5 (Parte 18): Estrategia de scalping «Trend Bounce» con envolventes: infraestructura básica y generación de señales (Parte I) Automatización de estrategias de trading en MQL5 (Parte 18): Estrategia de scalping «Trend Bounce» con envolventes: infraestructura básica y generación de señales (Parte I)
En este artículo, desarrollamos la infraestructura básica del asesor experto «Envelopes Trend Bounce Scalping» en MQL5. Inicializamos las envolventes y otros indicadores para la generación de señales. Preparamos el entorno de backtesting para preparar la ejecución de operaciones en la siguiente parte.