Esta estrategia utiliza bandas de Bollinger dobles para identificar zonas de consolidación y señales de ruptura para implementar una estrategia de negociación de compra baja-venta alta. Cuando el precio rompe la zona neutral, indica el comienzo de una nueva tendencia y el momento de entrar en una posición larga. Cuando el precio vuelve a romper por debajo de la zona neutral, indica el final de la tendencia y el momento de cerrar la posición.
La estrategia emplea dos bandas de Bollinger. La BB interna tiene bandas superior/inferior de 20SMA ± 1 desviación estándar. La BB externa tiene bandas superior/inferior de 20SMA ± 2 desviaciones estándar. El área entre las dos BBs se define como la zona neutral.
Cuando el precio se mantiene dentro de la zona neutral durante dos velas consecutivas, se considera una consolidación.
Después de entrar en largo, el stop loss se establece en el precio más bajo - 2xATR para bloquear la ganancia y controlar el riesgo.
Esta estrategia combina indicadores y tendencia para identificar zonas de consolidación y determinar el inicio de la tendencia, lo que permite una negociación de compra baja-venta alta con un gran potencial de ganancia.
La estrategia se basa en señales de ruptura que pueden resultar ser falsas rupturas, lo que resulta en pérdidas de operaciones.
Las soluciones incluyen la optimización de los parámetros BB, la adición de filtros para reducir las señales falsas y permitir paradas más amplias.
Esta estrategia integra doble BB y estrategias de tendencia para el comercio de baja compra-alta venta con un gran potencial de ganancias.
/*backtest start: 2022-12-06 00:00:00 end: 2023-12-12 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] Double BB Strategy",overlay=true,pyramiding=1) ENUM_LONG = "LONG" // Timeframe { backtest_timeframe_start = input(defval = timestamp("01 Apr 2020 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 // } // Bollinger bands BOLL_length = 20, BOLL_src = close, SMA20 = sma(BOLL_src, BOLL_length) BOLL_sDEV = stdev(BOLL_src, BOLL_length) BOLL_upper1 = SMA20 + BOLL_sDEV, BOLL_lower1 = SMA20 - BOLL_sDEV BOLL_upper2 = SMA20 + BOLL_sDEV*2, BOLL_lower2 = SMA20 - BOLL_sDEV*2 SMA_20_plot = plot(SMA20, "Basis", color=#872323, offset = 0) BOLL_upper1_plot = plot(BOLL_upper1, "BOLL Upper1", color=color.navy, offset = 0, transp=50) BOLL_lower1_plot = plot(BOLL_lower1, "BOLL Lower1", color=color.navy, offset = 0, transp=50) BOLL_upper2_plot = plot(BOLL_upper2, "BOLL Upper2", color=color.navy, offset = 0, transp=50) BOLL_lower2_plot = plot(BOLL_lower2, "BOLL Lower2", color=color.navy, offset = 0, transp=50) fill(BOLL_upper2_plot, BOLL_upper1_plot, title = "Background", color=#198787, transp=85) fill(BOLL_upper1_plot, SMA_20_plot, title = "Background", color=#198787, transp=75) fill(SMA_20_plot, BOLL_lower1_plot, title = "Background", color=#198787, transp=75) fill(BOLL_lower1_plot, BOLL_lower2_plot, title = "Background", color=#198787, transp=85) // Trailing stop loss { ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float) TSL_source = low var stop_loss_price = float(0) TSL_line_color = color.green, TSL_transp = 100 if strategy.position_size == 0 or not within_timeframe TSL_line_color := color.black stop_loss_price := TSL_source - ATR_X2_TSL else if strategy.position_size > 0 stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL) TSL_transp := 0 plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp)) // } // Signals for entry is_neutral = close < BOLL_upper1 and close > BOLL_lower2 is_consol = is_neutral and is_neutral[2] entry_signal = is_consol[1] and close > BOLL_upper1 // MAIN: if within_timeframe // EXIT :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit" end_of_rally = close < BOLL_upper1 and strategy.position_avg_price > stop_loss_price // also detects false breakouts if strategy.position_size > 0 and (TSL_source <= stop_loss_price or end_of_rally) strategy.close(ENUM_LONG, comment=exit_msg) // ENTRY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price)) and entry_signal entry_msg = strategy.position_size > 0 ? "adding" : "initial" strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg) // CLEAN UP: if strategy.position_size == 0 stop_loss_price := float(0)