Strategi ini adalah sistem perdagangan inovatif yang menggabungkan urutan Fibonacci dan Bollinger Bands. Ia menggantikan pengganda penyimpangan standard Bollinger Bands tradisional dengan nisbah Fibonacci (1.618, 2.618, 4.236), mewujudkan sistem penilaian turun naik harga yang unik. Strategi ini merangkumi ciri pengurusan perdagangan yang komprehensif, termasuk tetapan stop-loss / take-profit dan penapis tingkap masa perdagangan, menjadikannya sangat praktikal dan fleksibel.
Logik terasnya adalah berdasarkan interaksi harga dengan Fibonacci Bollinger Bands. Ia mula-mula mengira Purata Bergerak Sederhana (SMA) sebagai band tengah, kemudian menggunakan ATR dikalikan dengan nisbah Fibonacci yang berbeza untuk membentuk band atas dan bawah. Isyarat dagangan dihasilkan apabila harga pecah melalui band Fibonacci yang dipilih oleh pengguna. Khususnya, isyarat panjang dicetuskan apabila harga rendah di bawah dan harga tinggi di atas rentang beli sasaran; isyarat pendek dicetuskan apabila harga rendah di bawah dan harga tinggi di atas rentang jual sasaran.
Strategi ini secara inovatif menggabungkan alat analisis teknikal klasik dengan mengoptimumkan Bollinger Bands tradisional dengan urutan Fibonacci. Kelebihan utamanya terletak pada daya adaptasi dan fleksibiliti, tetapi perhatian mesti diberikan kepada pemilihan parameter dan keserasian persekitaran pasaran. Strategi ini mempunyai potensi peningkatan yang signifikan melalui penambahan penanda pengesahan tambahan dan mengoptimumkan mekanisme penjanaan isyarat.
/*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))