Análise da estratégia de bandas de Bollinger adaptáveis ​​com base na sequência de Fibonacci

ATR BB SMA FIB
Data de criação: 2025-01-06 16:41:48 última modificação: 2025-01-06 16:41:48
cópia: 2 Cliques: 434
1
focar em
1617
Seguidores

Análise da estratégia de bandas de Bollinger adaptáveis ​​com base na sequência de Fibonacci

Visão geral

Esta estratégia é um sistema de negociação inovador que combina a sequência de Fibonacci e as Bandas de Bollinger. Ele forma um sistema exclusivo de julgamento de faixa de flutuação de preços, substituindo os múltiplos de desvio padrão das Bandas de Bollinger tradicionais pela razão de Fibonacci (1,618, 2,618, 4,236). A estratégia inclui funções completas de gerenciamento de transações, incluindo configurações de stop-profit e stop-loss e filtragem de janela de tempo de transação, tornando-a altamente prática e flexível.

Princípio da estratégia

A lógica central da estratégia é baseada na interação entre o preço e as Bandas de Bollinger de Fibonacci. Primeiro, calcule a média móvel simples (MMS) do preço como a trilha do meio e, em seguida, use o ATR multiplicado por diferentes índices de Fibonacci para formar as trilhas superior e inferior. Quando o preço ultrapassa a banda de Fibonacci selecionada pelo usuário, o sistema gera um sinal de negociação. Especificamente, um sinal longo é acionado quando o preço mais baixo é menor do que a banda de compra alvo e o preço mais alto é maior do que a banda; um sinal curto é acionado quando o preço mais baixo é menor do que a banda de venda alvo e o preço mais alto é maior do que a banda.

Vantagens estratégicas

  1. Forte adaptabilidade: ajuste dinamicamente a largura de banda por meio do ATR para que a estratégia se adapte melhor a diferentes ambientes de mercado
  2. Alta flexibilidade: os usuários podem escolher diferentes bandas de Fibonacci como sinais de negociação de acordo com seu estilo de negociação
  3. Gestão de risco perfeita: funções integradas de stop-profit, stop-loss e filtragem de tempo para controlar riscos de forma eficaz
  4. Intuição visual: bandas com diferentes níveis de transparência facilitam a compreensão da estrutura do mercado pelos traders
  5. Lógica de cálculo clara: use a combinação clássica de indicadores técnicos, fácil de entender e manter

Risco estratégico

  1. Risco de falso rompimento: os preços podem cair imediatamente após um rompimento, gerando um sinal falso
  2. Sensibilidade dos parâmetros: Diferentes escolhas de índices de Fibonacci podem afetar significativamente o desempenho da estratégia
  3. Dependência de tempo: se você habilitar janelas de tempo de negociação, poderá perder oportunidades de negociação importantes
  4. Dependência do ambiente de mercado: pode gerar muitos sinais de negociação em um mercado volátil

Direção de otimização da estratégia

  1. Mecanismo de confirmação de sinal: é recomendado adicionar indicadores de volume ou momentum como confirmação de avanço
  2. Otimização dinâmica de parâmetros: as taxas de Fibonacci podem ser ajustadas automaticamente com base na volatilidade do mercado
  3. Filtragem do ambiente de mercado: adicione a função de julgamento de tendências e use parâmetros diferentes em diferentes ambientes de mercado
  4. Sistema de ponderação de sinal: Estabeleça análises de múltiplos intervalos de tempo para melhorar a confiabilidade do sinal
  5. Otimização do gerenciamento de posição: ajuste dinamicamente o tamanho da posição com base na volatilidade do mercado e na força do sinal

Resumir

Esta é uma estratégia que combina de forma inovadora ferramentas clássicas de análise técnica e otimiza a estratégia tradicional de Bandas de Bollinger por meio da sequência de Fibonacci. Suas principais vantagens estão na adaptabilidade e flexibilidade, mas ao utilizá-lo, deve-se atentar para a adequação entre a seleção dos parâmetros e o ambiente de mercado. Ainda há muito espaço para melhorias nesta estratégia, adicionando indicadores de confirmação adicionais e otimizando o mecanismo de geração de sinais.

Código-fonte da estratégia
/*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))