
La estrategia utiliza una combinación de bandas de Brin y un indicador relativamente débil (el RSI) para identificar oportunidades de que un período de contracción de la banda de Brin se combine con un aumento del RSI y para controlar el riesgo mediante un stop loss de seguimiento de tendencias.
El núcleo de la lógica de negociación de esta estrategia consiste en identificar la contracción de la banda de Brin y juzgar que la tendencia está en los inicios de la subida cuando el RSI está en alza. Concretamente, cuando el estándar en la órbita de la banda de Brin en el día 20 es inferior al ATR*En el segundo, se determina que el Brin está en contracción; al mismo tiempo, si los RSI del día 10 y el 14 están en tendencia al alza, se predice que el precio está a punto de romper el Brin y tomar el camino de la multiplicación de la estrategia.
Una vez dentro de la cancha, usamos la distancia de seguridad ATR + el stop loss con la subida de los precios para bloquear los beneficios y controlar el riesgo. Cuando el precio supera la línea de stop loss o el RSI se sobrecalienta ((el RSI de 14 días supera el 70, el RSI de 10 días supera el RSI de 14 días).
La mayor ventaja de esta estrategia es que utiliza la contracción de la banda de Brin para determinar el período de ajuste de la situación, en combinación con la dirección de la ruptura de los precios pronosticados por el indicador RSI. Además, la adopción de un alto adaptativo en lugar de un alto fijo permite un ajuste flexible en función de la volatilidad del mercado, lo que permite obtener mayores ganancias, siempre que se garantice el control del riesgo.
El principal riesgo de esta estrategia es que el mercado puede ser falso cuando se identifica una contracción de la banda de Bryn y un aumento del RSI. Además, en el caso de los paros, el parón de adaptabilidad puede no detenerse a tiempo si la oscilación es demasiado grande. Este riesgo se puede reducir mediante la mejora de los métodos de parón (por ejemplo, parón de curva).
Esta estrategia puede ser optimizada en los siguientes aspectos:
Mejora de la configuración de los parámetros de la banda de Bryn para optimizar los efectos de la contracción
Prueba con diferentes parámetros del ciclo RSI
Prueba de la eficacia de otros métodos de deterioro (deterioro de curvas, deterioro de revisiones, etc.)
Ajuste de parámetros según las características de las diferentes variedades
Esta estrategia utiliza la complementariedad de las bandas de Brin y el RSI para obtener una mejor tasa de retiro y ganancias con el riesgo controlado. Se puede optimizar posteriormente en términos de métodos de parada de pérdidas, selección de parámetros, etc., lo que hace que la estrategia sea más adecuada para diferentes tipos de operaciones.
/*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)