MACD 이동평균 조합 기간 간 동적 트렌드 전략

저자:차오장, 날짜: 2024-02-19 10:48:11
태그:

img

전반적인 설명

이 전략은 MACD 지표의 이동 평균의 조합을 기반으로 한 것으로, 기간에 걸쳐 동적 트렌드 판단을 실현한다. 이것은 더 고전적인 트렌드 추적 전략에 속한다. 주로 MACD의 빠르고 느린 이동 평균의 차이와 신호선 사이의 관계를 통해 현재 트렌드 방향과 강도를 판단한다. 동시에 정확성을 향상시키고 역동적으로 위치를 조정하기 위해 기간 간 판단이 도입된다.

전략 원칙

  1. 현재 트렌드 방향은 MACD 지표의 빠른 이동 평균과 느린 이동 평균의 차이와 신호 라인 관계에 따라 판단합니다.
  2. MACD 차이는 신호선을 넘어서면 긴 신호이고 아래를 넘어가면 짧은 신호입니다.
  3. MACD 차이와 MACD 히스토그램을 같은 방향으로 도입하여 전략 신호를 강화합니다.
  4. 크로스 사이클 판단 모듈을 추가하고 더 높은 시간 프레임의 MACD 지표를 신호 필터 및 위치 조정 기본으로 사용합니다.
  5. 동적 위치 조정, 크기를 줄여서 위치 신호가 약해지고 신호가 강화되면 위치를 증가합니다.

이점 분석

  1. 트렌드 방향을 결정하는 데 MACD 자체의 효과는 상대적으로 높습니다.
  2. MACD 차이와 히스토그램 이중 검증의 조합은 신호 정확성을 향상시킬 수 있습니다.
  3. 크로스 사이클 판단은 전략의 안정성을 높이고 고주파 신호에 의해 오해되는 것을 피합니다.
  4. 역동적인 위치 조정은 전략이 기회를 더 잘 파악하고 과잉 수익을 높일 수 있도록 합니다.

위험 분석 및 해결책

  1. MACD 신호는 지연을 가지고 있으며 이는 약간 열등한 신호 효과를 초래할 수 있습니다.
  • 솔루션: 신호를 사전에 캡처하기 위해 빠른 평균과 느린 이동 평균의 차이를 증가시킵니다.
  1. 크로스 사이클 신호는 반드시 정확하지 않으며 전략을 오해 할 수 있습니다.
  • 솔루션: 주주기 전략이 지배적임을 보장하기 위해 동적 위치 조정 메커니즘을 도입하십시오.
  1. 여러 요소가 결합된 전략의 전체적인 안정성은 충분하지 않을 수 있습니다.
  • 솔루션: 전체 견고성을 보장하기 위해 각 전략 매개 변수 무게의 비율을 신중하게 조정하십시오.

최적화 방향

  1. 서로 다른 사이클 파라미터 조합의 효과를 테스트합니다.
  2. 다양한 크로스 사이클 조합이 전략의 효과에 미치는 영향을 테스트합니다.
  3. MACD 지표 매개 변수, 예를 들어 빠르고 느린 이동 평균 주기, 신호 라인 주기 등을 조정합니다.
  4. 서로 다른 위치 조정 요인의 효과를 테스트합니다.
  5. 다른 품종에 백테스트 효과를 테스트합니다.

요약

이 MACD 이동 평균 조합 크로스 페리오드 동적 트렌드 전략은 고전적 지표와 멀티 타임 프레임 참조의 장점을 통합합니다. 매개 변수 최적화 및 조합 테스트를 통해 비교적 안정적이고 수익성있는 트렌드 추적 전략을 구축 할 수 있습니다. 실제 돈 테스트 및 응용 가치가 있습니다.


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

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



더 많은