MACD 모멘텀 인디케이터 역 테스트 전략

저자:차오장, 날짜: 2023-09-24 13:21:54
태그:

전반적인 설명

이 전략은 MACD 모멘텀 지표와 RSI 과잉 구매/ 과잉 판매 지표를 결합한다. MACD가 상향 또는 하향을 넘을 때, RSI가 더 신뢰할 수 있는 거래 신호를 생성하기 위해 룩백 기간 동안 해당 바닥 / 상위 반전을 완료하는지 여부를 확인한다. 전형적인 단기 평균 반전 전략 논리.

전략 논리

  1. MACD DIFF, DEA 및 히스토그램을 계산합니다. DEA 위의 DIFF의 크로스오버는 상승 크로스오버 신호를 주고 아래의 크로스오버는 죽음의 크로스오버 신호를 줍니다.

  2. RSI를 계산하여 과반 판매 반등 및 과반 매수 판매를 식별합니다. 최근 바닥 또는 상점이 발생했는지 여부를 확인합니다.

  3. MACD 상승 크로스오버가 발생했을 때, RSI가 룩백 윈도우 내에서 과소매에서 반등한 경우, 긴 신호가 생성됩니다. MACD 죽음의 크로스에서는, RSI가 룩백 윈도우를 넘어서면 짧은 신호가 생성됩니다.

  4. 위험 통제에 들어가면 손해 중지 설정.

장점

  1. MACD는 트렌드 변화를 민감하게 식별합니다. RSI는 과잉 구매/ 과잉 판매 수준을 효과적으로 판단합니다.

  2. MACD와 RSI 신호가 필요하면 잘못된 신호를 필터링할 수 있습니다.

  3. 후면 창은 신호 신뢰성을 향상시킵니다.

  4. 스톱 로스는 리스크 관리에 도움이 됩니다.

위험성

  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)

더 많은