Stratégie de consolidation des bandes de Bollinger

Auteur:ChaoZhang est là., Date: le 22 février 2024
Les étiquettes:

img

Résumé

La stratégie de consolidation des bandes de Bollinger est une stratégie innovante qui identifie les phases de consolidation à faible volatilité à l'aide des bandes de Bollinger. Lorsque le marché entre dans une période de volatilité, les bandes de Bollinger convergeront, ce qui indique une opportunité d'entrer sur le marché.

La logique de la stratégie

La stratégie repose principalement sur les bandes de Bollinger pour détecter quand les prix entrent dans une phase de consolidation de faible volatilité. La bande du milieu des bandes de Bollinger est une moyenne mobile des prix de clôture. Les bandes supérieure et inférieure sont compensées par deux écarts types au-dessus et en dessous de la bande du milieu. Lorsque la volatilité diminue, la distance entre les bandes supérieure et inférieure se rétrécit sensiblement.

Pour prouver davantage la diminution de la volatilité, nous vérifions si la moyenne mobile des valeurs ATR a une tendance à la baisse. La diminution de la moyenne ATR corrobore également du côté que la volatilité diminue. Lorsque les deux conditions sont remplies simultanément, nous déterminons que les bandes de Bollinger ont montré une convergence significative, ce qui est une excellente opportunité d'achat.

Après avoir acheté, nous activons une stratégie de stop loss mobile avec une distance de stop loss deux fois supérieure à la valeur ATR.

Analyse des avantages

Le plus grand avantage de cette stratégie est qu'elle peut déterminer avec précision quand le marché entre dans une phase de consolidation à faible volatilité et identifier la meilleure opportunité d'achat.

En outre, la stratégie utilise également un stop loss mobile pour contrôler activement les risques. Cela maximise la réduction des pertes même lorsque le sentiment du marché est défavorable.

Analyse des risques

Le principal risque de la stratégie est que l'indicateur Bollinger Bands ne peut pas déterminer avec précision les changements de volatilité des prix 100% du temps. Lorsque Bollinger Bands estime à tort que la volatilité a diminué, notre timing d'entrée peut être défavorable. À ce stade, le stop loss mobile joue un rôle important et peut quitter le commerce le plus tôt possible.

En outre, la définition de divers paramètres dans la stratégie aura également une incidence sur les résultats.

Directions d'optimisation

Nous pouvons envisager d'ajouter d'autres indicateurs pour confirmer les signes de virage sur les indicateurs de tendance lorsque les bandes de Bollinger convergent. Par exemple, lorsque les bandes de Bollinger convergent, nous exigeons également que la différence MACD soit passée de positive à négative, ou que le RSI se soit retiré de la zone de surachat. Cela peut encore améliorer la précision des signaux d'achat.

Une autre direction consiste à tester l'impact de différents paramètres sur les résultats, tels que les périodes de Bollinger Bands, ATR et le multiplicateur du stop loss mobile.

Conclusion

La stratégie de consolidation des bandes de Bollinger utilise les bandes de Bollinger pour déterminer le moment de la diminution de la volatilité des prix et utilise un stop loss mobile pour contrôler efficacement les risques. Il s'agit d'une stratégie de rupture à long terme relativement stable.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji

//@version=4
strategy("[KL] Bollinger Bands Consolidation Strategy",overlay=true,pyramiding=1)

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Indicator: BOLL bands {
BOLL_length = 20//input(20,title="Periods to lookback for BOLL and ATR calc. (default 20)")
BOLL_src = close
BOLL_center = sma(BOLL_src, BOLL_length)
BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_center + BOLL_sDEV_x2
BOLL_lower = BOLL_center - BOLL_sDEV_x2
plot(BOLL_center, "Basis", color=#872323, offset = 0)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = 0, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = 0, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// ATR and volatility Indicator {
ATR_x2 = atr(BOLL_length) * 2 // multiplier aligns with BOLL
avg_volat = sma(ATR_x2, BOLL_length)
//}

// Trailing stop loss {
var entry_price = float(0)
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
trail_profit_line_color = color.green
UPDATE_ATR_TSL = false
if strategy.position_size == 0 or not within_timeframe // make TSL line less visible
    trail_profit_line_color := color.black
    stop_loss_price := close - trailing_SL_buffer
else if strategy.position_size > 0
    if UPDATE_ATR_TSL and ATR_x2 < trailing_SL_buffer
        trailing_SL_buffer := ATR_x2
    stop_loss_price := max(stop_loss_price, close[1] - trailing_SL_buffer)
plot(stop_loss_price,color=trail_profit_line_color)
// }


IGNORE_BOLL_SHAPE = false//input(false,title="Ignore BOLL (vs ATR) during entry (experimental)")
IGNORE_VOLATILITY = false///input(false,title="Ignore average ATR during entry (experimental)")
// Main:
if within_timeframe
    // ENTRY:
    if (ATR_x2 > BOLL_sDEV_x2 or IGNORE_BOLL_SHAPE) and (avg_volat < avg_volat[1] or IGNORE_VOLATILITY)
        if strategy.position_size == 0
            entry_price := close
            trailing_SL_buffer := ATR_x2
            stop_loss_price := close - ATR_x2
            strategy.entry("Long",strategy.long, comment="enter")
        if strategy.position_size > 0
            strategy.entry("Long",strategy.long, comment="+")

    // EXIT:
    if strategy.position_size > 0
        if low <= stop_loss_price
            if close > entry_price
                strategy.close("Long", comment="take profit")
            else if low <= entry_price
                strategy.close("Long", comment="stop loss")
    
            if strategy.position_size == 0
                entry_price := 0
                

Plus de