Stratégie de négociation basée sur les bandes de Bollinger et le MACD

Auteur:ChaoZhang est là., Date: 2023-12-20 à 15h55
Les étiquettes:

img

Résumé

Cette stratégie combine les bandes de Bollinger et l'indicateur MACD pour identifier les opportunités de survente et les renversements de tendance pour le trading quantitatif.

La logique de la stratégie

La stratégie calcule d'abord les bandes de Bollinger de 20 jours, y compris la bande moyenne, la bande supérieure et la bande inférieure. Lorsque le prix touche la bande inférieure, il considère que le marché est survendu. À ce stade, combiner avec l'indicateur MACD pour juger si la tendance est en train de s'inverser. Si l'histogramme MACD traverse positivement au-dessus de la ligne de signal, il détermine la fin de ce cycle de baisse, qui correspond au signal d'achat.

Plus précisément, le fait de toucher la bande inférieure de Bollinger et la ligne de signal de traversée de l'histogramme MACD déclenche positivement le signal d'achat simultanément.

Analyse des avantages

La stratégie intègre les bandes de Bollinger pour juger de la zone de survente et le MACD pour déterminer les signaux d'inversion de tendance, réalisant un prix d'entrée relativement bas.

Les avantages sont notamment les suivants:

  1. Combiner la zone de survente des bandes de Bollinger et l'indicateur MACD pour obtenir de meilleurs points d'entrée
  2. Utilisation de l'indicateur MACD pour déterminer les points d'inversion de tendance, réduisant les probabilités de fausse rupture
  3. Adoption de méthodes stop loss/take profit pour contrôler efficacement les risques

Analyse des risques

Il existe encore certains risques principalement dans les aspects suivants:

  1. Il existe une probabilité de rupture des bandes de Bollinger, ce qui peut entraîner un échec du jugement sur la zone de survente.
  2. Le croisement de l'histogramme MACD pourrait également être faux avec une probabilité d'erreur de jugement
  3. Le réglage de la position stop loss peut être incorrect, trop lâche ou trop stricte, entraînant une défense insuffisante ou un stop loss prématuré

Pour nous protéger contre les risques susmentionnés, nous pouvons prendre les mesures suivantes:

  1. Combiner avec d'autres indicateurs pour vérifier la validité des signaux de rupture des bandes de Bollinger
  2. Ajouter des indicateurs de dynamique, etc. comme filtres pour éviter un faux croisement MACD
  3. Optimiser et tester différents paramètres de stop loss

Directions d'optimisation

Il reste encore des possibilités d'optimisation, notamment:

  1. Optimiser les paramètres des bandes de Bollinger pour trouver de meilleurs systèmes de jugement de survente
  2. Ajouter des filtres d'indicateurs de dynamique pour améliorer la validité du jugement MACD
  3. Test de méthodes d'arrêt des pertes comme ATR pour trouver de meilleurs paramètres
  4. Ajout d'un module de jugement de tendance pour éviter le contre-trend
  5. Combiner des méthodes d'apprentissage automatique pour former des modèles de jugement et améliorer les performances globales de la stratégie

Conclusion

La stratégie intègre le jugement de la zone de survente des bandes de Bollinger et l'indicateur d'inversion de tendance MACD pour atteindre des points d'entrée relativement meilleurs. Elle établit également des méthodes de stop loss / take profit pour contrôler les risques. Il s'agit d'une stratégie de vente élevée à faible achat utile à référencer et à optimiser. Combinée à plus de filtres d'indicateur et à des méthodes d'apprentissage automatique, il y a encore de la place pour améliorer davantage sa performance.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 00:00:00
period: 1h
basePeriod: 15m
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] BOLL + MACD Strategy v2 (published)",overlay=true)

// BOLL bands {
BOLL_length = 20
BOLL_src = close
BOLL_mult = 2.0
BOLL_basis = sma(BOLL_src, BOLL_length)
BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_basis + BOLL_dev
BOLL_lower = BOLL_basis - BOLL_dev
BOLL_offset = 0
plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// MACD signals {
MACD_fastLen = 12
MACD_slowLen = 26
MACD_Len = 9
MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen)
aMACD = ema(MACD, MACD_Len)
MACD_delta = MACD - aMACD
// }
backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time)
//backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time)
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = atr(ATR_multi_len) * ATR_multi
risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var bar_count = 0 //number of bars since entry 
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0
    trail_profit_line_color := color.blue
    stop_loss_price := low
plot(stop_loss_price,color=trail_profit_line_color)
// } 

var touched_lower_bb = false

if true// and time <= backtest_timeframe_end
    if low <= BOLL_lower
        touched_lower_bb := true
    else if strategy.position_size > 0
        touched_lower_bb := false//reset state
    expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1])
    buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound

    //ENTRY:
    if strategy.position_size == 0 and buy_condition
        entry_price := close
        trailing_SL_buffer := ATR_buffer
        stop_loss_price := close - ATR_buffer
        strategy.entry("Long",strategy.long, comment="buy")
        bar_count := 0
    else if strategy.position_size > 0
        bar_count := bar_count + 1

    //EXIT: 
    // Case (A) hits trailing stop
    if strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
            stop_loss_price := 0
        else if close <= entry_price and bar_count
            strategy.close("Long", comment="stop loss")
            stop_loss_price := 0
        bar_count := 0
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
            stop_loss_price := 0
        bar_count := 0

Plus de