
이 전략은 피보나치 수열과 볼린저 밴드를 결합한 혁신적인 거래 시스템입니다. 기존 볼린저 밴드의 표준편차 배수를 피보나치 비율(1.618, 2.618, 4.236)로 대체하여 독특한 가격 변동 범위 판단 시스템을 형성합니다. 이 전략에는 손절매 및 손절매 설정, 거래 시간 창 필터링 등 완전한 거래 관리 기능이 포함되어 있어 매우 실용적이고 유연합니다.
이 전략의 핵심 논리는 가격과 피보나치 볼린저 밴드 간의 상호 작용에 기초합니다. 먼저, 중간 트랙으로 가격의 단순 이동 평균(SMA)을 계산한 다음, 다양한 피보나치 비율로 곱한 ATR을 사용하여 상단 및 하단 트랙을 형성합니다. 가격이 사용자가 선택한 피보나치 대역을 돌파하면 시스템에서 거래 신호가 생성됩니다. 구체적으로, 롱 신호는 최저가가 목표 매수 밴드보다 낮고 최고가가 밴드보다 높을 때 트리거되고, 숏 신호는 최저가가 목표 매도 밴드보다 낮고 최고가가 밴드보다 높을 때 트리거됩니다. 밴드보다.
이는 고전적인 기술적 분석 도구를 혁신적으로 결합하고 피보나치 수열을 통해 전통적인 볼린저 밴드 전략을 최적화한 전략입니다. 가장 큰 장점은 적응성과 유연성에 있지만, 이를 사용할 때는 매개변수 선택과 시장 환경의 일치에 주의해야 합니다. 이 전략에는 추가적인 확인 지표를 추가하고 신호 생성 메커니즘을 최적화함으로써 개선할 여지가 많이 있습니다.
/*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))