Estrategia de filtrado de volatilidad y seguimiento de tendencias de cruce de medias móviles múltiples

MA EMA SMA WMA VWMA SMMA RMA
Fecha de creación: 2024-07-29 13:37:09 Última modificación: 2024-07-29 13:37:09
Copiar: 0 Número de Visitas: 636
1
Seguir
1617
Seguidores

Estrategia de filtrado de volatilidad y seguimiento de tendencias de cruce de medias móviles múltiples

Descripción general

La estrategia es un sistema de trading de seguimiento de tendencias basado en múltiples cruces de medias móviles y filtros de volatilidad. Utiliza medias móviles de tres períodos diferentes para identificar tendencias en el mercado y usa una cuarta media móvil como referencia para juzgar un mercado alcista o bajista. La estrategia también introduce un indicador de volatilidad como condición de filtro de negociación para evitar el comercio en entornos de baja volatilidad.

Principio de estrategia

  1. Selección de promedios móviles: la estrategia utiliza tres promedios móviles principales para juzgar la tendencia: a corto plazo, a mediano plazo y a largo plazo. El usuario puede elegir entre seis promedios móviles predefinidos, y cada promedio móvil puede configurar los parámetros individualmente, incluidos el período de cálculo, la fuente de datos y el tipo (como SMA, EMA, etc.).

  2. En cuanto a las tendencias:

    • Tendencia múltiple: cuando la media a corto plazo es superior a la media a largo plazo y la media a mediano plazo cruza la media a largo plazo hacia arriba.
    • Tendencia inversa: cuando la media a corto plazo está por debajo de la media a largo plazo y la media a mediano plazo cruza la media a largo plazo hacia abajo.
  3. El juicio del mercado alcista y bajista: se puede optar por usar la cuarta media móvil como la línea divisoria del mercado alcista y bajista. Cuando el precio está por encima de esta línea, solo se permite hacer más; a la inversa, solo se permite hacer menos.

  4. Filtración de fluctuaciones: utiliza un indicador de fluctuaciones basado en precios máximos y mínimos. La estrategia emite una señal de negociación solo cuando la fluctuación supera el umbral establecido por el usuario.

  5. Logía de entrada:

    • Entrada múltiple: se hace más cuando se confirma la tendencia múltiple, se cumplen las condiciones de volatilidad y el precio es superior a la media a largo plazo.
    • Entrada en blanco: se abre una posición en blanco cuando se confirma la tendencia en blanco, se cumplen las condiciones de volatilidad y el precio está por debajo de la media a largo plazo.
  6. La lógica de salida:

    • Posicionamiento parcial: cuando la tendencia se invierte (la media intermedia se cruza nuevamente con la media a largo plazo), se elimina una cierta proporción de la posición.
    • Todas las posiciones en equilibrio: cuando el precio cruza la línea divisoria del mercado alcista y bajista, se eliminan todas las posiciones en sentido contrario.
  7. Detención de pérdidas: el porcentaje de pérdidas fijo es el que el usuario puede personalizar.

  8. Administración de posiciones: Cada vez que se abre una posición, el usuario puede personalizar el porcentaje fijo de los derechos y intereses de la cuenta.

Ventajas estratégicas

  1. Análisis multidimensional de tendencias: mediante el uso de múltiples medias móviles, las estrategias pueden capturar las tendencias del mercado de manera más completa y reducir las falsas señales.

  2. Configuración de parámetros flexible: El usuario puede ajustar los parámetros de forma flexible, incluidos el tipo de línea promedio, el período y la fuente de datos, según las características de los diferentes mercados y variedades de transacciones.

  3. Filtración de la tasa de fluctuación: mediante la introducción de indicadores de la tasa de fluctuación, la estrategia permite evitar el comercio en entornos de baja volatilidad y mejorar la calidad de la señal.

  4. Adaptación a los mercados alcista y bajista: los mecanismos de decisión al alza y bajista permiten que las estrategias se adapten mejor a diferentes entornos de mercado, reduciendo las operaciones adversas.

  5. Gestión de posiciones dinámica: un método de gestión de posiciones basado en los intereses de la cuenta que permite ajustar automáticamente el tamaño de las transacciones según el tamaño de la cuenta.

  6. Control de riesgo a múltiples niveles: incluye filtros de fluctuación, confirmación de tendencias, posiciones cerradas parciales y paradas fijas.

  7. Negociación bidireccional: soporte para hacer más y hacer menos, con la capacidad de buscar oportunidades de negociación en diversos entornos de mercado.

  8. Ayuda visual: la estrategia traza las etiquetas de las medias móviles y las señales de negociación en los gráficos para facilitar el análisis y la retroalimentación visual.

Riesgo estratégico

  1. Retraso: el promedio móvil es un indicador de retraso en la naturaleza, lo que puede causar ligeros retrasos en el tiempo de entrada y salida, lo que afecta la rentabilidad.

  2. Los mercados convulsivos no funcionan bien: en los mercados convulsivos horizontales, las estrategias pueden generar señales falsas con frecuencia, lo que lleva a una sobrecambio y pérdidas.

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

  4. Riesgo de retroceso: la estrategia puede no estar en juego a tiempo y causar un retroceso mayor si la tendencia se invierte.

  5. Exceso de dependencia de indicadores técnicos: Las estrategias se basan exclusivamente en indicadores técnicos y ignoran los factores fundamentales, lo que puede hacer que no funcionen bien cuando ocurren noticias o eventos importantes.

  6. Riesgo de gestión de fondos: el método de gestión de posiciones de proporción fija puede generar una abertura de riesgo excesiva en caso de pérdidas continuas.

  7. Establecimiento de stop loss: el stop loss porcentual fijo puede no ser aplicable en todos los entornos de mercado y puede causar un stop loss prematuro en períodos de alta volatilidad.

Dirección de optimización de la estrategia

  1. Parámetros de adaptación: Introducción de un mecanismo de adaptación para ajustar los parámetros de las medias móviles y los umbrales de volatilidad en función de la dinámica de las condiciones del mercado.

  2. Análisis de múltiples marcos de tiempo: combinación de información de marcos de tiempo más largos y más cortos para mejorar la precisión de los juicios de tendencias.

  3. Optimización de indicadores de volatilidad: Considere el uso de indicadores de volatilidad más complejos, como el ATR o el Bollinger Bandwidth, para evaluar con mayor precisión la situación del mercado.

  4. Introducción de indicadores de dinámica: combinación de indicadores de dinámica como el RSI o el MACD para optimizar el tiempo de entrada y salida.

  5. Mejora de los mecanismos de stop loss: implementación de stop loss de seguimiento o stop loss dinámico basado en ATR para adaptarse mejor a las fluctuaciones del mercado

  6. Integración de los indicadores de sentimiento de mercado: introducción de indicadores de sentimiento de mercado como VIX, estrategias de optimización para el desempeño en diferentes entornos de mercado.

  7. Optimización de la gestión de posiciones: Realización de la gestión de posiciones dinámicas basadas en la volatilidad o la pérdida actual, para un mejor control del riesgo.

  8. Añadir un filtro básico: considerar factores básicos como la publicación de datos económicos importantes o los resultados de las empresas y evitar el comercio durante los períodos de alto riesgo.

  9. Optimización de aprendizaje automático: optimización de la combinación de parámetros y las reglas de decisión con algoritmos de aprendizaje automático para mejorar la adaptabilidad de las estrategias.

  10. Retrospectiva y pruebas de avance: realice una retrospectiva más completa y pruebas de avance en diferentes mercados y períodos de tiempo para verificar la solidez de la estrategia.

Resumir

La estrategia de seguimiento de tendencias de cruce de líneas medias múltiples y filtración de la tasa de fluctuación es un sistema de negociación completo y flexible que combina múltiples promedios móviles, indicadores de la tasa de fluctuación y principios de seguimiento de tendencias. A través de un análisis de tendencias multidimensional y un control riguroso del riesgo, la estrategia tiene el potencial de capturar tendencias continuas en una variedad de entornos de mercado.

Código Fuente de la Estrategia
/*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)