적응형 ATR 스톱 로스로 MACD 거래 전략

저자:차오장, 날짜: 2023-09-20 15:23:00
태그:

전반적인 설명

이 전략은 거래 신호를 생성하기 위해 MACD 지표를 사용하고 위험을 제어하기 위해 적응형 ATR 기반의 스톱 로스를 사용합니다. 트렌드 다음 전략에 속합니다.

전략 논리

  1. MACD 델타 라인 크로스오버 0은 구매 및 판매 신호를 생성합니다.

  2. ATR의 최근 N 기간을 기준으로 계산된 동적 스톱 로스 (Dynamic stop loss) 는 변동성을 반영합니다.

  3. 스톱 손실은 변동성 변화에 따라 적응적으로 조정되며 변동성이 증가하면 넓어집니다.

  4. 포지션에 있을 때 실시간으로 스톱 로스를 업데이트하여 수익을 확보하고 위험을 제어합니다.

  5. 리스크를 관리하기 위해 스톱 로스가 트리거될 때 진출 포지션

장점

  1. MACD는 트렌드를 추적하는데 민감합니다.

  2. 적응식 스톱은 다른 시장 환경에 적합하며 너무 단단하거나 느슨한 스톱을 피합니다.

  3. 시각적인 스톱 라인은 직관적으로 위험 상태를 반영합니다.

  4. 간단하고 명확한 전략 규칙, 이해하기 쉽고 실행하기 쉽습니다.

  5. 통제 가능한 수요와 효과적인 위험 관리

위험성

  1. MACD는 잘못된 신호를 생성하여 불필요한 손실을 유발할 수 있습니다.

  2. 부적절한 ATR 매개 변수는 너무 단단하거나 느슨하게 멈추게 합니다.

  3. 너무 자주 정지되는 위험.

  4. 트렌드가 뒤집어졌을 때 제때 멈출 수는 없습니다.

  5. 매개 변수를 최적화할 때 과다 조정 위험.

강화

  1. 최적의 조합을 위해 MACD 매개 변수를 테스트합니다.

  2. 다른 정지 방법을 시도해보세요.

  3. 주파수와 위험 통제를 균형 잡기 위해 정지를 최적화하십시오.

  4. 역전 중지 방지 트렌드 필터를 추가합니다.

  5. 과잉 거래를 피하기 위해 거래 비용의 영향을 고려하십시오.

  6. 스리프 또는 강화된 스톱을 사용해서 스톱이 발사되는 것을 보장합니다.

결론

이 전략은 적응 가능한 ATR 동적 스톱으로 MACD 신호를 거래합니다. 제어 가능한 위험과 단순성을 갖추고 있습니다. 그러나 MACD 신호는 거짓 될 수 있으며 스톱은 지속적인 최적화가 필요합니다. 전반적으로 매개 변수 조정, 스톱 최적화 등으로 강력한 트렌드 다음 시스템이 될 수 있습니다.


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

//@version=4
strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() =>  true

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

///////////////  Strategy  /////////////// 
long = crossover(delta, 0)
short = crossunder(delta, 0)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

더 많은