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

볼링거 반드와 우디스 CCI를 이용한 다중 지표 필터링 거래 전략

저자:차오장, 날짜: 2024-12-27 15:32:30
태그:BBCCIMAOBVATRSMATPSL

img

전반적인 설명

이 전략은 볼링거 밴드, 우디스 CCI (상품 채널 지수), 이동 평균 (MA), 그리고 밸런스 부피 (OBV) 를 결합한 다중 지표 거래 시스템이다. 시장 변동성 범위를 제공하기 위해 볼링거 밴드, 신호 필터링을 위한 CCI 지표를 사용하며, 시장 트렌드가 명확할 때 거래를 실행하기 위해 MA 시스템을 부피 확인과 결합한다. 또한, 위험성을 효과적으로 제어하기 위해 동적 스톱-로스 및 영업 입지를 위해 ATR을 사용합니다.

전략 원칙

핵심 논리는 다음과 같은 핵심 요소에 기반합니다.

  1. 두 개의 표준 오차 볼링거 밴드 (1x 및 2x) 를 사용하여 가격 변동 채널을 구성합니다.
  2. 신호 필터로 6주기 및 14주기 CCI 지표를 사용합니다. 두 시기의 확인이 필요합니다.
  3. 시장 동향을 결정하기 위해 50주기 및 200주기 이동 평균을 결합합니다.
  4. 10주기 평형 OBV를 통해 볼륨 트렌드를 확인합니다
  5. 동적 스톱 로스 및 영업 마이너스 레벨에 대해 14 기간 ATR을 사용합니다.

전략적 장점

  1. 여러 지표의 교차 검증은 잘못된 신호를 크게 줄입니다.
  2. 볼링거 밴드와 CCI 조합은 시장 변동성에 대한 정확한 판단을 제공합니다.
  3. 장기 및 단기 MA 시스템은 주요 동향을 효과적으로 포착합니다.
  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!")

관련

더 많은