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