MACD 모멘텀 지표 백테스팅 전략


생성 날짜: 2023-09-24 13:21:54 마지막으로 수정됨: 2023-09-24 13:21:54
복사: 1 클릭수: 796
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 MACD 동력 지표와 RSI 오버 바이 오버 시드 지표를 결합하여 MACD의 금포크 / 사다리 발생시 RSI가 대응하는 하위 / 상위 회전을 완료했는지 여부를 확인하여 더 신뢰할 수있는 거래 신호를 생성합니다. 전형적인 단기 반전 전략 아이디어 중 하나입니다.

전략 원칙

  1. MACD 지표의 DIFF, DEA 및 MACD 기둥을 계산한다. DIFF 위쪽이 DEA를 통과할 때 황금 포크 신호를 생성하고 아래쪽이 사다리 신호를 생성한다.

  2. RSI 지표를 계산하여 바닥이 반등하거나 꼭대기가 돌아온지 판단하고, 최근 단계의 바닥이나 꼭대기가 발생했는지 판단하기 위해 되돌아 보는 창을 설정합니다.

  3. MACD 금포크할 때, RSI가 뒤보기 창 안에서 촉각 바닥 반동을 완료하면, 볼 더 신호를 생성한다. MACD 사형포크할 때, RSI가 촉각 꼭대기 반동을 완료하면, 볼 공중 신호를 낸다.

  4. 출입 후 스톱로스를 설정하여 위험을 통제하십시오.

전략적 이점

  1. MACD는 트렌드 전환 시점을 민감하게 판단한다. RSI는 오버 바이 오버 소드를 판단한다.

  2. MACD와 RSI 토큰을 동시에 검증하여 가짜 신호를 필터링 할 수 있습니다.

  3. 창을 보고 신호의 신뢰성을 높여라.

  4. 위험 관리에 도움이 되는 Stop Loss 설정.

전략적 위험

  1. MACD와 RSI는 모두 다소 뒤쳐져 있으며, 최적의 입문점을 놓칠 수 있다.

  2. 동시에 두 지표 신호가 나타날 확률이 작고, 신호가 적다.

  3. 하지만, 이 모든 것은 큰 규모의 트렌드를 고려하지 않고, 쉽게 속일 수 있습니다.

  4. 부적절한 스톱더스 설정은 지나치게 느슨하거나 엄격할 수 있습니다.

대응방법:

  1. MACD와 RSI의 변수를 조정하여 지연 확률을 줄입니다.

  2. 더 많은 신호를 제공하기 위해 유효 범위를 적절하게 확장하십시오.

  3. 트렌드 필터링을 추가하여 역동적인 출전을 방지하십시오.

  4. 다양한 스톱 패러미터 설정을 테스트하여 최적의 것을 찾아보세요.

전략 최적화 방향

  1. SMA와 같은 다른 평행선의 효과를 테스트한다.

  2. 이동성 손실을 증가시켜 손실을 더 유연하게 만듭니다.

  3. 입학률을 평가하기 위한 트렌드 지표가 추가되었습니다.

  4. 기계학습을 도입하여 지표의 흐름을 예측한다.

  5. 더 많은 요소와 결합하여 입학 시점을 최적화하십시오.

요약하다

이 전략은 MACD와 RSI의 두 지표의 조합을 활용하여 신뢰할 수 있는 반전 신호를어낸 후 진입한다. 전략 아이디어는 명확하고, 매개 변수를 조정하는 것은 유연하며, 지표 선택, 트렌드 판단, 손실 중지 방법 등에서 확장될 수 있으며, 안정적인 기반을 유지하면서 더 많은 거래 기회를 얻을 수 있다. 그러나 과도한 최적화로 인해 안정성이 손실되는 것을 방지하기 위해 주의가 필요합니다.

전략 소스 코드
/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)