Estrategia de trading cuantitativo con intervalo de media móvil ponderada de marco temporal alto

WMA HTF TP/SL Zone Trading Breakout Strategy risk management
Fecha de creación: 2025-05-26 14:50:17 Última modificación: 2025-05-26 14:50:17
Copiar: 0 Número de Visitas: 249
2
Seguir
319
Seguidores

Estrategia de trading cuantitativo con intervalo de media móvil ponderada de marco temporal alto Estrategia de trading cuantitativo con intervalo de media móvil ponderada de marco temporal alto

Descripción general

La estrategia de comercio de brechas cuantitativas de brechas de barras de movimiento ponderadas en el rango de las horas altas es un sistema de comercio basado en brechas de barras de precios que combina las medias móviles ponderadas en el rango de las horas altas (WMA) y los intervalos porcentuales para construir zonas de comercio. La estrategia genera señales de entrada mediante la identificación de situaciones en las que el precio se rompe en la vía o en la vía baja, y aplica una configuración de ganancias y pérdidas por lotes para administrar el riesgo. El núcleo de la estrategia es usar medias móviles ponderadas en marcos de tiempo más altos para eliminar el ruido del mercado a corto plazo y luego construir zonas de comercio en el marco de tiempo actual, lo que hace que las decisiones de comercio sean más estables y confiables.

Principio de estrategia

El principio básico de esta estrategia es el uso de promedios móviles ponderados en marcos de tiempo altos para construir un intervalo de actividad de precios. Los pasos concretos para su implementación son los siguientes:

  1. En primer lugar, la estrategia calcula un promedio móvil ponderado de los precios de apertura, máximo, mínimo y cierre (WMA), basado en el mínimo parámetro de ciclo establecido por el usuario (default 60).
  2. Luego, la estrategia convierte estos valores de WMA de un marco de tiempo más alto (la línea lunar por defecto) al marco de tiempo de negociación actual.
  3. Calcula el punto medio de la media móvil ponderada más baja y más alta como precio central.
  4. Basado en el precio central y el porcentaje definido por el usuario ((0.1 o 10% por defecto), se construye un punto de resistencia en la vía ascendente y un punto de apoyo en la vía descendente).
  5. Cuando el precio sube, se activa la señal de multiplicación; cuando el precio baja, se activa la señal de ruptura.
  6. La estrategia tiene dos objetivos de stop loss (el 10% y el 20% por defecto) y cada objetivo tiene una posición parcial en el mercado libre (el 50% por defecto).
  7. Al mismo tiempo, se establece un stop loss (el 5% por defecto) para limitar las pérdidas potenciales.

La estrategia utiliza elementos visuales como cambios en el color de fondo, gráficos personalizados y marcas de entrada/salida para permitir a los operadores identificar intuitivamente el intervalo de negociación y el estado actual del mercado. Además, la estrategia muestra el cambio porcentual de las posiciones actuales y aplica el factor multiplicador (default 20) para resaltar los cambios en los precios.

Ventajas estratégicas

Un análisis más profundo del código de esta estrategia revela las siguientes ventajas:

  1. Filtro de las horas altasA través del uso de promedios móviles ponderados en un marco de tiempo más alto, la estrategia es capaz de filtrar eficazmente el ruido del mercado a corto plazo, capturar movimientos de precios más significativos y reducir las señales falsas.

  2. Zona de comercio dinámicoLa estrategia consiste en construir rangos de negociación basados en el punto medio del precio y el porcentaje de cambio, adaptándose a las diferentes condiciones y fluctuaciones del mercado, evitando las limitaciones de los puntos de soporte/resistencia fijos.

  3. Reglas claras de entrada y salidaLa estrategia proporciona señales de entrada claras (breakout up/down tracks) y reglas de salida (stop and stop loss batch), eliminando la subjetividad en las decisiones comerciales.

  4. Integración de la gestión de riesgosEl sistema de bloqueo de pérdidas y lotes integrado ayuda a proteger el capital y bloquear las ganancias, y es un sistema de negociación completo.

  5. La respuesta visual es abundante.La estrategia ofrece una gran cantidad de elementos visuales, incluyendo el color de fondo de la zona de negociación, las etiquetas de cambio de porcentaje y los indicadores de entrada/salida, para ayudar a los operadores a evaluar rápidamente la situación del mercado.

  6. Ajustes de parámetros flexibles: El usuario puede ajustar varios parámetros de acuerdo con las preferencias personales y las diferentes condiciones del mercado, incluyendo el marco de tiempo, el ciclo de las medias móviles, el porcentaje de la proporción, el nivel de stop/stop y los elementos visuales.

  7. Coordinación de marcos de tiempo múltiples: La estrategia combina la calidad de la señal en el marco de tiempo alto y la precisión de ejecución en el marco de tiempo actual, logrando la coordinación de múltiples marcos de tiempo.

Riesgo estratégico

A pesar de las ventajas de esta estrategia, también existen riesgos potenciales:

  1. Hacerse con una señal falsa: Los precios pueden romper temporalmente los límites de la zona y luego retroceder, lo que lleva a una señal de negociación errónea. Para mitigar este riesgo, se puede considerar agregar mecanismos de confirmación, como requerir que los precios permanezcan durante un tiempo después de la ruptura o en combinación con otros indicadores.

  2. No es adecuado para un mercado de alta volatilidadEn un mercado muy volátil, los precios pueden romper los límites de los intervalos con frecuencia, lo que puede conducir a exceso de transacciones y pérdidas potenciales. En este caso, se puede aumentar la tasa de intervalo o cambiar a un marco de tiempo más alto.

  3. El porcentaje fijo de stop loss/stopstop no es lo suficientemente flexibleLa volatilidad del mercado cambia con el tiempo, y un porcentaje fijo de stop/stop puede no ser siempre el mejor. Se puede considerar ajustar dinámicamente los niveles de stop/stop basados en indicadores de volatilidad (como el ATR).

  4. Sensibilidad de los parámetrosEl rendimiento de la estrategia puede ser altamente sensible a la configuración de los parámetros, como el ciclo WMA, la relación de intervalos y el porcentaje de stop/stop. Es necesario realizar una revisión histórica adecuada y optimizar los parámetros.

  5. El riesgo de optimización excesiva: La adaptación excesiva de datos históricos específicos puede conducir a un mal desempeño futuro. Se recomienda realizar retrospectivas en varios mercados y períodos de tiempo y mantener los parámetros relativamente estables.

  6. Adaptabilidad a las tendencias cambiantes del mercado: La estrategia no ajusta su intervalo a las nuevas tendencias del mercado después de una ruptura de intervalo, lo que puede causar señales erróneas en mercados de fuerte tendencia. Se puede considerar agregar filtros de tendencia o intervalo de ajuste dinámico.

Dirección de optimización de la estrategia

Basado en un análisis en profundidad del código, la estrategia puede ser optimizada en las siguientes direcciones:

  1. Añadir un mecanismo de confirmación de la brechaPara reducir las falsas rupturas, se pueden agregar condiciones de confirmación adicionales, como la confirmación del precio de cierre después de la ruptura, la confirmación del volumen de transacción o la confirmación cruzada con otros indicadores técnicos (como RSI, MACD).

  2. Ajuste de pérdida dinámica: sustitución de los paros por ciento fijos por paros dinámicos basados en la volatilidad del mercado, como el uso de ATR (Average True Range) multiplicado por el nivel de paros para que la estrategia se adapte mejor a las diferentes condiciones del mercado.

  3. Añadir un filtro de tendencias: agregar componentes de identificación de tendencias, como los promedios móviles a largo plazo o el indicador ADX, para ajustar el comportamiento de negociación en mercados con una fuerte tendencia, por ejemplo, hacer solo más en una tendencia alcista y hacer solo menos en una tendencia bajista.

  4. Optimizar el tiempo de ingresoLa estrategia actual es entrar inmediatamente cuando el precio acaba de cruzar la frontera de la zona, se puede considerar esperar una llamada de retorno o la confirmación de una forma específica para mejorar la calidad de la oportunidad de entrada.

  5. Añadir un módulo de gestión de fondosCálculo del tamaño de las posiciones más complejo: ajuste dinámico del tamaño de las posiciones basado en el tamaño de la cuenta, la volatilidad del mercado y el riesgo de las transacciones actuales, en lugar de usar posiciones fijas.

  6. Añadir un filtro de estado de mercadoIdentificar el estado del mercado (como tendencia, oscilación intermedia o alta volatilidad) y ajustar los parámetros de la estrategia o suspender la negociación en función de la situación del mercado.

  7. Implementación de parámetros adaptativosPermitir que los parámetros clave, como la tasa de intervalo, el ciclo WMA, se ajusten automáticamente en función de la volatilidad histórica u otras características del mercado para mejorar la adaptabilidad de la estrategia.

  8. Integración de señales de marco de tiempo múltiple: No sólo se puede utilizar el WMA de un marco de tiempo alto para construir un intervalo, sino que también se puede analizar el comportamiento de los precios y los indicadores de varios marcos de tiempo, permitiendo un análisis de mercado más completo y decisiones de negociación.

Resumir

La estrategia de trading de breakout de la cuantificación de las medias móviles ponderadas en el marco de tiempo alto es un sistema de negociación bien estructurado que se construye para capturar oportunidades de breakout de precios mediante la combinación de medias móviles ponderadas en el marco de tiempo alto y el marco dinámico. La estrategia tiene la ventaja de su capacidad de filtrado de marcos de tiempo alto, reglas de negociación claras, mecanismos de gestión de riesgos incorporados y una gran cantidad de retroalimentación visual. Sin embargo, también enfrenta desafíos como breakout de señales falsas, sensibilidad a los parámetros y adaptabilidad al mercado.

La estabilidad y la rentabilidad de la estrategia se pueden mejorar aún más mediante la implementación de direcciones de optimización recomendadas, como la adición de mecanismos de confirmación de ruptura, configuraciones de parada de pérdidas dinámicas, filtros de tendencias y parámetros de adaptación. Lo más importante es que el comerciante entienda completamente los principios de la estrategia y realice una adecuada retroalimentación histórica para ajustar los parámetros de acuerdo con el mercado específico y las preferencias de riesgo personales para aprovechar al máximo el potencial de la estrategia.

Esta estrategia basada en rupturas por rangos es adecuada para los operadores a medio y largo plazo, especialmente para aquellos que buscan capturar brechas de precios importantes mientras mantienen el control del riesgo. Con la optimización y adaptación continuas, esta estrategia puede convertirse en una poderosa arma en la caja de herramientas de los operadores.

Código Fuente de la Estrategia
/*backtest
start: 2025-01-01 00:00:00
end: 2025-05-25 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy('ZONE FLOW', overlay=true)

// Input parameters
src = close
src1 = open
src2 = low
src3 = high
Min = input(60, title='Minimum Period')
len = timeframe.isintraday and timeframe.multiplier >= 1 ? Min / timeframe.multiplier * 7 : timeframe.isintraday and timeframe.multiplier < 60 ? 60 / timeframe.multiplier * 24 * 7 : 7

c1 = ta.wma(src, len)
o1 = ta.wma(src1, len)
l1 = ta.wma(src2, len)
h1 = ta.wma(src3, len)

HTF = input.timeframe('M', title='Higher Time Frame')
ti = ta.change(time(HTF)) != 0
c = fixnan(ti ? c1 : na)
o = fixnan(ti ? o1 : na)
h = fixnan(ti ? h1 : na)
l = fixnan(ti ? l1 : na)

// Calculating mid-point
m = (h + l) / 2

// Calculating ratio lines
ratio = input.float(0.1, title='% ratio', minval=0.001, maxval=10)
r1 = m * ratio
u = m + r1
d = m - r1

// Take profit settings
takeProfitPercentage1 = input.float(10.0, title='Take Profit 1 (%)', minval=0.1, maxval=100.0) / 100
takeProfitQuantity1 = input.float(50.0, title='Take Profit 1 Quantity (%)', minval=0.1, maxval=100.0) / 100
takeProfitPercentage2 = input.float(20.0, title='Take Profit 2 (%)', minval=0.1, maxval=100.0) / 100
takeProfitQuantity2 = input.float(50.0, title='Take Profit 2 Quantity (%)', minval=0.1, maxval=100.0) / 100

// Stop loss settings
stopLossPercentage = input.float(5.0, title='Stop Loss (%)', minval=0.1, maxval=100.0) / 100

// Number of bars to extend lines
extensionBars = input.int(5, title='Number of Bars to Extend Lines', minval=1)

// Number of bars to offset the percentage label
percentOffsetBars = input.int(25, title='Number of Bars to Offset Percentage Label', minval=1)

// Input for multiplying the percentage change
multiplierFactor = input.int(20, title='Multiplier for Percentage Change', minval=1)

// Input for background colors
bgColor1 = input(color.new(color.blue, 90), title='Background Color 1')
bgColor2 = input(color.new(color.orange, 90), title='Background Color 2')

// Plot high, low, and ratio lines
ppo = plot(u, color=color.new(color.blue, 0), title='Upper Line (Resistance)', style=plot.style_stepline)
ppc = plot(d, color=color.new(color.orange, 0), title='Lower Line (Support)', style=plot.style_stepline)

plot(u, color=color.new(color.blue, 0), title='Upper Line (Resistance)', style=plot.style_circles, linewidth=2)
plot(d, color=color.new(color.orange, 0), title='Lower Line (Support)', style=plot.style_circles, linewidth=2)

// Fill the background between ratio lines with two different colors
fill(ppo, ppc, color=bgColor1)

// Calculate mid-point for background color switching
midPoint = (u + d) / 2
bgColorSwitch = close >= midPoint ? bgColor1 : bgColor2
fill(ppo, ppc, color=bgColorSwitch, transp=90)

// Initialize variables for lines and labels
var line tp1Line = na
var line tp2Line = na
var line stopLossLine = na
var line entryLine = na
var label tp1Label = na
var label tp2Label = na
var label stopLossLabel = na
var label entryLabel = na
var label percentLabel = na

// Variable to store the entry bar index
var int entryBarIndexLong = na
var int entryBarIndexShort = na

// Function to delete old labels and lines
deleteOldLinesAndLabels() =>
    if not na(tp1Line)
        line.delete(tp1Line)
    if not na(tp2Line)
        line.delete(tp2Line)
    if not na(stopLossLine)
        line.delete(stopLossLine)
    if not na(entryLine)
        line.delete(entryLine)
    if not na(tp1Label)
        label.delete(tp1Label)
    if not na(tp2Label)
        label.delete(tp2Label)
    if not na(stopLossLabel)
        label.delete(stopLossLabel)
    if not na(entryLabel)
        label.delete(entryLabel)
    if not na(percentLabel)
        label.delete(percentLabel)

// Strategy logic
longCondition = ta.crossover(close, u)
shortCondition = ta.crossunder(close, d)

if longCondition
    strategy.entry('Long', strategy.long)
    entryBarIndexLong := bar_index
    entryBarIndexLong

if shortCondition
    strategy.entry('Short', strategy.short)
    entryBarIndexShort := bar_index
    entryBarIndexShort

// Calculate take profit and stop loss levels for long positions
if strategy.position_size > 0  // Check if there's an open long position
    takeProfitLevelLong1 = strategy.position_avg_price * (1 + takeProfitPercentage1)
    takeProfitLevelLong2 = strategy.position_avg_price * (1 + takeProfitPercentage2)
    stopLossLevelLong = strategy.position_avg_price * (1 - stopLossPercentage)
    entryPrice = strategy.position_avg_price

    // Delete existing lines and labels if they exist
    deleteOldLinesAndLabels()


    // Exit a portion of the position at each take profit level
    strategy.exit('TP1', 'Long', limit=takeProfitLevelLong1, qty=strategy.position_size * takeProfitQuantity1)
    strategy.exit('TP2', 'Long', limit=takeProfitLevelLong2, qty=strategy.position_size * takeProfitQuantity2)
    strategy.exit('Stop Loss', 'Long', stop=stopLossLevelLong)

    // Display percentage change from entry price
    percentChange = (close - strategy.position_avg_price) / strategy.position_avg_price * 100
    percentMultiplied = percentChange * multiplierFactor
    percentColor = percentChange >= 0 ? color.green : color.red
    // Update label position to follow price line with larger text size
    percentLabel := label.new(x=bar_index + percentOffsetBars, y=close, text=str.tostring(percentMultiplied, format.percent) + '%', color=percentColor, textcolor=color.white, size=size.large, style=label.style_label_down)
    percentLabel

if strategy.position_size < 0  // Check if there's an open short position
    takeProfitLevelShort1 = strategy.position_avg_price * (1 - takeProfitPercentage1)
    takeProfitLevelShort2 = strategy.position_avg_price * (1 - takeProfitPercentage2)
    stopLossLevelShort = strategy.position_avg_price * (1 + stopLossPercentage)
    entryPrice = strategy.position_avg_price

    // Delete existing lines and labels if they exist
    deleteOldLinesAndLabels()


    // Exit a portion of the position at each take profit level
    strategy.exit('TP1', 'Short', limit=takeProfitLevelShort1, qty=strategy.position_size * takeProfitQuantity1)
    strategy.exit('TP2', 'Short', limit=takeProfitLevelShort2, qty=strategy.position_size * takeProfitQuantity2)
    strategy.exit('Stop Loss', 'Short', stop=stopLossLevelShort)

    // Display percentage change from entry price
    percentChange = (strategy.position_avg_price - close) / strategy.position_avg_price * 100
    percentMultiplied = percentChange * multiplierFactor
    percentColor = percentChange >= 0 ? color.green : color.red
    // Update label position to follow price line with larger text size
    percentLabel := label.new(x=bar_index + percentOffsetBars, y=close, text=str.tostring(percentMultiplied, format.percent) + '%', color=percentColor, textcolor=color.white, size=size.large, style=label.style_label_down)
    percentLabel

// Add buy and sell signals with shapes
plotshape(series=longCondition, title='Buy Signal', location=location.belowbar, color=color.new(color.green, 0), style=shape.labelup, text='.')
plotshape(series=shortCondition, title='Sell Signal', location=location.abovebar, color=color.new(color.red, 0), style=shape.labeldown, text='.')

// Remove old labels when they go out of scope
if bar_index % 50 == 0
    deleteOldLinesAndLabels()

// Define colors for candles based on background color
candleColorBull = bgColorSwitch  // Use background color for bullish candles
candleColorBear = bgColorSwitch  // Use background color for bearish candles
borderColorBull = color.black  // Border color for bullish candles
borderColorBear = color.black  // Border color for bearish candles

// Plot candles with custom colors
plotcandle(open, high, low, close, color=close >= open ? candleColorBull : candleColorBear, bordercolor=close >= open ? borderColorBull : borderColorBear, wickcolor=color.gray)