Bollinger Bands와 Woody CCI 다중 지표를 결합하여 거래 신호 필터링 전략

BB CCI MA OBV ATR SMA TP SL
생성 날짜: 2024-12-27 15:32:30 마지막으로 수정됨: 2024-12-27 15:32:30
복사: 0 클릭수: 416
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Bollinger Bands와 Woody CCI 다중 지표를 결합하여 거래 신호 필터링 전략

개요

이 전략은 볼린저 밴드, 우디 CCI, 이동 평균(MA), 온 밸런스 거래량(OBV)을 결합한 다중 지표 거래 시스템입니다. 이 전략은 볼린저 밴드를 사용하여 시장 변동성 범위를 제공하고, CCI 지표를 사용하여 거래 신호를 필터링한 다음 이동 평균 시스템과 거래량 확인을 결합하여 시장 추세가 명확할 때 거래합니다. 동시에 ATR을 사용하여 이익실현 및 손절매 포지션을 동적으로 설정하여 위험을 효과적으로 통제합니다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 요소에 기초합니다.

  1. 두 개의 표준편차 볼린저 밴드(1x 및 2x)를 사용하여 가격 변동 채널을 구축하고 시장 변동 범위에 대한 기준을 제공합니다.
  2. 6주기와 14주기 CCI지표를 신호필터로 활용하려면 두 주기의 CCI가 같은 방향으로 확인되어야 한다.
  3. 50기간 이동평균과 200기간 이동평균을 결합하여 시장 동향을 파악하고 이동평균이 교차할 때 초기 거래 신호를 생성합니다.
  4. 거래량 추세는 OBV 지표의 10기간 평활화를 통해 확인됩니다.
  5. 14기간 ATR을 사용하여 이익 실현 및 손절매를 동적으로 설정합니다. 롱 포지션의 경우 이익 실현은 ATR의 2배이고 손절매는 ATR의 1배입니다. 숏 포지션의 경우 그 반대입니다.

전략적 이점

  1. 다중 지표 교차 검증은 거짓 신호의 확률을 크게 줄입니다.
  2. Bollinger Bands와 CCI의 조합은 정확한 시장 변동성 판단을 제공합니다.
  3. 장기 및 단기 이동평균 시스템은 전반적인 추세를 효과적으로 파악합니다.
  4. OBV는 볼륨 지원을 확인하고 신호 안정성을 향상시킵니다.
  5. 다양한 시장 환경에 적응하기 위한 동적 손절매 및 손절매 설정
  6. 거래 신호는 명확하고, 실행은 표준화되어 있으며, 정량화하고 구현하기 쉽습니다.

전략적 위험

  1. 여러 지표가 신호 지연을 일으키고 최적의 진입 시간을 놓칠 수 있습니다.
  2. 변동성이 큰 시장에서는 손절매가 자주 발생할 수 있습니다.
  3. 매개변수 최적화에는 과적합의 위험이 있습니다.
  4. 심각한 변동성 기간 동안에는 손절매가 적절하지 않을 수 있습니다. 대책:
  • 다양한 시장 주기에 따라 지표 매개변수를 동적으로 조정합니다.
  • 실시간 리트레이스먼트 및 위치 제어 모니터링
  • 정기적으로 매개변수 유효성을 확인하세요
  • 최대 손실 한도를 설정하세요

전략 최적화 방향

  1. 변동성이 높은 기간 동안 포지션을 조정하기 위해 시장 변동성 지표를 도입합니다.
  2. 변동성이 큰 시장에서의 거래를 피하기 위해 추세 강도 필터를 추가하세요
  3. CCI 사이클 선택을 최적화하고 신호 감도를 향상시킵니다.
  4. 일괄적으로 이익 실현을 고려하는 등 손절매 및 손절매 메커니즘 개선
  5. 비정상 거래량 경고 메커니즘 추가

요약하다

이는 여러 가지 기술 지표를 조합한 완전한 거래 시스템으로, 여러 신호 확인을 통해 거래 정확도를 향상시킵니다. 전략은 합리적으로 설계되었고, 위험은 적절하게 통제되었으며, 실제 적용 가치가 좋습니다. 실제 거래에서는 보수적인 입장을 사용하여 테스트하는 것이 좋으며, 시장 상황에 따라 지속적으로 매개변수를 최적화하는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy(shorttitle="BB Debug + Woodies CCI Filter", title="Debug Buy/Sell Signals with Woodies CCI Filter", overlay=true)

// Input Parameters
length = input.int(20, minval=1, title="BB MA Length")
src = input.source(close, title="BB Source")
mult1 = input.float(1.0, minval=0.001, maxval=50, title="BB Multiplier 1 (Std Dev 1)")
mult2 = input.float(2.0, minval=0.001, maxval=50, title="BB Multiplier 2 (Std Dev 2)")
ma_length = input.int(50, minval=1, title="MA Length")
ma_long_length = input.int(200, minval=1, title="Long MA Length")
obv_smoothing = input.int(10, minval=1, title="OBV Smoothing Length")
atr_length = input.int(14, minval=1, title="ATR Length") // ATR Length for TP/SL

// Bollinger Bands
basis = ta.sma(src, length)
dev1 = mult1 * ta.stdev(src, length)
dev2 = mult2 * ta.stdev(src, length)

upper_1 = basis + dev1
lower_1 = basis - dev1
upper_2 = basis + dev2
lower_2 = basis - dev2

plot(basis, color=color.blue, title="BB MA")
p1 = plot(upper_1, color=color.new(color.green, 80), title="BB Upper 1")
p2 = plot(lower_1, color=color.new(color.green, 80), title="BB Lower 1")
p3 = plot(upper_2, color=color.new(color.red, 80), title="BB Upper 2")
p4 = plot(lower_2, color=color.new(color.red, 80), title="BB Lower 2")

fill(p1, p2, color=color.new(color.green, 90))
fill(p3, p4, color=color.new(color.red, 90))

// Moving Averages
ma_short = ta.sma(close, ma_length)
ma_long = ta.sma(close, ma_long_length)
plot(ma_short, color=color.orange, title="MA Short")
plot(ma_long, color=color.yellow, title="MA Long")

// OBV and Smoothing
obv = ta.cum(ta.change(close) > 0 ? volume : ta.change(close) < 0 ? -volume : 0)
obv_smooth = ta.sma(obv, obv_smoothing)

// Debugging: Buy/Sell Signals
debugBuy = ta.crossover(close, ma_short)
debugSell = ta.crossunder(close, ma_short)

// Woodies CCI
cciTurboLength = 6
cci14Length = 14
cciTurbo = ta.cci(src, cciTurboLength)
cci14 = ta.cci(src, cci14Length)

// Filter: Only allow trades when CCI confirms the signal
cciBuyFilter = cciTurbo > 0 and cci14 > 0
cciSellFilter = cciTurbo < 0 and cci14 < 0

finalBuySignal = debugBuy and cciBuyFilter
finalSellSignal = debugSell and cciSellFilter

// Plot Debug Buy/Sell Signals
plotshape(finalBuySignal, title="Filtered Buy", location=location.belowbar, color=color.lime, style=shape.triangleup, size=size.normal)
plotshape(finalSellSignal, title="Filtered Sell", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.normal)

// Change candle color based on filtered signals
barcolor(finalBuySignal ? color.lime : finalSellSignal ? color.red : na)

// ATR for Stop Loss and Take Profit
atr = ta.atr(atr_length)
tp_long = close + 2 * atr  // Take Profit for Long = 2x ATR
sl_long = close - 1 * atr  // Stop Loss for Long = 1x ATR
tp_short = close - 2 * atr // Take Profit for Short = 2x ATR
sl_short = close + 1 * atr // Stop Loss for Short = 1x ATR

// Strategy Execution
if (finalBuySignal)
    strategy.entry("Buy", strategy.long)
    strategy.exit("Take Profit/Stop Loss", "Buy", limit=tp_long, stop=sl_long)

if (finalSellSignal)
    strategy.entry("Sell", strategy.short)
    strategy.exit("Take Profit/Stop Loss", "Sell", limit=tp_short, stop=sl_short)

// Check for BTC/USDT pair
isBTCUSDT = syminfo.ticker == "BTCUSDT"

// Add alerts only for BTC/USDT
alertcondition(isBTCUSDT and finalBuySignal, title="BTCUSDT Buy Signal", message="Buy signal detected for BTCUSDT!")
alertcondition(isBTCUSDT and finalSellSignal, title="BTCUSDT Sell Signal", message="Sell signal detected for BTCUSDT!")