볼링거 밴드 통합 전략

저자:차오장, 날짜: 2024-02-22 13:43:14
태그:

img

전반적인 설명

볼링거 밴드 통합 전략은 볼링거 밴드를 사용하여 낮은 변동성 통합 단계를 식별하는 획기적인 전략입니다. 시장이 변동성 기간에 들어갈 때 볼링거 밴드는 시장에 진입 할 수있는 기회를 알리는 것으로 컨버전합니다. 우리는 또한 변동성의 감소를 확인하기 위해 평균 진정한 범위 지표를 포함합니다.

전략 논리

이 전략은 주로 볼링거 밴드에 의존하여 가격이 낮은 변동성 통합 단계에 들어갈 때 탐지합니다. 볼링거 밴드의 중간 밴드는 폐쇄 가격의 이동 평균입니다. 상위 및 하부 밴드는 중간 밴드 위와 아래의 두 표준 편차로 상쇄됩니다. 변동성이 감소하면 상위 및 하위 밴드 사이의 거리는 눈에 띄게 좁아집니다. 우리는 먼저 현재 ATR 값이 볼링거 밴드 사이의 표준 편차보다 작는지 확인하여 개조를 사전 확인합니다. 이것은 가격이 통합에 들어갔음을 신호합니다.

변동성의 감소를 추가로 증명하기 위해, 우리는 ATR 값의 이동 평균이 하향 추세를 보이는지 확인합니다. 평균 ATR의 감소는 변동성이 감소하고 있다는 측면에서도 확인됩니다. 두 조건이 동시에 충족되면 볼링거 밴드가 상당한 컨버전스를 보였다는 것을 결정합니다. 이것은 훌륭한 구매 기회입니다.

구매 후, 우리는 ATR 값의 두 배의 스톱 로스 거리를 가진 이동 스톱 로스 전략을 활성화합니다. 이것은 손실을 효과적으로 제어합니다.

이점 분석

이 전략의 가장 큰 장점은 시장이 낮은 변동성 통합 단계에 들어갈 때를 정확하게 결정하고 최고의 구매 기회를 식별 할 수 있다는 것입니다. 다른 장기 전략에 비해 볼링거 밴드 통합 전략은 수익 가능성이 높습니다.

또한, 전략은 또한 적극적으로 위험을 제어하기 위해 이동 스톱 손실을 사용합니다. 이것은 시장 정서가 불리 할 때에도 손실 감소를 극대화합니다. 많은 장기 전략이 이것을 가지고 있지 않습니다.

위험 분석

전략의 주요 위험은 볼링거 밴드 지표가 가격 변동성의 변화를 100% 정확하게 결정할 수 없다는 것입니다. 볼링거 밴드가 변동성이 감소했다고 잘못 판단하면 입시 시기가 불리 할 수 있습니다. 이 시점에서 이동 스톱 손실은 중요한 역할을하고 가능한 한 빨리 거래를 종료 할 수 있습니다.

또한, 전략의 다양한 매개 변수 설정은 또한 결과에 영향을 미칩니다. 전략을 더 견고하게 만들기 위해 광범위한 백테스팅을 통해 매개 변수를 최적화해야합니다.

최적화 방향

우리는 볼링거 밴드가 컨버전할 때 트렌드 인디케이터에서 전환 신호를 확인하기 위해 다른 지표를 추가하는 것을 고려할 수 있습니다. 예를 들어, 볼링거 밴드가 컨버전할 때 MACD 차이는 긍정에서 부정으로 전환되었거나 RSI가 과잉 구매 구역에서 철수했음을 요구합니다. 이것은 구매 신호의 정확성을 더욱 향상시킬 수 있습니다.

또 다른 방향은 볼링거 밴드, ATR 및 이동 스톱 손실의 곱하기기와 같은 다른 매개 변수 설정의 결과에 대한 영향을 테스트하는 것입니다. 최적 매개 변수 조합을 찾기 위해 단계적 최적화를 사용해야합니다.

결론

볼링거 밴드 통합 전략은 가격 변동성이 감소하는 시기를 결정하기 위해 볼링거 밴드를 활용하고 위험을 효과적으로 제어하기 위해 이동 스톱 로스를 사용합니다. 비교적 안정적인 장기적인 브레이크 아웃 전략입니다. 우리는 여전히 매개 변수를 더 최적화하고 전략의 견고성을 높이기 위해 다른 지표를 통합해야합니다.


/*backtest
start: 2023-02-15 00:00:00
end: 2024-02-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji

//@version=4
strategy("[KL] Bollinger Bands Consolidation Strategy",overlay=true,pyramiding=1)

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("19 Apr 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }

// Indicator: BOLL bands {
BOLL_length = 20//input(20,title="Periods to lookback for BOLL and ATR calc. (default 20)")
BOLL_src = close
BOLL_center = sma(BOLL_src, BOLL_length)
BOLL_sDEV_x2 = 2 * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_center + BOLL_sDEV_x2
BOLL_lower = BOLL_center - BOLL_sDEV_x2
plot(BOLL_center, "Basis", color=#872323, offset = 0)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = 0, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = 0, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// ATR and volatility Indicator {
ATR_x2 = atr(BOLL_length) * 2 // multiplier aligns with BOLL
avg_volat = sma(ATR_x2, BOLL_length)
//}

// Trailing stop loss {
var entry_price = float(0)
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
trail_profit_line_color = color.green
UPDATE_ATR_TSL = false
if strategy.position_size == 0 or not within_timeframe // make TSL line less visible
    trail_profit_line_color := color.black
    stop_loss_price := close - trailing_SL_buffer
else if strategy.position_size > 0
    if UPDATE_ATR_TSL and ATR_x2 < trailing_SL_buffer
        trailing_SL_buffer := ATR_x2
    stop_loss_price := max(stop_loss_price, close[1] - trailing_SL_buffer)
plot(stop_loss_price,color=trail_profit_line_color)
// }


IGNORE_BOLL_SHAPE = false//input(false,title="Ignore BOLL (vs ATR) during entry (experimental)")
IGNORE_VOLATILITY = false///input(false,title="Ignore average ATR during entry (experimental)")
// Main:
if within_timeframe
    // ENTRY:
    if (ATR_x2 > BOLL_sDEV_x2 or IGNORE_BOLL_SHAPE) and (avg_volat < avg_volat[1] or IGNORE_VOLATILITY)
        if strategy.position_size == 0
            entry_price := close
            trailing_SL_buffer := ATR_x2
            stop_loss_price := close - ATR_x2
            strategy.entry("Long",strategy.long, comment="enter")
        if strategy.position_size > 0
            strategy.entry("Long",strategy.long, comment="+")

    // EXIT:
    if strategy.position_size > 0
        if low <= stop_loss_price
            if close > entry_price
                strategy.close("Long", comment="take profit")
            else if low <= entry_price
                strategy.close("Long", comment="stop loss")
    
            if strategy.position_size == 0
                entry_price := 0
                

더 많은