Estrategia de impulso de ruptura de rebote de triple fondo

EMA ATR MA SMA
Fecha de creación: 2025-01-10 15:49:30 Última modificación: 2025-01-10 15:49:30
Copiar: 0 Número de Visitas: 401
1
Seguir
1617
Seguidores

Estrategia de impulso de ruptura de rebote de triple fondo

Descripción general

Esta estrategia es un sistema de trading cuantitativo basado en el análisis técnico, que opera principalmente identificando patrones de triple fondo y señales de ruptura de impulso en el mercado. La estrategia combina múltiples indicadores técnicos como el cruce de medias móviles (MA), rango verdadero (ATR), canal de precios, etc. para construir un sistema de trading completo. Esta estrategia realiza la identificación automática y la ejecución de transacciones del patrón de rebote de triple fondo de manera programada.

Principio de estrategia

La lógica central de la estrategia incluye los siguientes elementos clave:

  1. Utilice el cruce de los promedios móviles rápidos (5 períodos) y lentos (20 períodos) para confirmar la dirección de la tendencia del mercado
  2. El programa identifica automáticamente tres puntos bajos consecutivos (bajo 1, bajo 2, bajo 3) para formar un patrón de triple fondo.
  3. Utilice el indicador ATR para calcular la volatilidad y establecer niveles dinámicos de stop loss y take profit
  4. Después del tercer mínimo, cuando el precio rompe el máximo de rebote anterior, combinado con la señal de cruce de la media móvil, confirma el momento de entrar en largo.
  5. Crear canales paralelos para visualizar rangos de movimiento de precios y proporcionar referencias de mercado adicionales
  6. Establezca condiciones dinámicas de stop loss y take profit en función del ATR en el momento de la ejecución de la operación

Ventajas estratégicas

  1. Combine múltiples indicadores técnicos para mejorar la confiabilidad de las señales comerciales
  2. Utilice ATR para ajustar dinámicamente las posiciones de stop loss y take profit para adaptarse a los cambios en la volatilidad del mercado
  3. Identificar automáticamente patrones de triple fondo para reducir el impacto del juicio subjetivo
  4. Establezca límites en el intervalo de negociación para evitar operar en exceso
  5. Proporciona una referencia clara a la estructura del mercado a través de herramientas de visualización (canales paralelos y etiquetas)
  6. La lógica de la estrategia es clara, fácil de mantener y optimizar.

Riesgo estratégico

  1. Pueden producirse señales falsas en mercados volátiles
  2. El proceso de identificación del patrón de triple fondo puede verse afectado por el ruido del mercado
  3. Los múltiplos ATR fijos pueden no ser adecuados para todas las condiciones del mercado
  4. Pueden producirse pérdidas continuas durante períodos de cambios drásticos de tendencia.
  5. La configuración del intervalo de negociación puede perder algunas señales válidas

Dirección de optimización de la estrategia

  1. Introducción de indicadores de volumen para confirmar la validez del rebote
  2. Ajuste dinámicamente los múltiplos ATR según diferentes entornos de mercado
  3. Agregue un filtro de fuerza de tendencia para mejorar la calidad de la señal comercial
  4. Optimizar el algoritmo de reconocimiento de triple fondo para mejorar la precisión
  5. Introducir el análisis del ciclo de fluctuación del mercado y optimizar la configuración del intervalo de negociación
  6. Considere agregar análisis de simetría a los patrones de precios

Resumir

Esta estrategia implementa la estrategia comercial de ruptura de rebote de triple fondo de manera programática, combina múltiples indicadores técnicos y métodos de gestión de riesgos y tiene buena practicidad. Se espera que mediante la optimización y mejora continuas, esta estrategia logre un mejor rendimiento en el comercio real. Se recomienda realizar una verificación retrospectiva suficiente antes de operar en la realidad y ajustar la configuración de los parámetros según las condiciones específicas del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
strategy("反彈三次突破策略", overlay=true, initial_capital=100000, commission_value=0.001425, slippage=1)

// === 參數設定 ===
fast_length = input.int(5, title="快速均線週期")
slow_length = input.int(20, title="慢速均線週期")
atr_period = input.int(14, title="ATR 週期")
atr_factor = input.float(2.0, title="ATR 因子")
profit_factor = input.float(2.0, title="止盈因子")

// === 計算均線 ===
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.ema(close, slow_length)

// === 均線交叉訊號 ===
long_signal = ta.crossover(fast_ma, slow_ma)
short_signal = ta.crossunder(fast_ma, slow_ma)

// === 計算 ATR ===
atr = ta.atr(atr_period)

// === 反彈三次突破策略 ===
var float low1 = na
var float low2 = na
var float low3 = na
var bool trend_down = false
var bool long_breakout = false
var line lower_line = na
var line upper_line = na

if (na(low1) or na(low2) or na(low3))
    // 初始化低點
    low1 := na
    low2 := na
    low3 := na

if (close < low3 or na(low3))
    // 更新低點
    low1 := low2
    low2 := low3
    low3 := close
    trend_down := true

if (trend_down and close > low2 and close > low1)
    // 確認反轉且第三次反彈比第二次高
    trend_down := false
    long_breakout := true

// 清除前一個反彈通道
if (not na(lower_line))
    line.delete(lower_line)
if (not na(upper_line))
    line.delete(upper_line)

// 繪製新的反彈通道
if (not na(low1) and not na(low3))    
    lower_line := line.new(x1=bar_index[2], y1=low1, x2=bar_index, y2=low3, color=color.yellow, width=2)
    upper_line := line.new(x1=bar_index[2], y1=low1 + (low3 - low1), x2=bar_index, y2=low3 + (low3 - low1), color=color.yellow, width=2)

// === 進出場條件 ===
var float last_long_exit = na
var float last_short_exit = na
var float stop_loss_long = na
var float take_profit_long = na
var float stop_loss_short = na
var float take_profit_short = na

var label stop_loss_label_long = na
var label take_profit_label_long = na
var label stop_loss_label_short = na
var label take_profit_label_short = na

if (long_signal or long_breakout)
    if na(last_short_exit) or (time - last_short_exit) > 2 * 60 * 60 * 1000  // 確保多頭出場後有一段時間間隔
        // 做多
        strategy.entry("做多", strategy.long)
        // 止損設置為最近低點下方
        stop_loss_long := low3 - atr_factor * atr
        take_profit_long := close + profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做多", stop=stop_loss_long, limit=take_profit_long)
        last_long_exit := time  // 記錄多頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_long))
            label.delete(stop_loss_label_long)
        if (not na(take_profit_label_long))
            label.delete(take_profit_label_long)

        // 繪製新的止盈止損標籤
        stop_loss_label_long := label.new(x=bar_index, y=stop_loss_long, text=str.tostring(math.round(stop_loss_long * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_long := label.new(x=bar_index, y=take_profit_long, text=str.tostring(math.round(take_profit_long * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)

if (short_signal)
    if na(last_long_exit) or (time - last_long_exit) > 2 * 60 * 60 * 1000  // 確保空頭出場後有一段時間間隔
        // 做空
        strategy.entry("做空", strategy.short)
        // 止損設置為最近高點上方
        stop_loss_short := high + atr_factor * atr
        take_profit_short := close - profit_factor * atr  // 設定止盈位置
        strategy.exit("止盈/止損", "做空", stop=stop_loss_short, limit=take_profit_short)
        last_short_exit := time  // 記錄空頭出場時間

        // 刪除之前的止盈止損標籤
        if (not na(stop_loss_label_short))
            label.delete(stop_loss_label_short)
        if (not na(take_profit_label_short))
            label.delete(take_profit_label_short)

        // 繪製新的止盈止損標籤
        stop_loss_label_short := label.new(x=bar_index, y=stop_loss_short, text=str.tostring(math.round(stop_loss_short * 10) / 10), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)
        take_profit_label_short := label.new(x=bar_index, y=take_profit_short, text=str.tostring(math.round(take_profit_short * 10) / 10), color=color.green, style=label.style_label_up, textcolor=color.white, size=size.small)