En la carga de los recursos... Cargando...

Tendencia cruzada de media móvil múltiple siguiendo una estrategia con filtro de volatilidad

El autor:¿ Qué pasa?, Fecha: 2024-07-29 13:37:09
Las etiquetas:- ¿Qué es?El EMALa SMALa WMAVWMAEl número de personas afectadasEl RMA

img

Resumen general

Esta estrategia es un sistema de negociación basado en múltiples cruces de promedios móviles y filtro de volatilidad. Utiliza tres promedios móviles de diferentes períodos para identificar las tendencias del mercado y utiliza un cuarto promedio móvil como punto de referencia para la determinación del mercado toro/oso. La estrategia también incorpora un indicador de volatilidad como filtro de negociación para evitar el comercio en entornos de baja volatilidad. Soporta posiciones largas y cortas y proporciona una gestión de posiciones flexible y mecanismos de stop-loss.

Principios de estrategia

  1. Selección de promedios móviles: La estrategia utiliza tres promedios móviles principales (a corto, mediano y largo plazo) para determinar tendencias. Los usuarios pueden elegir entre seis promedios móviles predefinidos, cada uno de los cuales puede configurarse individualmente con parámetros que incluyen período de cálculo, fuente de datos y tipo (por ejemplo, SMA, EMA).

  2. Determinación de la tendencia:

    • Tendencia alcista: Cuando el MA a corto plazo está por encima del MA a largo plazo y el MA a mediano plazo se cruza por encima del MA a largo plazo.
    • Tendencia bajista: Cuando el MA a corto plazo está por debajo del MA a largo plazo y el MA a mediano plazo se cruza por debajo del MA a largo plazo.
  3. Determinación del mercado toro/oso: se puede utilizar un cuarto promedio móvil opcional como línea divisoria para los mercados toro y oso.

  4. Filtro de volatilidad: se utiliza un indicador de volatilidad basado en los precios más altos y más bajos.

  5. Lógico de entrada:

    • Entrada larga: Se inicia una posición larga cuando se confirma una tendencia alcista, se cumplen las condiciones de volatilidad y el precio está por encima del MA a largo plazo.
    • Entrada corta: se inicia una posición corta cuando se confirma una tendencia bajista, se cumplen las condiciones de volatilidad y el precio está por debajo del MA a largo plazo.
  6. Lógico de salida:

    • Salida parcial: cierre de un cierto porcentaje de la posición cuando la tendencia se invierta (el MA a mediano plazo cruza de nuevo el MA a largo plazo).
    • Salida completa: Cierra todas las posiciones en la dirección opuesta cuando el precio cruza la línea divisoria de mercado alcista/bajista.
  7. Stop Loss: utiliza un porcentaje fijo de stop loss, que puede ser personalizado por el usuario.

  8. Gestión de posiciones: utiliza un porcentaje fijo del capital de la cuenta para cada operación, que puede ser personalizado por el usuario.

Ventajas estratégicas

  1. Análisis de tendencias multidimensional: al utilizar múltiples promedios móviles, la estrategia puede capturar las tendencias del mercado de manera más completa, reduciendo las señales falsas.

  2. Configuración de parámetros flexible: los usuarios pueden ajustar diversos parámetros de forma flexible de acuerdo con las características de los diferentes mercados e instrumentos de negociación, incluido el tipo de MA, el período y la fuente de datos.

  3. Filtración de volatilidad: al incorporar un indicador de volatilidad, la estrategia puede evitar el comercio en entornos de baja volatilidad, mejorando la calidad de la señal.

  4. Adaptación de los mercados alcista/bajista: el mecanismo opcional de determinación de los mercados alcista/bajista permite que la estrategia se adapte mejor a los diferentes entornos de mercado, reduciendo las operaciones contrarias a la tendencia.

  5. Gestión dinámica de posiciones: el método de gestión de posiciones basado en el capital ajusta automáticamente el tamaño de las operaciones a medida que el tamaño de la cuenta cambia.

  6. Control de riesgos en varias capas: incluye múltiples mecanismos de control de riesgos como el filtrado de volatilidad, la confirmación de tendencias, el cierre parcial de posiciones y el stop loss fijo.

  7. Negociación bidireccional: admite tanto posiciones largas como cortas, lo que permite oportunidades comerciales en diversas condiciones de mercado.

  8. Ayuda visual: La estrategia traza varias medias móviles y etiquetas de señales comerciales en el gráfico, lo que facilita el análisis intuitivo y las pruebas de retroceso.

Riesgos estratégicos

  1. Naturaleza de retraso: los promedios móviles son indicadores inherentemente retrasados, lo que puede llevar a un ligero retraso en el momento de entrada y salida, lo que afecta a la rentabilidad.

  2. Pobre desempeño en mercados variados: en los mercados laterales y agitados, la estrategia puede generar frecuentes señales falsas, lo que conduce a un exceso de operaciones y pérdidas.

  3. Sensibilidad a los parámetros: el rendimiento de la estrategia depende en gran medida de la configuración de los parámetros, y los diferentes mercados y plazos pueden requerir diferentes combinaciones de parámetros.

  4. Riesgo de reducción: durante las inversiones de tendencia, la estrategia puede no salir de las posiciones del todo a tiempo, lo que podría conducir a reducciones significativas.

  5. Exceso de confianza en los indicadores técnicos: La estrategia se basa enteramente en indicadores técnicos, ignorando los factores fundamentales, que pueden conducir a un bajo rendimiento durante las noticias o eventos importantes.

  6. Riesgo de gestión de capitales: el método de dimensionamiento de la posición por porcentaje fijo puede dar lugar a una exposición al riesgo excesiva durante pérdidas consecutivas.

  7. Establecimiento de stop loss: el porcentaje fijo de stop loss puede no ser adecuado para todos los entornos de mercado y podría dar lugar a salidas prematuras durante períodos de alta volatilidad.

Direcciones para la optimización de la estrategia

  1. Parámetros adaptativos: introducir mecanismos adaptativos para ajustar dinámicamente los parámetros de la media móvil y los umbrales de volatilidad en función de las condiciones del mercado.

  2. Análisis de marcos de tiempo múltiples: Incorporar información de marcos de tiempo más largos y más cortos para mejorar la precisión de la determinación de la tendencia.

  3. Optimización del indicador de volatilidad: Considere el uso de indicadores de volatilidad más sofisticados como ATR o Bollinger Bandwidth para una evaluación más precisa de la situación del mercado.

  4. Integración de indicadores de impulso: Combine indicadores de impulso como RSI o MACD para optimizar el tiempo de entrada y salida.

  5. Mejora del mecanismo de suspensión de pérdidas: aplicar suspensiones de retroceso o suspensiones de pérdidas dinámicas basadas en ATR para adaptarse mejor a la volatilidad del mercado.

  6. Integración del sentimiento del mercado: Incorporar indicadores del sentimiento del mercado como VIX para optimizar el rendimiento de la estrategia en diferentes entornos de mercado.

  7. Optimización de la gestión de posiciones: Implementar un dimensionamiento dinámico de las posiciones basado en la volatilidad o las ganancias/pérdidas actuales para un mejor control del riesgo.

  8. Adición de filtros fundamentales: Considere factores fundamentales como las publicaciones de datos económicos importantes o los informes de ganancias de las empresas para evitar negociar durante períodos de alto riesgo.

  9. Optimización del aprendizaje automático: utilizar algoritmos de aprendizaje automático para optimizar las combinaciones de parámetros y las reglas de decisión, mejorando la adaptabilidad de la estrategia.

  10. Pruebas posteriores y futuras: realizar pruebas posteriores y futuras más completas en diferentes mercados y períodos de tiempo para verificar la solidez de la estrategia.

Conclusión

La estrategia de seguimiento de tendencias de media móvil con filtro de volatilidad es un sistema de negociación integral y flexible que combina múltiples medias móviles, indicadores de volatilidad y principios de seguimiento de tendencias. A través del análisis de tendencias multidimensional y el estricto control de riesgos, la estrategia tiene el potencial de capturar tendencias persistentes en varios entornos de mercado. Sin embargo, los usuarios deben prestar atención a los problemas de optimización de parámetros y adaptabilidad del mercado, y considerar la introducción de indicadores técnicos más avanzados y técnicas de gestión de riesgos para mejorar aún más el rendimiento de la estrategia. En general, este es un marco sólido de estrategia que proporciona una buena base para una mayor investigación y optimización.


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)

Relacionados

Más.