적응형 ATR 손절매 기반 MACD 거래 전략


생성 날짜: 2023-09-20 15:23:00 마지막으로 수정됨: 2023-09-20 15:23:00
복사: 1 클릭수: 867
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 MACD 지표를 사용하여 거래 신호를 생성하고 ATR 기반의 자율적 인 손실을 사용하여 위험을 제어합니다. 트렌드 추적 전략에 속합니다.

전략 원칙

  1. MACD 지표의 이차값 델트 오차선이 0축을 뚫고 구매 및 판매 신호를 발생한다.

  2. 최근 N주기의 ATR을 기반으로 동적 스톱로스를 계산한다. ATR은 시장의 변동률을 반영할 수 있다.

  3. 스톱피스는 변동률 변화에 따라 적응하고, 변동이 커지면 스톱피스는 느려진다.

  4. 신호를 보유할 때 실시간으로 스톱로스를 업데이트하여 수익을 잠금하고 위험을 제어한다.

  5. 스톱로즈가 터졌을 때 포지션에서 빠져나와 리스크 컨트롤을 완료한다.

우위 분석

  1. MACD 지표는 트렌드 추적에 민감하다.

  2. 동적 상쇄는 시장 환경에 적응하여 상쇄가 너무 근접하거나 너무 멀지 않게 방지할 수 있다.

  3. 시각화 된 스톱 로즈 라인, 직관적으로 위험 상황을 반영한다.

  4. 전략 규칙은 간단하고 명확하며, 이해하기 쉽다.

  5. 리스크 관리가 잘 되어 있고, 철수도 잘 되어 있습니다.

위험 분석

  1. MACD 지표는 가짜 신호를 만들어 불필요한 손실을 초래할 수 있다.

  2. ATR 파라미터가 잘못 설정되어 너무 근접하거나 너무 먼 문제를 막습니다.

  3. 너무 자주 발동되는 위험요소

  4. 트렌드 반전이 어렵고 시간 손실이다.

  5. 매개 변수를 최적화할 때 과도한 적합성의 위험이 있을 수 있다.

최적화 방향

  1. 다양한 매커니즘의 MACD 조합을 테스트하여 최적의 매커니즘을 찾습니다.

  2. 다른 손실을 방지하는 방법을 시도해 보세요.

  3. 스톱 손실 변수를 최적화하고 스톱 손실 주파수와 위험 관리를 균형 잡는다.

  4. 트렌드 판단 메커니즘을 추가하여 반전 중지 손실을 피하십시오.

  5. 거래 비용의 영향을 고려하여 과도한 거래를 방지하십시오.

  6. 슬라이드 포인트 또는 강화 스로퍼를 사용하여 스로퍼가 유효하도록 한다.

요약하다

이 전략은 MACD 지표 기반의 신호를 발신하고, 자기 적응 ATR 동적 중지한다. 위험 제어 가능, 간단한 실용적인 특징이 있다. 그러나 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)