
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.
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).
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.
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).
Cette stratégie peut être optimisée dans les domaines suivants:
Amélioration des paramètres de la bande de Bryn pour optimiser le jugement de la contraction
Essayez différents paramètres du cycle RSI
Tester l’efficacité d’autres méthodes d’arrêt (arrêt de courbe, arrêt de retour, etc.)
Ajustement des paramètres en fonction des caractéristiques des différentes variétés
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.
/*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)