Chiến lược này là một hệ thống giao dịch sáng tạo kết hợp chuỗi Fibonacci và Bollinger Bands. Nó thay thế các trình nhân sai lệch chuẩn truyền thống của Bollinger Bands bằng tỷ lệ Fibonacci (1.618, 2.618, 4.236), tạo ra một hệ thống đánh giá biến động giá độc đáo. Chiến lược bao gồm các tính năng quản lý giao dịch toàn diện, bao gồm cài đặt dừng lỗ / lấy lợi nhuận và bộ lọc cửa sổ thời gian giao dịch, làm cho nó rất thực tế và linh hoạt.
Các tín hiệu giao dịch được tạo ra khi giá vượt qua các dải Fibonacci được người dùng chọn. Cụ thể, tín hiệu dài được kích hoạt khi giá thấp nằm dưới và giá cao nằm trên dải mua mục tiêu; tín hiệu ngắn được kích hoạt khi giá thấp nằm dưới và giá cao nằm trên dải bán mục tiêu.
Chiến lược này kết hợp sáng tạo các công cụ phân tích kỹ thuật cổ điển bằng cách tối ưu hóa các dải Bollinger truyền thống với trình tự Fibonacci. Ưu điểm chính của nó nằm trong khả năng thích nghi và linh hoạt, nhưng phải chú ý đến lựa chọn tham số và khả năng tương thích môi trường thị trường. Chiến lược có tiềm năng cải tiến đáng kể thông qua việc thêm các chỉ số xác nhận bổ sung và tối ưu hóa các cơ chế tạo tín hiệu.
/*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))