Die Ressourcen sind geladen. Beförderung...

Adaptive Fibonacci-Bollinger-Bänder Strategieanalyse

Schriftsteller:ChaoZhang, Datum: 2025-01-06 16.41:48
Tags:ATRBBSMAFIB

img

Übersicht

Diese Strategie ist ein innovatives Handelssystem, das Fibonacci-Sequenz und Bollinger Bands kombiniert. Es ersetzt traditionelle Bollinger Bands Standardabweichungsmultiplikatoren durch Fibonacci-Verhältnisse (1.618, 2.618, 4.236), wodurch ein einzigartiges System zur Bewertung der Preisvolatilität geschaffen wird. Die Strategie umfasst umfassende Handelsmanagementfunktionen, einschließlich Stop-Loss / Take-Profit-Einstellungen und Handelszeitfensterfilter, was sie sehr praktisch und flexibel macht.

Strategieprinzip

Die Kernlogik basiert auf den Preisinteraktionen mit Fibonacci-Bollinger-Bändern. Er berechnet zunächst einen einfachen gleitenden Durchschnitt (SMA) als mittleres Band und verwendet dann ATR multipliziert mit verschiedenen Fibonacci-Verhältnissen, um obere und untere Bands zu bilden. Handelssignale werden erzeugt, wenn der Preis durch benutzerdefinierte Fibonacci-Bänder bricht. Insbesondere wird ein langes Signal ausgelöst, wenn der niedrige Preis unterhalb und der hohe Preis über dem Zielkaufband liegt; ein kurzes Signal wird ausgelöst, wenn der niedrige Preis unterhalb und der hohe Preis über dem Zielverkaufsband liegt.

Strategische Vorteile

  1. Starke Anpassungsfähigkeit: Dynamische Anpassung der Bandbreite durch ATR, bessere Anpassung an verschiedene Marktbedingungen
  2. Hohe Flexibilität: Benutzer können je nach Handelsstil verschiedene Fibonacci-Bänder als Handelssignale auswählen
  3. Umfassendes Risikomanagement: Eingebettete Take-Profit/Stop-Loss- und Zeitfilterungsfunktionen kontrollieren das Risiko wirksam
  4. Visuelle Intuitivität: Verschiedene Transparenzniveaus von Bandbereichen helfen Händlern, die Marktstruktur zu verstehen
  5. Klare Berechnungslogik: Verwendet klassische Kombinationen technischer Indikatoren, leicht verständlich und zu pflegen

Strategische Risiken

  1. Risiko eines falschen Ausbruchs: Der Preis kann sich nach dem Ausbruch sofort zurückziehen und falsche Signale erzeugen.
  2. Parameterempfindlichkeit: Unterschiedliche Fibonacci-Ratio-Wähle beeinflussen die Strategieleistung erheblich
  3. Zeitabhängigkeit: Wenn das Handelsfenster aktiviert ist, können wichtige Handelsmöglichkeiten verpasst werden
  4. Abhängigkeit vom Marktumfeld: Kann in verschiedenen Märkten übermäßige Signale erzeugen

Strategieoptimierungsrichtlinien

  1. Signalbestätigungsmechanismus: Vorschlage, Volumen- oder Impulsindikatoren zur Breakoutbestätigung hinzuzufügen
  2. Dynamische Parameteroptimierung: Fibonacci-Verhältnisse automatisch anhand der Marktvolatilität anpassen
  3. Filterung der Marktumgebung: Hinzufügen von Funktionen zur Identifizierung von Trends, Verwendung verschiedener Parameter unter unterschiedlichen Marktbedingungen
  4. Signal-Weighting-System: Einrichtung einer mehrzeitlichen Analyse zur Verbesserung der Signalzuverlässigkeit
  5. Optimierung des Positionsmanagements: Dynamische Anpassung der Positionsgröße auf der Grundlage von Marktvolatilität und Signalstärke

Zusammenfassung

Diese Strategie kombiniert innovative klassische technische Analysewerkzeuge, indem sie traditionelle Bollinger-Bänder mit der Fibonacci-Sequenz optimiert. Ihre Hauptvorteile liegen in der Anpassungsfähigkeit und Flexibilität, aber es muss auf die Parameterwahl und die Kompatibilität mit dem Marktumfeld geachtet werden. Die Strategie hat durch das Hinzufügen zusätzlicher Bestätigungsindikatoren und die Optimierung der Signalgenerierungsmechanismen ein erhebliches Verbesserungspotenzial.


/*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))


Verwandt

Mehr