Stratégie de momentum de rupture de rebond en triple creux

EMA ATR MA SMA
Date de création: 2025-01-10 15:49:30 Dernière modification: 2025-01-10 15:49:30
Copier: 0 Nombre de clics: 401
1
Suivre
1617
Abonnés

Stratégie de momentum de rupture de rebond en triple creux

Aperçu

Cette stratégie est un système de trading quantitatif basé sur l’analyse technique, qui se négocie principalement en identifiant les modèles de triple fond et les signaux de percée de momentum sur le marché. La stratégie combine plusieurs indicateurs techniques tels que le croisement de la moyenne mobile (MA), la plage réelle (ATR), le canal de prix, etc. pour créer un système de trading complet. Cette stratégie réalise l’identification automatique et l’exécution des transactions du modèle de rebond à triple fond de manière programmée.

Principe de stratégie

La logique fondamentale de la stratégie comprend les éléments clés suivants :

  1. Utilisez le croisement des moyennes mobiles rapides (5 périodes) et lentes (20 périodes) pour confirmer la direction de la tendance du marché
  2. Le programme identifie automatiquement trois points bas consécutifs (low1, low2, low3) pour former un modèle de triple creux
  3. Utilisez l’indicateur ATR pour calculer la volatilité et définir des niveaux dynamiques de stop loss et de take profit
  4. Après le troisième creux, lorsque le prix franchit le précédent sommet de rebond, combiné au signal de croisement de la moyenne mobile, confirmez le moment d’aller longtemps
  5. Créez des canaux parallèles pour visualiser les plages de mouvements de prix et fournir des références de marché supplémentaires
  6. Définissez des conditions dynamiques de stop loss et de take profit en fonction de l’ATR au moment de l’exécution de la transaction

Avantages stratégiques

  1. Combinez plusieurs indicateurs techniques pour améliorer la fiabilité des signaux de trading
  2. Utilisez l’ATR pour ajuster de manière dynamique les positions stop loss et take profit afin de vous adapter aux changements de volatilité du marché
  3. Identifiez automatiquement les modèles de triple fond pour réduire l’impact du jugement subjectif
  4. Définissez des limites d’intervalle de négociation pour éviter les transactions excessives
  5. Fournit une référence claire à la structure du marché grâce à des outils de visualisation (canaux parallèles et étiquettes)
  6. La logique de la stratégie est claire, facile à maintenir et à optimiser

Risque stratégique

  1. De faux signaux peuvent survenir sur des marchés volatils
  2. Le processus d’identification du modèle de triple fond peut être affecté par le bruit du marché
  3. Les multiples ATR fixes peuvent ne pas convenir à toutes les conditions de marché
  4. Des pertes continues peuvent survenir pendant les périodes de changements de tendance drastiques
  5. Le réglage de l’intervalle de négociation peut manquer certains signaux valides

Orientation de l’optimisation de la stratégie

  1. Introduction d’indicateurs de volume pour confirmer la validité du rebond
  2. Ajuster dynamiquement les multiples ATR en fonction des différents environnements de marché
  3. Ajoutez un filtre de force de tendance pour améliorer la qualité du signal de trading
  4. Optimiser l’algorithme de reconnaissance du triple fond pour améliorer la précision
  5. Introduisez l’analyse du cycle de fluctuation du marché et optimisez les paramètres d’intervalle de négociation
  6. Envisagez d’ajouter une analyse de symétrie aux modèles de prix

Résumer

Cette stratégie met en œuvre la stratégie de trading de percée du rebond à triple fond de manière programmatique, combine plusieurs indicateurs techniques et méthodes de gestion des risques et présente une bonne praticité. Grâce à une optimisation et une amélioration continues, cette stratégie devrait permettre d’obtenir de meilleures performances dans le trading réel. Il est recommandé d’effectuer une vérification de backtesting suffisante avant le trading réel et d’ajuster les paramètres en fonction des conditions spécifiques du marché.

Code source de la stratégie
/*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)