Estrategia de ruptura de bandas de Bollinger dobles

El autor:¿ Qué pasa?, Fecha: 2023-12-13 17:33:24
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

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.

Análisis de riesgos

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.

Direcciones de optimización

  1. Optimizar los parámetros de BB para reducir las fallas
  2. Añadir otros filtros, por ejemplo, el volumen para evitar falsas rupturas de bajo volumen
  3. Ajuste de la estrategia de stop loss para evitar los frenos y paradas tempranas
  4. Escala de posiciones para reducir los riesgos de negociación única

Conclusión

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)

Más.