Stratégie combinée de bande de contraction Bollinger et RSI


Date de création: 2024-01-30 15:15:32 Dernière modification: 2024-01-30 15:15:32
Copier: 0 Nombre de clics: 661
1
Suivre
1617
Abonnés

Stratégie combinée de bande de contraction Bollinger et RSI

Aperçu

La stratégie utilise une combinaison de bandes de Boulder et d’indicateurs relativement faibles (RSI) pour identifier les opportunités d’une période de contraction des bandes de Boulder accompagnée d’une hausse du RSI et de suivre les arrêts de tendance pour contrôler les risques.

Principe de stratégie

Le cœur de la logique de négociation de cette stratégie est d’identifier le rétrécissement des bandes de Burin et de juger que la tendance est au début de la hausse lorsque le RSI est en hausse. Plus précisément, lorsque la norme sur l’orbite des bandes de Burin du 20e jour est inférieure à l’ATR*Si le RSI du 10e et du 14e jour est à la hausse, alors nous prévoyons que le prix est sur le point de franchir le BRI et de prendre des mesures plus stratégiques.

Une fois sur le terrain, nous utilisons la distance de sécurité ATR + le stop loss avec la hausse des prix pour verrouiller les bénéfices et contrôler les risques. Lorsque le prix dépasse la ligne de stop loss ou le RSI surchauffe ((le RSI de 14 jours est supérieur à 70, le RSI de 10 jours est supérieur au RSI de 14 jours).

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans l’utilisation de la contraction des bandes de Brin pour juger de la période de consolidation, en combinaison avec la direction de rupture du prix prévu par l’indicateur RSI. En outre, l’utilisation d’un arrêt adaptatif au lieu d’un arrêt fixe peut être ajustée de manière flexible en fonction de la volatilité du marché, ce qui permet de réaliser des gains plus importants tout en garantissant la maîtrise des risques.

Analyse des risques

Le principal risque de cette stratégie est d’identifier un resserrement de la courbe de Bryn et une hausse du RSI, qui peuvent être de fausses ruptures. De plus, en termes de stop loss, les arrêts d’adaptation peuvent ne pas être arrêtés à temps si les fluctuations sont trop longues. Ce risque peut être réduit en améliorant les méthodes de stop loss (par exemple, les arrêts de courbe).

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Amélioration des paramètres de la bande de Bryn pour optimiser le jugement de la contraction

  2. Essayez différents paramètres du cycle RSI

  3. Tester l’efficacité d’autres méthodes d’arrêt (arrêt de courbe, arrêt de retour, etc.)

  4. Ajustement des paramètres en fonction des caractéristiques des différentes variétés

Résumer

Cette stratégie utilise l’interdépendance des bandes de Brin et du RSI pour obtenir un meilleur rapport de rendement et de reprise en tenant compte des risques. La stratégie peut ensuite être optimisée en termes de méthodes de stop loss, de choix de paramètres, etc., ce qui la rend plus adaptée aux différentes variétés de transactions.

Code source de la stratégie
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
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 + RSI 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("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Bollinger bands (sdv=2, len=20) {
BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length), BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length)
BOLL_upper = SMA20 + BOLL_sDEV_x2, BOLL_lower = SMA20 - BOLL_sDEV_x2
plot(SMA20, "Basis", color=#872323, offset = 0)
BOLL_p1 = plot(BOLL_upper, "BOLL Upper", color=color.navy, offset = 0, transp=50)
BOLL_p2 = plot(BOLL_lower, "BOLL Lower", color=color.navy, offset = 0, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }

// Volatility Indicators {
ATR_x2 = atr(BOLL_length) * 2 // multiplier aligns with BOLL
avg_atr = sma(ATR_x2, input(1,title="No. of candles to lookback when determining ATR is decreasing"))
plot(SMA20+ATR_x2, "SMA20 + ATR_x2", color=color.gray, offset = 0, transp=50)
plot(SMA20-ATR_x2, "SMA20 - ATR_x2", color=color.gray, offset = 0, transp=50)
plotchar(ATR_x2, "ATR_x2", "", location = location.bottom)
//}

// Trailing stop loss {
TSL_source = low
var entry_price = float(0), var stop_loss_price = float(0)

trail_profit_line_color = color.green
if strategy.position_size == 0 or not within_timeframe
    trail_profit_line_color := color.black
    stop_loss_price := TSL_source - ATR_x2
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_x2)
plot(stop_loss_price, color=trail_profit_line_color)

if strategy.position_size > 0 and stop_loss_price > stop_loss_price[1]
	alert("Stop loss limit raised", alert.freq_once_per_bar)

// } end of Trailing stop loss

//Buy setup - Long positions {
is_squeezing = ATR_x2 > BOLL_sDEV_x2
if is_squeezing and within_timeframe and not is_squeezing[1]
	alert("BOLL bands are squeezing", alert.freq_once_per_bar)
else if not is_squeezing and within_timeframe and is_squeezing[1]
	alert("BOLL bands stopped squeezing", alert.freq_once_per_bar)

ema_trend = ema(close, 20)

concat(a, b) =>
	concat = a
	if a != ""
		concat := concat + ", "
	concat := concat + b
	concat
// }

// Sell setup - Long position {
rsi_10 = rsi(close, 10), rsi_14 = rsi(close, 14)
overbought = rsi_14 > input(70,title="[Exit] RSI(14) value considered as overbought") and rsi_10 > rsi_14
// } end of Sell setup - Long position

// MAIN: {
if within_timeframe
	entry_msg = ""
	exit_msg = ""

    // ENTRY {
	conf_count = 0	
    volat_decr = avg_atr <= avg_atr[1]
	rsi_upslope = rsi_10 > rsi_10[1] and rsi_14 > rsi_14[1]

	if volat_decr and rsi_upslope and is_squeezing and strategy.position_size == 0
		strategy.entry("Long",strategy.long, comment=entry_msg)
		entry_price := close
		stop_loss_price := TSL_source - ATR_x2
	// }

    // EXIT	{
	if strategy.position_size > 0
		bExit = false
		if close <= entry_price and TSL_source <= stop_loss_price
            exit_msg := concat(exit_msg, "stop loss [TSL]")
			bExit := true
        else if close > entry_price and TSL_source <= stop_loss_price
            exit_msg := concat(exit_msg, "take profit [TSL]")
            bExit := true
		else if overbought
			exit_msg := concat(exit_msg, "overbought")
			bExit := true

        strategy.close("Long", when=bExit, comment=exit_msg)
	// }
// }

// CLEAN UP:
if strategy.position_size == 0 and not is_squeezing
	entry_price := 0
	stop_loss_price := float(0)