Matriz de media móvil adaptativa multidimensional y estrategia de trading de precisión dinámica ATR

MA ATR HMA TEMA DEMA VWMA ZLEMA ALMA KAMA EMA SMA WMA
Fecha de creación: 2025-04-16 15:50:36 Última modificación: 2025-04-16 15:50:36
Copiar: 0 Número de Visitas: 412
2
Seguir
319
Seguidores

Matriz de media móvil adaptativa multidimensional y estrategia de trading de precisión dinámica ATR Matriz de media móvil adaptativa multidimensional y estrategia de trading de precisión dinámica ATR

Descripción general

La estrategia de trading de precisión dinámica de la MAM con ATR es un sistema de trading cuantitativo avanzado diseñado para condiciones de mercado que cambian rápidamente. El núcleo de la estrategia consiste en la combinación de varios tipos de filtros de medias móviles y ATR (medio real amplitud de onda) para formar una matriz de trading altamente flexible y adaptable. Al capturar con precisión las tendencias y la volatilidad del mercado, la estrategia es capaz de identificar entradas y salidas de alta probabilidad en entornos de negociación de alta frecuencia, al tiempo que aplica estrictas medidas de control de riesgo.

Principio de estrategia

El principio central de la estrategia se basa en el trabajo conjunto de varios componentes clave:

  1. Matriz de promedio móvil de alto nivelLa estrategia implementa hasta 11 tipos diferentes de promedios móviles, incluyendo SMA, EMA, SMMA, HMA, TEMA, WMA, VWMA, ZLEMA, ALMA, KAMA y DEMA. Cada tipo de promedio móvil tiene su propio método de cálculo y características de respuesta, que se pueden elegir con flexibilidad según las condiciones del mercado. El sistema utiliza dos promedios móviles (Fast y Slow) como indicadores principales de tendencias, y sus cruces y posiciones relativas se utilizan para generar señales de negociación básicas.

  2. Gestión de riesgos basada en ATRLa estrategia utiliza el indicador ATR para medir la volatilidad del mercado y lo aplica en varios aspectos:

    • Evaluación de la volatilidad: uso de la ATR en relación con el precio de cierre como criterio de filtración de la volatilidad
    • Filtros de entrada: aseguran que el precio debe mantenerse a una distancia suficiente de la media móvil lenta para entrar
    • Control de riesgo dinámico: establecimiento de paradas fijas, ganancias objetivo y paradas de seguimiento basadas en ATR para adaptar la gestión de riesgos a la volatilidad actual del mercado
  3. Filtrado de tendencias de marcos de tiempo múltiples: estrategia para aumentar la fiabilidad de la señal mediante la consulta de las tendencias de las medias móviles en los marcos de tiempo más altos (<15 minutos), asegurando que la dirección de las operaciones esté en consonancia con las tendencias del mercado más grande.

  4. Verificación de la cantidad y ventana de tiempoLas operaciones se ejecutan solo cuando se cumplen los requisitos mínimos de volumen de transacción, se produce un avance de volumen de transacción y se ejecutan dentro de una ventana de tiempo de transacción predefinida, lo que mejora aún más la calidad de las transacciones.

  5. Logía de generación de señales

    • Condiciones de múltiples cabezas: precios superiores a las medias móviles rápida y lenta, medias móviles rápidas superiores a medias móviles lentas, y cumplimiento de los filtros ATR, condiciones de volumen de transacción y requisitos de ventana de tiempo
    • Condición de cabeza vacía: condiciones equivalentes en el caso contrario
  6. Logía de salida integralLa estrategia utiliza un mecanismo de salida de tres niveles: stop-loss fijo (multiples de ATR), profit target (multiples de ATR) y stop-loss tracking (ajustes dinámicos basados en ATR) para proporcionar una protección de riesgo completa para cada operación.

Ventajas estratégicas

Al analizar el código de la estrategia, se pueden resumir las siguientes ventajas destacadas:

  1. Una adaptabilidad extraordinaria: A través de varios tipos de medias móviles intercambiables (de HMA a KAMA, etc.), la estrategia puede adaptarse a diferentes condiciones del mercado. Esta flexibilidad permite al comerciante elegir el mejor indicador en función del entorno de mercado actual sin tener que volver a escribir toda la estrategia.

  2. Gestión de riesgos dinámicosEl mecanismo de control de riesgo basado en ATR asegura que los objetivos de stop loss y profit se ajusten automáticamente a la volatilidad del mercado. Este método ofrece una mejor protección en mercados con mayor volatilidad, mientras que permite capturar más ganancias en mercados con tendencias.

  3. Filtración de señales en varias capas: La estrategia reduce efectivamente las señales erróneas y mejora la calidad de las operaciones mediante la combinación de cruce de medias móviles, análisis de volumen de transacción, volatilidad de los mínimos y filtración de tendencias en múltiples marcos de tiempo. En particular, la función de filtración de tendencias en los marcos de tiempo de 15 minutos reduce significativamente la posibilidad de operaciones contraproducentes.

  4. Las condiciones exactas de ingresoLa estrategia no solo se basa en el cruce de indicadores técnicos, sino que también requiere que los precios mantengan una distancia ATR suficiente entre ellos y las medias móviles lentas, lo que ayuda a evitar el comercio frecuente en mercados horizontales y reduce las pérdidas causadas por brechas falsas.

  5. Monitoreo de rendimiento transparenteEl panel de instrumentos incorporado proporciona una visualización en tiempo real de los indicadores de rendimiento clave, incluidos los beneficios/pérdidas actuales, el capital, el ATR (valor bruto y porcentaje) y la diferencia entre las medias móviles, lo que permite al comerciante evaluar el estado de la estrategia en cualquier momento.

Riesgo estratégico

A pesar de la buena concepción de la estrategia, existen los siguientes riesgos potenciales:

  1. Trampas de optimización de parámetrosLa estrategia contiene una gran cantidad de parámetros (tipo y ciclo de las medias móviles, ATR y multiplicadores, etc.) y la optimización excesiva puede conducir a la adaptación de la curva, lo que hace que la estrategia no funcione bien en el comercio de discos reales. La solución es realizar pruebas sólidas entre mercados y períodos de tiempo para evitar ajustes excesivos de los parámetros.

  2. El riesgo de una rápida reversiónA pesar de la utilización de los paros dinámicos ATR, en el caso de una reversión repentina del mercado (por ejemplo, después de una publicación de noticias importantes), los precios pueden saltar antes de que se active el parón, lo que puede provocar pérdidas superiores a las esperadas. Se recomienda la aplicación de controles de riesgo nocturnos adicionales o suspender la negociación antes de eventos de alta volatilidad.

  3. La señal está retrasada.: Todas las medias móviles son inherentemente retardadas. Incluso las variantes de baja latencia como HMA o ZLEMA pueden perder el punto de entrada ideal en un mercado rápido. Se puede considerar la combinación de indicadores de movimiento o de comportamiento del precio para complementar los sistemas de señales existentes.

  4. Dependencia en el volumen de ventas: La estrategia emite una señal cuando el volumen de negocios aumenta, pero en algunos mercados o períodos de tiempo, el volumen de negocios puede ser engañoso. Si es necesario, ajuste el filtro de volumen de negocios o considere desactivar esta función en condiciones específicas de mercado.

  5. Limitación de la ventana de tiempoSe recomienda ajustar el horario de negociación en función de los momentos más activos de un mercado en particular.

Dirección de optimización de la estrategia

Después de analizar el código, las siguientes son algunas posibles direcciones de optimización:

  1. Ajuste de los parámetros de adaptaciónUna optimización avanzada es la realización de parámetros que se ajustan automáticamente en función de la situación del mercado (trend, volatilidad, rango). Por ejemplo, se puede aumentar automáticamente el ATR durante períodos de alta volatilidad o cambiar de tipo de promedio móvil en diferentes entornos de mercado.

  2. Integración de modelos de aprendizaje automático: mediante la introducción de una capa de aprendizaje automático para predecir qué tipo de promedio móvil podría funcionar mejor en las condiciones actuales del mercado, para seleccionar automáticamente la combinación de promedios móviles óptima. Esto se puede hacer mediante el análisis del rendimiento relativo de los diferentes indicadores en los datos históricos.

  3. Identificación de las tendencias de mejoraAdemás de los filtros de tendencia de 15 minutos existentes, se pueden incorporar algoritmos de identificación de tendencias más complejos, como el índice Hurst o el indicador de movimiento direccional (DMI), para determinar con mayor precisión la intensidad y la continuidad de las tendencias.

  4. Mejorar las estrategias de salidaLas estrategias de salida actuales pueden optimizarse aún más mediante la adición de señales de salida basadas en la estructura del mercado, como la ruptura de la línea de tendencia, los puntos clave de soporte/resistencia o los cambios bruscos en la volatilidad. Esto puede ayudar a bloquear los beneficios antes de que la tendencia termine.

  5. El tamaño de las posiciones ajustadas al riesgo: Realizar un ajuste dinámico de la escala de la posición basado en la volatilidad actual y el capital de la cuenta, en lugar de usar un número fijo de operaciones. Por ejemplo, reducir la posición durante la alta volatilidad y aumentar moderadamente la posición durante la baja volatilidad para optimizar el riesgo-rendimiento.

  6. Filtrado de mercados relevantesAumentar la calidad de la señal mediante la monitorización de los mercados relevantes (como el VIX cuando se negocian índices de acciones) o la correlación entre activos. Aumentar la credibilidad de las operaciones cuando los mercados relevantes muestran un movimiento direccional consistente.

Resumir

La estrategia multi-dimensional de auto-adaptación de la matriz de medias móviles y la estrategia de trading de precisión dinámica ATR representan un método de trading cuantitativo completo y avanzado. Al combinar las ventajas de varios tipos de medias móviles con un control de riesgo básico riguroso de ATR, la estrategia es capaz de adaptarse a diferentes condiciones de mercado mientras se mantiene una buena gestión de riesgos.

El verdadero valor de la estrategia reside en su flexibilidad y adaptabilidad, que permite a los operadores adaptarse a los mercados específicos y a las preferencias de riesgo personalizadas. Hay potencial para mejorar aún más el rendimiento de la estrategia a través de la dirección de optimización sugerida, en particular, el ajuste de parámetros de adaptación y la integración de aprendizaje automático.

Para los operadores que buscan utilizar un sistema tecnológico y disciplinado en un entorno de negociación de alta frecuencia, esta estrategia ofrece un marco sólido, combinado con la precisión técnica y el control del riesgo, que son esenciales. Es importante que los operadores verifiquen el rendimiento de la estrategia en su mercado objetivo mediante una revisión exhaustiva y simulación de operaciones, y realicen los ajustes necesarios en función del entorno de negociación específico.

Código Fuente de la Estrategia
/*backtest
start: 2024-04-16 00:00:00
end: 2025-04-15 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Dskyz (DAFE) MAtrix with ATR-Powered Precision", 
     overlay=true, 
     default_qty_type=strategy.fixed, 
     initial_capital=1000000, 
     commission_value=0, 
     slippage=1, 
     pyramiding=10)

// ==================================================================
// USER-DEFINED FUNCTIONS
// ==================================================================

// Hull Moving Average (HMA)
hma(src, len) =>
    halfLen = math.round(len * 0.5)
    sqrtLen = math.round(math.sqrt(len))
    wmaf = ta.wma(src, halfLen)
    wmaFull = ta.wma(src, len)
    ta.wma(2 * wmaf - wmaFull, sqrtLen)

// Triple Exponential Moving Average (TEMA)
tema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    ema3 = ta.ema(ema2, len)
    3 * (ema1 - ema2) + ema3

// Double Exponential Moving Average (DEMA)
dema(src, len) =>
    ema1 = ta.ema(src, len)
    ema2 = ta.ema(ema1, len)
    2 * ema1 - ema2

// VWMA - Volume Weighted Moving Average
vwma(src, len) =>
    ta.vwma(src, len)

// ZLEMA - Zero Lag EMA
zlema(src, len) =>
    lag = math.floor((len - 1) / 2)
    ta.ema(2 * src - src[lag], len)

// ALMA - Arnaud Legoux Moving Average
alma(src, len, offset=0.85, sigma=6) =>
    ta.alma(src, len, offset, sigma)

// Custom Kaufman Adaptive Moving Average (KAMA)
kama(src, len) =>
    fastSC = 2.0 / (2 + 1)
    slowSC = 2.0 / (30 + 1)
    change = math.abs(src - src[len])
    volatility = 0.0
    for i = 0 to len - 1
        volatility += math.abs(src - src[i])
    er = volatility != 0 ? change / volatility : 0.0
    sc = math.pow(er * (fastSC - slowSC) + slowSC, 2)
    var float kama_val = na
    kama_val := na(kama_val) ? ta.sma(src, len) : kama_val + sc * (src - kama_val)
    kama_val

// ==================================================================
// INPUTS
// ==================================================================

fastLength   = input.int(9, "[MA] Fast MA Length", minval=1)
slowLength   = input.int(19, "[MA] Slow MA Length", minval=1)
fastMAType   = input.string("SMA", "Fast MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])
slowMAType   = input.string("SMA", "Slow MA Type", options=["SMA", "EMA", "SMMA", "HMA", "TEMA", "WMA", "VWMA", "ZLEMA", "ALMA", "KAMA", "DEMA"])

atrPeriod           = input.int(14, "ATR Period", minval=1)
atrMultiplier       = input.float(1.5, "ATR Multiplier for Filter", minval=0.1, step=0.1)
useTrendFilter      = input.bool(true, "[Filter Settings] Use 15m Trend Filter")
minVolume           = input.int(10, "Minimum Volume", minval=1)
volatilityThreshold = input.float(1.0, "Volatility Threshold (%)", minval=0.1, step=0.1) / 100
tradingStartHour    = input.int(9, "Trading Start Hour (24h)", minval=0, maxval=23)
tradingEndHour      = input.int(16, "Trading End Hour (24h)", minval=0, maxval=23)
trailOffset         = input.float(0.5, "[Exit Settings] Trailing Stop Offset ATR Multiplier", minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, "Profit Target ATR Multiplier", minval=0.1, step=0.1)
fixedStopMultiplier = input.float(1.3, "Fixed Stop Multiplier", minval=0.5, step=0.1)
fixedQuantity       = input.int(2, "Trade Quantity", minval=1)

resetDashboard      = input.bool(false, "Reset Dashboard Stats")

// ==================================================================
// CALCULATIONS
// ==================================================================

volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR Calculation
atr          = ta.atr(atrPeriod)
volatility   = nz(atr / close, 0)
volatilityOk = volatility <= volatilityThreshold

// ==================================================================
// MOVING AVERAGES CALCULATIONS
// ==================================================================

var float fastMA = na
var float slowMA = na

// Fast MA Logic
if fastMAType == "SMA"
    fastMA := ta.sma(close, fastLength)
else if fastMAType == "EMA"
    fastMA := ta.ema(close, fastLength)
else if fastMAType == "SMMA"
    fastMA := ta.rma(close, fastLength)
else if fastMAType == "HMA"
    fastMA := hma(close, fastLength)
else if fastMAType == "TEMA"
    fastMA := tema(close, fastLength)
else if fastMAType == "WMA"
    fastMA := ta.wma(close, fastLength)
else if fastMAType == "VWMA"
    fastMA := vwma(close, fastLength)
else if fastMAType == "ZLEMA"
    fastMA := zlema(close, fastLength)
else if fastMAType == "ALMA"
    fastMA := alma(close, fastLength)
else if fastMAType == "KAMA"
    fastMA := kama(close, fastLength)
else if fastMAType == "DEMA"
    fastMA := dema(close, fastLength)

// Slow MA Logic
if slowMAType == "SMA"
    slowMA := ta.sma(close, slowLength)
else if slowMAType == "EMA"
    slowMA := ta.ema(close, slowLength)
else if slowMAType == "SMMA"
    slowMA := ta.rma(close, slowLength)
else if slowMAType == "HMA"
    slowMA := hma(close, slowLength)
else if slowMAType == "TEMA"
    slowMA := tema(close, slowLength)
else if slowMAType == "WMA"
    slowMA := ta.wma(close, slowLength)
else if slowMAType == "VWMA"
    slowMA := vwma(close, slowLength)
else if slowMAType == "ZLEMA"
    slowMA := zlema(close, slowLength)
else if slowMAType == "ALMA"
    slowMA := alma(close, slowLength)
else if slowMAType == "KAMA"
    slowMA := kama(close, slowLength)
else if slowMAType == "DEMA"
    slowMA := dema(close, slowLength)

// ==================================================================
// TREND FILTER & SIGNAL LOGIC
// ==================================================================

// Retrieve 15-minute MAs for trend filtering
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, "15", [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m    = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0
trendLongOk = not useTrendFilter or trend15m >= 0
trendShortOk= not useTrendFilter or trend15m <= 0

// ATR-based Price Filter
atrFilterLong  = close > slowMA + atr * atrMultiplier
atrFilterShort = close < slowMA - atr * atrMultiplier

// Signal Logic: MA alignment + filters
maAbove       = close > fastMA and fastMA > slowMA
maBelow       = close < fastMA and fastMA < slowMA
longCondition = maAbove and trendLongOk and atrFilterLong and volumeOk and volumeSpike and timeWindow and volatilityOk
shortCondition= maBelow and trendShortOk and atrFilterShort and volumeOk and volumeSpike and timeWindow and volatilityOk

// ==================================================================
// ENTRY LOGIC
// ==================================================================

if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, qty=fixedQuantity)
if strategy.position_size == 0 and shortCondition
    strategy.entry("Short", strategy.short, qty=fixedQuantity)

// ==================================================================
// EXIT LOGIC
// ==================================================================
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long",
         stop  = strategy.position_avg_price - atr * fixedStopMultiplier,
         limit = strategy.position_avg_price + atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)
if strategy.position_size < 0
    strategy.exit("Short Exit", "Short",
         stop  = strategy.position_avg_price + atr * fixedStopMultiplier,
         limit = strategy.position_avg_price - atr * profitTargetATRMult,
         trail_offset = atr * trailOffset,
         trail_points = atr * trailOffset)

// ==================================================================
// VISUALS: PLOT MAs
// ==================================================================

plot(fastMA, color=color.blue, linewidth=2, title="Fast MA")
plot(slowMA, color=color.red, linewidth=2, title="Slow MA")

// ==================================================================
// METRICS CALCULATIONS (for Dashboard)
// ==================================================================

// Additional metrics:
atrPct   = close != 0 ? (atr / close) * 100 : na               // ATR as percentage of Close
maGapPct = (slowMA != 0) ? (math.abs(fastMA - slowMA) / slowMA) * 100 : na  // % difference between MAs

// Open PnL Calculation
currentPnL = strategy.position_size != 0 ? (close - strategy.position_avg_price) * strategy.position_size : 0

// Persistent variable for highest equity (for drawdown calculation)
var float highestEquity = strategy.equity
highestEquity := math.max(highestEquity, strategy.equity)
totalDrawdown = strategy.equity - highestEquity

// Reset dashboard metrics if reset toggle is on.
if resetDashboard
    highestEquity := strategy.equity

// ==================================================================
// DASHBOARD: WATERMARK LOGO (Bottom-Right)
// ==================================================================
var table watermarkTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
if barstate.islast
    table.cell(watermarkTable, 0, 0, "⚡ Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)

// ==================================================================
// DASHBOARD: METRICS TABLE (Bottom-Left)
// ==================================================================
var table dashboard = table.new(position.middle_right, 2, 12, bgcolor=color.new(#000000, 29), border_color=color.rgb(80, 80, 80), border_width=1)
if barstate.islast
    // Row 0 – Dashboard Title (duplicated in both columns to simulate spanning)
    table.cell(dashboard, 0, 0, "⚡(DAFE) Trading Systems", text_color=color.rgb(135, 135, 135), text_size=size.small)
    
    // Row 1 – Position
    table.cell(dashboard, 0, 1, "Position", text_color=color.gray)
    positionText = strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat"
    table.cell(dashboard, 1, 1, positionText, text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    
    // Row 2 – Current PnL
    table.cell(dashboard, 0, 2, "Current P/L", text_color=color.gray)
    table.cell(dashboard, 1, 2, str.tostring(currentPnL, "#.##"), text_color=(currentPnL > 0 ? color.green : currentPnL < 0 ? color.red : color.gray))
    
    // Row 3 – Equity
    table.cell(dashboard, 0, 3, "Equity", text_color=color.gray)
    table.cell(dashboard, 1, 3, str.tostring(strategy.equity, "#.##"), text_color=color.white)

    // Row 4 – Closed Trades
    table.cell(dashboard, 0, 4, "Closed Trades", text_color=color.gray)
    table.cell(dashboard, 1, 4, str.tostring(strategy.closedtrades), text_color=color.white)

    // Row 5 – Title Step
    table.cell(dashboard, 0, 5, "Metrics", text_color=color.rgb(76, 122, 23))
   
    // Row 6 – Fast MA
    table.cell(dashboard, 0, 6, "Fast MA", text_color=color.gray)
    table.cell(dashboard, 1, 6, str.tostring(fastMA, "#.##"), text_color=color.white)
    
    // Row 7 – Slow MA
    table.cell(dashboard, 0, 7, "Slow MA", text_color=color.gray)
    table.cell(dashboard, 1, 7, str.tostring(slowMA, "#.##"), text_color=color.white)
    
    // Row 8 – ATR (Raw)
    table.cell(dashboard, 0, 8, "ATR", text_color=color.gray)
    table.cell(dashboard, 1, 8, str.tostring(atr, "#.##"), text_color=color.white)
    
    // Row 9 – ATR (%)
    table.cell(dashboard, 0, 9, "ATR (%)", text_color=color.gray)
    table.cell(dashboard, 1, 9, str.tostring(atrPct, "#.##") + "%", text_color=color.white)
    
    // Row 10 – MA Gap (%)
    table.cell(dashboard, 0, 10, "MA Gap (%)", text_color=color.gray)
    table.cell(dashboard, 1, 10, na(maGapPct) ? "N/A" : str.tostring(maGapPct, "#.##") + "%", text_color=color.white)
    
    // Row 11 – Volatility (%)
    table.cell(dashboard, 0, 11, "Volatility (%)", text_color=color.gray)
    table.cell(dashboard, 1, 11, str.tostring(volatility * 100, "#.##") + "%", text_color=color.white)