볼링거 대역 및 MACD를 기반으로 하는 거래 전략

저자:차오장, 날짜: 2023-12-20 15:55:18
태그:

img

전반적인 설명

이 전략은 양적 거래에 대한 과판 기회와 트렌드 반전을 식별하기 위해 볼링거 밴드와 MACD 지표를 결합합니다. 전략 이름은 볼링거 MACD 반전 전략입니다.

전략 논리

이 전략은 먼저 중간 밴드, 상부 밴드 및 하부 밴드를 포함한 20 일간의 볼링거 밴드를 계산합니다. 가격이 하부 밴드에 닿을 때, 그것은 시장을 과판된 것으로 간주합니다. 이 시점에서 트렌드가 역전되고 있는지 판단하기 위해 MACD 지표와 결합합니다. MACD 히스토그램이 신호 라인 위에 긍정적으로 넘어가면 구매 신호에 해당하는 이 하락 라운드의 끝을 결정합니다.

구체적으로 볼린거 하위 대역과 MACD 히스토그램 교차 신호 라인을 만지면 구매 신호가 동시에 긍정적으로 발동됩니다. 닫기 가격이 스톱 로스 수준을 넘으면 수익 신호가 발동됩니다.

이점 분석

이 전략은 과잉 판매 구역과 MACD를 판단하기 위해 볼링거 밴드를 통합하여 트렌드 반전 신호를 결정하여 상대적으로 낮은 입시 가격을 실현합니다. 이윤을 확보하고 손실을 피하기 위해 수익을 취하는 방법도 포함합니다.

특히 이점은 다음과 같습니다.

  1. 더 나은 진입 지점을 달성하기 위해 볼링거 밴드 과잉 판매 구역과 MACD 지표를 결합합니다.
  2. 트렌드 반전 지점을 결정하기 위해 MACD 지표를 사용하여 잘못된 파업 가능성을 줄입니다.
  3. 위험을 효과적으로 제어하기 위해 스톱 로스/프로프트 취득 방법을 채택

위험 분석

여전히 다음과 같은 측면에서 몇 가지 위험이 있습니다.

  1. 볼링거 밴드 (Bollinger Bands) 파업의 가능성이 존재하고, 이는 과잉 판매 구역 판단에서 실패를 초래할 수 있습니다.
  2. MACD 히스토그램 크로스오버도 거짓일 수 있습니다. 판단 오류 확률이 있습니다.
  3. 스톱 로스 위치 설정이 부적절하거나 너무 느슨하거나 엄격하여 충분한 방어 또는 조기 스톱 로스로 이어질 수 있습니다.

위의 위험으로부터 헤딩을 하기 위해 다음의 조치를 취할 수 있습니다.

  1. 다른 지표와 결합하여 볼링거 밴드 파업 신호의 유효성을 확인합니다.
  2. MACD 거짓 크로스오버를 피하기 위해 필터로 모멘텀 지표 등을 추가합니다.
  3. 다양한 스톱 손실 매개 변수를 최적화하고 테스트합니다.

최적화 방향

아직은 더 많은 최적화를 위한 여지가 있습니다.

  1. 더 나은 과판 판정을 찾기 위해 볼링거 밴드 매개 변수를 최적화
  2. MACD 판단의 유효성을 향상시키기 위해 모멘텀 지표 필터를 추가합니다.
  3. 더 나은 매개 변수를 찾기 위해 ATR와 같은 중지 손실 방법을 테스트
  4. 트렌드 판단 모듈을 추가하여 역 트렌드 거래를 피합니다.
  5. 기계 학습 방법을 결합하여 판단 모델을 훈련시키고 전반적인 전략 성능을 향상시킵니다.

결론

이 전략은 상대적으로 더 나은 입구점을 달성하기 위해 볼링거 밴드 과잉 판매 구역 판단과 MACD 트렌드 역전 지표를 통합합니다. 또한 위험을 제어하기 위해 스톱 로스 / 취득 방법을 설정합니다. 이것은 참조 및 최적화를위한 가치있는 낮은 구매 높은 판매 전략입니다. 더 많은 지표 필터와 기계 학습 방법과 결합하여 성능을 더 향상시킬 여지가 있습니다.


/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 00:00:00
period: 1h
basePeriod: 15m
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] BOLL + MACD Strategy v2 (published)",overlay=true)

// BOLL bands {
BOLL_length = 20
BOLL_src = close
BOLL_mult = 2.0
BOLL_basis = sma(BOLL_src, BOLL_length)
BOLL_dev = BOLL_mult * stdev(BOLL_src, BOLL_length)
BOLL_upper = BOLL_basis + BOLL_dev
BOLL_lower = BOLL_basis - BOLL_dev
BOLL_offset = 0
plot(BOLL_basis, "Basis", color=#872323, offset = BOLL_offset)
BOLL_p1 = plot(BOLL_upper, "Upper", color=color.navy, offset = BOLL_offset, transp=50)
BOLL_p2 = plot(BOLL_lower, "Lower", color=color.navy, offset = BOLL_offset, transp=50)
fill(BOLL_p1, BOLL_p2, title = "Background", color=#198787, transp=85)
// }
// MACD signals {
MACD_fastLen = 12
MACD_slowLen = 26
MACD_Len = 9
MACD = ema(close, MACD_fastLen) - ema(close, MACD_slowLen)
aMACD = ema(MACD, MACD_Len)
MACD_delta = MACD - aMACD
// }
backtest_timeframe_start = input(defval = timestamp("01 Nov 2010 13:30 +0000"), title = "Backtest Start Time", type = input.time)
//backtest_timeframe_end = input(defval = timestamp("05 Mar 2021 19:30 +0000"), title = "Backtest End Time", type = input.time)
TARGET_PROFIT_MODE = input(false,title="Exit when Risk:Reward met")
REWARD_RATIO = input(3,title="Risk:[Reward] (i.e. 3) for exit")
// Trailing stop loss {
var entry_price = float(0)
ATR_multi_len = 26
ATR_multi = input(2, "ATR multiplier for stop loss")
ATR_buffer = atr(ATR_multi_len) * ATR_multi
risk_reward_buffer = (atr(ATR_multi_len) * ATR_multi) * REWARD_RATIO
take_profit_long = low > entry_price + risk_reward_buffer
take_profit_short = low < entry_price - risk_reward_buffer
var bar_count = 0 //number of bars since entry 
var trailing_SL_buffer = float(0)
var stop_loss_price = float(0)
stop_loss_price := max(stop_loss_price, close - trailing_SL_buffer)
// plot TSL line
trail_profit_line_color = color.green
if strategy.position_size == 0
    trail_profit_line_color := color.blue
    stop_loss_price := low
plot(stop_loss_price,color=trail_profit_line_color)
// } 

var touched_lower_bb = false

if true// and time <= backtest_timeframe_end
    if low <= BOLL_lower
        touched_lower_bb := true
    else if strategy.position_size > 0
        touched_lower_bb := false//reset state
    expected_rebound = MACD > MACD[1] and abs(MACD - aMACD) < abs(MACD[1] - aMACD[1])
    buy_condition = touched_lower_bb and MACD > aMACD or expected_rebound

    //ENTRY:
    if strategy.position_size == 0 and buy_condition
        entry_price := close
        trailing_SL_buffer := ATR_buffer
        stop_loss_price := close - ATR_buffer
        strategy.entry("Long",strategy.long, comment="buy")
        bar_count := 0
    else if strategy.position_size > 0
        bar_count := bar_count + 1

    //EXIT: 
    // Case (A) hits trailing stop
    if strategy.position_size > 0 and close <= stop_loss_price
        if close > entry_price
            strategy.close("Long", comment="take profit [trailing]")
            stop_loss_price := 0
        else if close <= entry_price and bar_count
            strategy.close("Long", comment="stop loss")
            stop_loss_price := 0
        bar_count := 0
    // Case (B) take targeted profit relative to risk 
    if strategy.position_size > 0 and TARGET_PROFIT_MODE
        if take_profit_long
            strategy.close("Long", comment="take profits [risk:reward]")
            stop_loss_price := 0
        bar_count := 0

더 많은