볼린저 밴드와 MACD를 기반으로 한 양적 거래 전략


생성 날짜: 2023-12-20 15:55:18 마지막으로 수정됨: 2023-12-20 15:55:18
복사: 0 클릭수: 943
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

볼린저 밴드와 MACD를 기반으로 한 양적 거래 전략

개요

이 전략은 부린띠와 MACD 지표를 결합하여 부린띠를 사용하여 시장 과매매 기회를 판단하고 MACD 지표를 사용하여 추세 반전을 판단하여 낮은 가격으로 높은 가격으로 판매하는 양적 거래 전략을 달성합니다. 전략 이름은 布林MACD 반전 전략 입니다.

전략 원칙

이 전략은 먼저 20일 부린 반도를 계산하며, 중궤도, 상궤도, 하궤도를 포함한다. 가격이 하궤도를 접촉할 때, 시장이 과매매 상태에 있다고 간주한다. 이 때 MACD 지표와 결합하여 추세가 반전되는지 판단하고, 차이는 MACD가 상향으로 신호선을 돌파하면, 이번 라운드 하락의 끝으로 판단하고, 그에 상응하는 것은 구매 신호이다.

구체적으로, 브린은 하향 레일 터치와 격차 MACD가 브레이크 신호 라인을 향해 동시에 트리거 할 때 구매 신호를 생성합니다. 종결 가격은 스톱 지점을 초과 할 때 스톱 신호를 생성합니다.

전략적 강점 분석

이 전략은 브린띠 판단 과매매 지역과 MACD 판단 트렌드 반전 신호를 통합하여 낮은 구매 가격을 달성한다. 동시에, 전략은 중지 방식을 추가하여 수익을 잠금하고 손실을 방지 할 수 있다.

특히, 장점은 다음과 같습니다:

  1. 브린지트 오버셀 지역과 MACD 지표와 결합하여 우수한 구매 지점을 달성합니다.
  2. MACD를 사용하여 트렌드 반전점을 판단하여 가짜 돌파의 가능성을 줄이십시오.
  3. 제1차 세계대전 당시, 제2차 세계대전 당시, 제2차 세계대전 당시, 제3차 세계대전 당시, 제4차 세계대전 당시,

전략적 위험 분석

이 전략에는 다음과 같은 몇 가지 측면에 초점을 맞춘 위험도 있습니다.

  1. 부린 띠의 침입 가능성이 존재하여 과매도 지역 판단이 무효화 될 수 있습니다.
  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