Análisis de la estrategia de bandas de Bollinger adaptativas basada en la secuencia de Fibonacci

ATR BB SMA FIB
Fecha de creación: 2025-01-06 16:41:48 Última modificación: 2025-01-06 16:41:48
Copiar: 2 Número de Visitas: 434
1
Seguir
1617
Seguidores

Análisis de la estrategia de bandas de Bollinger adaptativas basada en la secuencia de Fibonacci

Descripción general

Esta estrategia es un sistema de trading innovador que combina la secuencia de Fibonacci y las Bandas de Bollinger. Forma un sistema único de juicio de rango de fluctuación de precios al reemplazar los múltiplos de desviación estándar de las Bandas de Bollinger tradicionales con la relación de Fibonacci (1.618, 2.618, 4.236). La estrategia incluye funciones completas de gestión de transacciones, incluidas configuraciones de stop-profit y stop-loss y filtrado de ventanas de tiempo de transacción, lo que la hace altamente práctica y flexible.

Principio de estrategia

La lógica central de la estrategia se basa en la interacción entre el precio y las Bandas de Bollinger de Fibonacci. Primero, calcule el promedio móvil simple (SMA) del precio como la trayectoria media y luego use el ATR multiplicado por diferentes proporciones de Fibonacci para formar las trayectorias superior e inferior. Cuando el precio rompe la banda de Fibonacci seleccionada por el usuario, el sistema generará una señal comercial. Específicamente, una señal larga se activa cuando el precio más bajo es inferior a la banda de compra objetivo y el precio más alto es superior a la banda; una señal corta se activa cuando el precio más bajo es inferior a la banda de venta objetivo y el precio más alto es superior. que la banda.

Ventajas estratégicas

  1. Fuerte adaptabilidad: ajuste dinámicamente el ancho de banda a través de ATR para que la estrategia se adapte mejor a diferentes entornos de mercado.
  2. Alta flexibilidad: los usuarios pueden elegir diferentes bandas de Fibonacci como señales comerciales según su estilo comercial.
  3. Gestión de riesgos perfecta: funciones integradas de stop-profit, stop-loss y filtrado de tiempo para controlar los riesgos de forma eficaz
  4. Intuición visual: se muestran diferentes bandas de transparencia para ayudar a los operadores a comprender la estructura del mercado.
  5. Lógica de cálculo clara: utiliza una combinación clásica de indicadores técnicos, fácil de entender y mantener.

Riesgo estratégico

  1. Riesgo de ruptura falsa: los precios pueden volver a caer inmediatamente después de una ruptura, generando una señal falsa.
  2. Sensibilidad de los parámetros: diferentes elecciones de proporciones de Fibonacci pueden afectar significativamente el rendimiento de la estrategia
  3. Dependencia del tiempo: si habilita ventanas de tiempo para operaciones, puede perder oportunidades comerciales importantes
  4. Dependencia del entorno del mercado: puede generar demasiadas señales comerciales en un mercado volátil

Dirección de optimización de la estrategia

  1. Mecanismo de confirmación de señal: Se recomienda agregar indicadores de volumen o impulso como confirmación de avance.
  2. Optimización dinámica de parámetros: los ratios de Fibonacci se pueden ajustar automáticamente en función de la volatilidad del mercado
  3. Filtrado del entorno de mercado: agregue la función de evaluación de tendencias y use diferentes parámetros en diferentes entornos de mercado
  4. Sistema de ponderación de señales: establecer análisis de múltiples marcos de tiempo para mejorar la confiabilidad de la señal
  5. Optimización de la gestión de posiciones: ajuste dinámicamente el tamaño de la posición en función de la volatilidad del mercado y la intensidad de la señal

Resumir

Se trata de una estrategia que combina de forma innovadora las herramientas clásicas de análisis técnico y optimiza la estrategia tradicional de Bandas de Bollinger a través de la secuencia de Fibonacci. Sus principales ventajas radican en su adaptabilidad y flexibilidad, pero a la hora de utilizarlo se debe prestar atención a la adecuación entre la selección de parámetros y el entorno del mercado. Todavía hay mucho margen de mejora en esta estrategia añadiendo indicadores de confirmación adicionales y optimizando el mecanismo de generación de señales.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ FiboBands Strategy", title="[Sapphire] Fibonacci Bollinger Bands Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupFiboBands = "FiboBands"
length = input.int(20, minval = 1, title = 'Length', group=groupFiboBands)
src = input(close, title = 'Source', group=groupFiboBands)
offset = input.int(0, 'Offset', minval = -500, maxval = 500, group=groupFiboBands)

fibo1 = input(defval = 1.618, title = 'Fibonacci Ratio 1', group=groupFiboBands)
fibo2 = input(defval = 2.618, title = 'Fibonacci Ratio 2', group=groupFiboBands)
fibo3 = input(defval = 4.236, title = 'Fibonacci Ratio 3', group=groupFiboBands)

fiboBuy = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Buy', group=groupFiboBands)
fiboSell = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Sell', group=groupFiboBands)

showSignals = input.bool(true, title="Show Signals", group=groupFiboBands)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupFiboBands)

// --------------------    Trade Management Inputs    -------------------- //
groupTradeManagement = "Trade Management"
useProfitPerc    = input.bool(false, title="Enable Profit Target", group=groupTradeManagement)
takeProfitPerc  = input.float(1.0, title="Take Profit (%)", step=0.1, group=groupTradeManagement)
useStopLossPerc    = input.bool(false, title="Enable Stop Loss", group=groupTradeManagement)
stopLossPerc    = input.float(1.0, title="Stop Loss (%)", step=0.1, group=groupTradeManagement)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

sma = ta.sma(src, length)
atr = ta.atr(length)

ratio1 = atr * fibo1
ratio2 = atr * fibo2
ratio3 = atr * fibo3

upper3 = sma + ratio3
upper2 = sma + ratio2
upper1 = sma + ratio1

lower1 = sma - ratio1
lower2 = sma - ratio2
lower3 = sma - ratio3

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// --------------------    Entry Logic    -------------------- //
targetBuy = fiboBuy == 'Fibo 1' ? upper1 : fiboBuy == 'Fibo 2' ? upper2 : upper3
buy = low < targetBuy and high > targetBuy

// --------------------    User-Defined Exit Logic    -------------------- //
targetSell = fiboSell == 'Fibo 1' ? lower1 : fiboSell == 'Fibo 2' ? lower2 : lower3
sell = low < targetSell and high > targetSell

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// --------------------    Trade Execution Flags    -------------------- //
var bool buyExecuted = false
var bool sellExecuted = false

float labelOffset = ta.atr(14) * signalOffset

// --------------------    Buy Logic    -------------------- //
if buy and timeCondition 
    if useProfitPerc or useStopLossPerc
        strategy.entry("Buy", strategy.long, stop=(useStopLossPerc ? close * (1 - stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 + takeProfitPerc / 100) : na))
    else
        strategy.entry("Buy", strategy.long)

    if showSignals and not buyExecuted
        buyExecuted := true  
        sellExecuted := false  
        label.new(bar_index, high - labelOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

// --------------------    Sell Logic    -------------------- //
if sell and timeCondition
    if useProfitPerc or useStopLossPerc
        strategy.entry("Sell", strategy.short, stop=(useStopLossPerc ? close * (1 + stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 - takeProfitPerc / 100) : na))
    else
        strategy.entry("Sell", strategy.short)

    if showSignals and not sellExecuted
        sellExecuted := true 
        buyExecuted := false  
        label.new(bar_index, low + labelOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)



// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(sma, style = plot.style_line, title = 'Basis', color = color.new(color.orange, 0), linewidth = 2, offset = offset)

upp3 = plot(upper3, title = 'Upper 3', color = color.new(color.teal, 90), offset = offset)
upp2 = plot(upper2, title = 'Upper 2', color = color.new(color.teal, 60), offset = offset)
upp1 = plot(upper1, title = 'Upper 1', color = color.new(color.teal, 30), offset = offset)

low1 = plot(lower1, title = 'Lower 1', color = color.new(color.teal, 30), offset = offset)
low2 = plot(lower2, title = 'Lower 2', color = color.new(color.teal, 60), offset = offset)
low3 = plot(lower3, title = 'Lower 3', color = color.new(color.teal, 90), offset = offset)

fill(upp3, low3, title = 'Background', color = color.new(color.teal, 95))