Analyse de la stratégie adaptative des bandes de Bollinger basée sur la séquence de Fibonacci

ATR BB SMA FIB
Date de création: 2025-01-06 16:41:48 Dernière modification: 2025-01-06 16:41:48
Copier: 2 Nombre de clics: 434
1
Suivre
1617
Abonnés

Analyse de la stratégie adaptative des bandes de Bollinger basée sur la séquence de Fibonacci

Aperçu

Cette stratégie est un système de trading innovant qui combine la séquence de Fibonacci et les bandes de Bollinger. Il forme un système unique de jugement de la plage de fluctuation des prix en remplaçant les multiples d’écart type des bandes de Bollinger traditionnelles par le ratio de Fibonacci (1,618, 2,618, 4,236). La stratégie comprend des fonctions complètes de gestion des transactions, y compris les paramètres de stop-profit et de stop-loss et le filtrage de la fenêtre de temps de transaction, ce qui la rend très pratique et flexible.

Principe de stratégie

La logique principale de la stratégie repose sur l’interaction entre le prix et les bandes de Fibonacci Bollinger. Tout d’abord, calculez la moyenne mobile simple (SMA) du prix comme piste médiane, puis utilisez l’ATR multiplié par différents ratios de Fibonacci pour former les pistes supérieure et inférieure. Lorsque le prix franchit la bande de Fibonacci sélectionnée par l’utilisateur, le système génère un signal de trading. Plus précisément, un signal long est déclenché lorsque le prix le plus bas est inférieur à la bande d’achat cible et que le prix le plus élevé est supérieur à la bande ; un signal short est déclenché lorsque le prix le plus bas est inférieur à la bande de vente cible et que le prix le plus élevé est supérieur à la bande. que le groupe.

Avantages stratégiques

  1. Forte adaptabilité : ajustez dynamiquement la bande passante via l’ATR pour que la stratégie s’adapte mieux aux différents environnements de marché
  2. Grande flexibilité : les utilisateurs peuvent choisir différentes bandes de Fibonacci comme signaux de trading en fonction de leur style de trading
  3. Gestion parfaite des risques : fonctions intégrées de stop-profit, stop-loss et filtrage temporel pour contrôler efficacement les risques
  4. Intuition visuelle : Différentes bandes de transparence sont affichées pour aider les traders à comprendre la structure du marché
  5. Logique de calcul claire : utilisez une combinaison d’indicateurs techniques classiques, faciles à comprendre et à entretenir

Risque stratégique

  1. Risque de fausse cassure : les prix peuvent retomber immédiatement après une cassure, générant un faux signal
  2. Sensibilité des paramètres : Différents choix de ratios de Fibonacci peuvent affecter considérablement les performances de la stratégie
  3. Dépendance temporelle : si vous activez des fenêtres de temps de trading, vous risquez de manquer des opportunités de trading importantes
  4. Dépendance à l’environnement du marché : peut générer trop de signaux de trading dans un marché volatil

Orientation de l’optimisation de la stratégie

  1. Mécanisme de confirmation du signal : il est recommandé d’ajouter des indicateurs de volume ou de momentum comme confirmation de percée
  2. Optimisation dynamique des paramètres : les ratios de Fibonacci peuvent être ajustés automatiquement en fonction de la volatilité du marché
  3. Filtrage de l’environnement de marché : ajoutez une fonction de jugement de tendance et utilisez différents paramètres dans différents environnements de marché
  4. Système de pondération du signal : établir une analyse à périodes multiples pour améliorer la fiabilité du signal
  5. Optimisation de la gestion des positions : ajustez dynamiquement la taille de la position en fonction de la volatilité du marché et de la force du signal

Résumer

Il s’agit d’une stratégie qui combine de manière innovante des outils d’analyse technique classiques et optimise la stratégie traditionnelle des bandes de Bollinger via la séquence de Fibonacci. Ses principaux avantages résident dans son adaptabilité et sa flexibilité, mais lors de son utilisation, il convient de prêter attention à l’adéquation entre la sélection des paramètres et l’environnement du marché. Il reste encore beaucoup de place pour améliorer cette stratégie en ajoutant des indicateurs de confirmation supplémentaires et en optimisant le mécanisme de génération de signaux.

Code source de la stratégie
/*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))