Mira cómo descargar robots gratis
¡Búscanos en Facebook!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Indicadores

KCI Standard: A Pure Kinematic Computing Engine for Market Singularity Detection - indicador para MetaTrader 5

Syamsurizal Dimjati
Syamsurizal Dimjati
Hello traders, I design and develop high-quality indicators and Expert Advisors (EAs) for MT5 (since 2023), built to help you achieve more consistent and reliable trading results.
| Spanish English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Visualizaciones:
12
Ranking:
(1)
Publicado:
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Resumen

El Índice de Compresión Cinética (KCI) es un oscilador personalizado diseñado para detectar el agotamiento del mercado y los eventos de compresión localizados. Al calcular sus métricas cinemáticas internamente, en lugar de basarse en indicadores estándar externos, el KCI reduce la sobrecarga y simplifica la gestión de búferes para la integración con los Asesores Expertos (EA). Este artículo detalla los fundamentos matemáticos, la arquitectura del sistema, la asignación de búferes y las guías prácticas de integración para los desarrolladores que deseen implementar esta herramienta en MetaTrader 5.


Introducción

En el trading algorítmico, reducir la dependencia de múltiples indicadores externos puede optimizar la arquitectura de un Asesor Experto. La llamada a múltiples indicadores iCustom o estándar (como medias móviles y desviaciones estándar) puede, en ocasiones, complicar la gestión de los búferes y los procesos de inicialización.

El KCI está diseñado para procesar datos de precios y volumen de forma nativa en un único archivo. Al identificar una desaceleración rápida en el movimiento de los precios combinada con caídas de volumen, su objetivo es detectar eventos de agotamiento —puntos en los que es estadísticamente probable que se produzca una reversión a la media local—.

Planteamiento del problema

Los objetivos principales de la arquitectura del KCI son:

  1. Reducir la dependencia de los «handles»: calcular medias móviles y desviaciones de forma nativa dentro del bucle del indicador para minimizar el uso de «handles» externos.

  2. Proporcionar métricas reproducibles: Ofrecer a los EA métricas matemáticas claras y transparentes (velocidad, desviación y dispersión).

  3. Garantizar la seguridad asíncrona: crear búferes de señales que solo se validen en barras cerradas, protegiendo al EA del repintado intrabarral y de los retrasos asíncronos en los datos de ticks.

Teoría y fundamentos matemáticos

El KCI se basa en cuatro métricas fundamentales. Para garantizar una reproducibilidad total, las fórmulas básicas se definen de la siguiente manera (donde $n$ es el «BasePeriod»):

Teoría y fundamentos matemáticos

Figura del texto:

1. **Velocity Quotient (VQ)** – Measures the rate of price change.
VQ_i=\frac{Close_i-Close_{i-n}}{n}
Where:
- \(Close_i\) = current closing price
- \(Close_{i-n}\) = closing price \(n\) bars ago
- \(n\) = lookback period

2. **Kinetic Displacement (KD)** – Measures the deviation of the current price from its local mean.
KD_i=Close_i-SMA(Close,n)_i
Where:
- \(SMA(Close,n)_i\) = Simple Moving Average of the closing price over the last \(n\) periods.
3. **Energy Dispersion (ED)** – Acts as a dynamic volatility proxy, calculated as the standard deviation of the closing price.
ED_i=\sqrt{\frac{\sum_{j=0}^{n-1}\left(Close_{i-j}-SMA_i\right)^2}{n}}
Where:
- \(SMA_i\) = local Simple Moving Average at bar \(i\).

4. **Phase Velocity (PV)** – Tracks the immediate momentum of the Velocity Quotient.
PV_i=VQ_i-VQ_{i-1}
Where:
- \(VQ_i\) = current Velocity Quotient
- \(VQ_{i-1}\) = previous Velocity Quotient

// Or

1. Velocity Quotient (VQ)
VQ(i) = (Close(i) - Close(i-n)) / n

2. Kinetic Displacement (KD)
KD(i) = Close(i) - SMA(Close, n)

3. Energy Dispersion (ED)
                n-1
               -----
               \
ED(i) = sqrt(  /    (Close(i-j) - SMA(i))² / n )
               -----
               j=0

4. Phase Velocity (PV)
PV(i) = VQ(i) - VQ(i-1)



Normalización mediante la puntuación Z:
dado que estas cuatro métricas tienen escalas diferentes (por ejemplo, precios frente a tipos puros), se normalizan utilizando una puntuación Z móvil a lo largo de un «ZScorePeriod» definido antes de sumarlas en el «Raw_KCI».

    Arquitectura del sistema y mapa de búfer unificado

    Para evitar los habituales errores de «índice fuera de límites» o de desajuste de búfer durante las llamadas a CopyBuffer(), el KCI se ajusta estrictamente al siguiente mapa de búfer unificado. Esta asignación es coherente en las declaraciones #property, SetIndexBuffer() y la integración de EA.

    Índice del búfer Nombre del búfer Tipo Finalidad
    0 KCI_Main INDICATOR_DATA Línea del oscilador polarizado visual
    1 KCI_Color ÍNDICE_DE_COLORES_DEL_INDICADOR Asignación dinámica de colores para la línea principal
    2 Señal_Compra INDICATOR_DATA Señal de compra (1,0 = Compra, 0,0 = Neutral)
    3 Señal_Venta DATOS_DEL_INDICADOR Señal de venta (1,0 = Venta, 0,0 = Neutral)
    4 VQ_interno CÁLCULOS_DEL_INDICADOR Matriz del cociente de velocidad
    5 Internal_KD CÁLCULOS_DE_INDICADORES Matriz de desplazamiento cinético
    6 Internal_ED CÁLCULOS_DE_INDICADORES Matriz de dispersión de energía (utilizada para SL/TP)
    7 Internal_PV CÁLCULOS_DE_INDICADORES Matriz de velocidad de fase
    8 Raw_KCI CÁLCULOS_DE_INDICADORES Suma de matrices normalizadas

    Explicación del código: Integración de EA y gestión de riesgos

    Al llamar a KCI desde un EA, el código debe gestionar el ciclo de vida del identificador del indicador, verificar que CopyBuffer haya recuperado correctamente los datos y normalizar todos los cálculos de precios para el Stop Loss (SL) y el Take Profit (TP) de acuerdo con los dígitos del símbolo.

    A continuación se muestra la plantilla de integración de EA corregida y robusta:

    #include <Trade\Trade.mqh>
    CTrade trade;
    
    int handle_kci;
    datetime last_bar_time = 0;
    double buf_buy[], buf_sell[], buf_ed[];
    
    int OnInit()
    {
        // Inicializar el identificador de KCI
        handle_kci = iCustom(_Symbol, _Period, "KCI", 50, 2.0, 14);
        
        if(handle_kci == INVALID_HANDLE) 
        {
            Print("Failed to create KCI handle!");
            return(INIT_FAILED);
        }
        
        ArraySetAsSeries(buf_buy, true);
        ArraySetAsSeries(buf_sell, true);
        ArraySetAsSeries(buf_ed, true);
        
        return(INIT_SUCCEEDED);
    }
    
    void OnDeinit(const int reason)
    {
        if(handle_kci != INVALID_HANDLE)
            IndicatorRelease(handle_kci);
    }
    
    void OnTick()
    {
        datetime current_time = (datetime)SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE);
        if(current_time == last_bar_time) return; 
        
        // Filtro básico: solo una posición por símbolo
        if(PositionsTotal() > 0) 
        {
            for(int i = PositionsTotal() - 1; i >= 0; i--)
            {
                if(PositionGetSymbol(i) == _Symbol) return; 
            }
        }
    
        // Recuperar datos (búfer 2 = compra, búfer 3 = venta, búfer 6 = ED)
        if(CopyBuffer(handle_kci, 2, 1, 1, buf_buy) <= 0) return;
        if(CopyBuffer(handle_kci, 3, 1, 1, buf_sell) <= 0) return;
        if(CopyBuffer(handle_kci, 6, 1, 1, buf_ed) <= 0) return;
    
        // Bloquear la hora SOLO después de que los datos se hayan copiado correctamente
        last_bar_time = current_time;
    
        double dynamic_volatility = buf_ed[0];
        if(dynamic_volatility == 0) return;
    
        double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
        int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
        double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
        // Lógica de ejecución con stop loss de volatilidad dinámica normalizada
        if(buf_buy[0] == 1.0)
        {
            double sl = NormalizeDouble(ask - (dynamic_volatility * 1.5), digits);
            double tp = NormalizeDouble(ask + (dynamic_volatility * 3.0), digits);
            trade.Buy(0.01, _Symbol, ask, sl, tp, "KCI Buy");
        }
        
        if(buf_sell[0] == 1.0)
        {
            double sl = NormalizeDouble(bid + (dynamic_volatility * 1.5), digits);
            double tp = NormalizeDouble(bid - (dynamic_volatility * 3.0), digits);
            trade.Sell(0.01, _Symbol, bid, sl, tp, "KCI Sell");
        }
    }

    Rendimiento y limitaciones

    Para garantizar unas expectativas realistas, los desarrolladores deben tener en cuenta las siguientes limitaciones estructurales:

    1. Dependencia del volumen de ticks: En el caso del Forex y los CFD, «tick_volume» representa la frecuencia de las variaciones de precio, no la liquidez real. La métrica de compresión volumétrica puede comportarse de forma diferente en las bolsas centralizadas (acciones/futuros), donde se dispone del volumen real.

    2. Vulnerabilidad a la reversión a la media: al ser un oscilador acotado, el KCI tiene como objetivo detectar el agotamiento. En un mercado con una tendencia fuerte, puede generar señales de reversión prematuras consecutivas. Debe combinarse con un filtro de tendencia en un marco temporal superior (por ejemplo, la EMA 200).

    3. Ruido en los marcos temporales cortos: el uso de este indicador en M1 o M5 expone la lógica al ruido de la microestructura. La normalización mediante la puntuación Z requiere una distribución estable, que se encuentra mejor en M15 y marcos temporales superiores.

    Conclusión

    El Índice de Compresión Cinética ofrece una alternativa transparente y calculada de forma nativa al apilamiento de múltiples indicadores estándar. Al mostrar tanto las señales direccionales en las barras cerradas como un indicador dinámico de volatilidad (dispersión de energía) a través de un mapa de búfer unificado, sirve como un componente estructural fiable para los asesores expertos de MQL5.

    Implementación en el gráfico: (KCI personalizado)

    El índice de compresión cinética (KCI) personalizado

    Traducción del inglés realizada por MetaQuotes Ltd.
    Artículo original: https://www.mql5.com/en/code/74580

    EA KCI Embeded Sniper EA KCI Embeded Sniper

    El KCI Embedded Sniper es una solución de trading algorítmico diseñada para entradas de reversión de alta precisión. A diferencia de los Expert Advisors convencionales, que dependen de indicadores externos (los cuales suelen adolecer de desincronización de subprocesos y latencia), este EA cuenta con un motor del Índice de Compresión Cinética (KCI) totalmente integrado. Al integrar todo el marco matemático del KCI —el cálculo de los cocientes de velocidad, el desplazamiento cinético, la dispersión de energía y la velocidad de fase— directamente en la lógica central del EA, hemos eliminado el «retraso asíncrono». El resultado es un motor de «francotirador» ultrarrápido que valida el agotamiento del mercado (Singularidad) y los extremos de impulso (Williams %R) con precisión de microsegundos, operando únicamente sobre barras completadas para garantizar un rendimiento sin repintado.

    Multi-Timeframe Candle Map Multi-Timeframe Candle Map

    Un panel educativo de MT5 que representa gráficamente el precio en tiempo real de forma vertical dentro de cuatro velas en formación y resume la alineación de las posiciones, la dispersión, la dirección de las velas y el tiempo restante.

    Accumulation/Distribution Accumulation/Distribution

    El indicador Accumulation/Distribution (Acumulación/Distribución) queda determinado por los cambios que se producen en el precio y en el volumen.

    Accelerator Oscillator (AC) Accelerator Oscillator (AC)

    El indicador Acceleration/Deceleration (AC, Aceleración/Desaceleración) mide la aceleración y la desaceleración de la fuerza impulsora del mercado.