리소스 로딩... 로딩...

적응적 피보나치 볼링거 밴드 전략 분석

저자:차오장, 날짜: 2025-01-06 16:41:48
태그:ATRBBSMAFIB

img

전반적인 설명

이 전략은 피보나치 시퀀스와 볼링거 밴드를 결합한 혁신적인 거래 시스템이다. 전통적인 볼링거 밴드 표준 오차 곱셈을 피보나치 비율 (1.618, 2.618, 4.236) 로 대체하여 독특한 가격 변동성 평가 시스템을 만듭니다. 전략에는 스톱 로스 / 테이크 노프프 설정 및 거래 시간 창 필터 등 포괄적인 거래 관리 기능이 포함되어 있으며 매우 실용적이고 유연합니다.

전략 원칙

코어 논리는 피보나치 볼링거 밴드와 가격 상호 작용을 기반으로합니다. 먼저 중간 밴드로서 간단한 이동 평균 (SMA) 을 계산하고, 다음에는 상부 및 하부 밴드를 형성하기 위해 다른 피보나치 비율로 곱한 ATR을 사용합니다. 거래 신호는 사용자가 선택한 피보나치 밴드를 통해 가격이 깨지면 생성됩니다. 구체적으로, 낮은 가격이 목표 구매 밴드 아래에 있고 높은 가격이 목표 판매 밴드 위에있을 때 긴 신호가 유발됩니다. 낮은 가격이 목표 판매 밴드 아래에 있고 높은 가격이 목표 판매 밴드 위에있을 때 짧은 신호가 유발됩니다.

전략적 장점

  1. 강력한 적응력: ATR을 통해 대역폭을 동적으로 조정하여 다른 시장 조건에 더 잘 적응합니다.
  2. 높은 유연성: 사용자는 자신의 거래 스타일에 따라 다른 피보나치 대역을 거래 신호로 선택할 수 있습니다.
  3. 포괄적 리스크 관리: 내장된 수익/손실 중지 및 시간 필터링 기능으로 효과적으로 리스크를 제어합니다.
  4. 시각적 직관성: 대역 영역의 다른 투명성 수준은 거래자가 시장 구조를 이해하는 데 도움이됩니다.
  5. 명확한 계산 논리: 클래식 기술 지표 조합을 사용, 이해하기 쉽고 유지

전략 위험

  1. 가짜 파업 위험: 파업 후 가격이 즉시 다시 올라갈 수 있으며 잘못된 신호를 생성합니다.
  2. 매개 변수 민감도: 다른 피보나치 비율 선택은 전략 성과에 상당한 영향을 미칩니다.
  3. 시간 의존성: 거래 창이 활성화되면 중요한 거래 기회를 놓칠 수 있습니다.
  4. 시장 환경 의존성: 다양한 시장에서 과도한 신호를 생성 할 수 있습니다.

전략 최적화 방향

  1. 신호 확인 메커니즘: 브레이크오웃 확인을 위해 볼륨 또는 추진량 지표를 추가하는 것을 제안합니다.
  2. 동적 매개 변수 최적화: 시장 변동성에 따라 피보나치 비율을 자동으로 조정
  3. 시장 환경 필터링: 트렌드 식별 기능을 추가하고 다른 시장 조건에서 다른 매개 변수를 사용
  4. 신호 가중 시스템: 신호 신뢰성을 향상시키기 위해 다중 시간 프레임 분석을 설정
  5. 포지션 관리 최적화: 시장 변동성과 신호 강도에 따라 포지션 크기를 동적으로 조정합니다.

요약

이 전략은 전통적인 볼링거 밴드를 피보나치 순서로 최적화함으로써 고전적인 기술 분석 도구를 혁신적으로 결합한다. 그것의 주요 장점은 적응력과 유연성, 그러나 매개 변수 선택과 시장 환경 호환성에 주의를 기울여야 한다. 이 전략은 추가 확인 지표를 추가하고 신호 생성 메커니즘을 최적화함으로써 상당한 개선 잠재력을 가지고 있다.


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


관련

더 많은