이중 MACD 반전 거래 전략 (Dual MACD Reversal Trading Strategy) 은 트렌드 반전 신호를 식별하기 위해 MACD 지표를 사용하는 양적 거래 전략이다. 이 전략은 또한 구매 신호를 확인하고 일부 잘못된 반전을 필터링하기 위해 RVI 지표와 CCI 지표를 결합합니다. 이 전략은 내일 및 단기 거래에 적합합니다.
이 전략은 주로 MACD 지표에 기반합니다. MACD는 빠른 이동 평균 EMA ((12) 를 빼고 느린 이동 평균 EMA ((26) 를 사용하여 빠른 라인을 얻으며, SIGNAL ((9) 를 느린 라인으로 사용합니다. 빠른 라인이 느린 라인을 넘어서 골든 크로스를 생성하면 상승세를 나타냅니다. 빠른 라인이 느린 라인을 넘어서 죽은 크로스를 생성하면 하락세를 나타냅니다.
이 전략은 반전 기회를 식별하기 위해 듀얼 타임 프레임 MACD 지표를 사용합니다. 전략은 전반적인 트렌드 방향을 결정하기 위해 6 시간 MACD와 반전 신호를 찾기 위해 1 시간 MACD를 사용합니다. 6 시간 MACD가 상승 추세에있을 때, 1 시간 빠른 라인이 느린 라인을 넘어서 사망 십자 신호를 생성하면 가격이 상향으로 반전 될 수 있음을 나타냅니다. 이 시점에서 RVI 지표와 CCI 지표를 결합하여 구매 신호를 추가로 확인하고 생성합니다.
RVI 지표는 가장 최근 몇 개의 촛불의 폐쇄 가격과 오픈 가격 사이의 관계를 가장 높은 가격과 가장 낮은 가격에 비해 측정합니다. 0.2 이하의 RVI는 과판으로 간주됩니다. -100 이하의 CCI 지표는 과판을 나타냅니다. 따라서 전략은 구매 신호를 확인하는 데 도움이되는 0.2 이하의 RVI 지표와 -95 이하의 CCI 지표를 사용합니다.
이 전략은 이중 시간 프레임 MACD와 RVI 및 CCI 지표를 결합하여 역전 기회를 정확하게 식별하고 전략의 안정성을 향상시키기 위해 일부 잘못된 역전 신호를 필터링합니다. 구체적인 장점은 다음과 같습니다.
6시간 MACD를 사용하여 주요 트렌드를 결정하고 더 넓은 시장에서 불확실성이 증가하는 환경에서 거래를 피하십시오.
1시간 MACD는 반전 시기를 파악하고 짧은 주기의 가격 조정 사항을 포착합니다.
RVI 지표와 CCI 지표의 조합은 반전의 시기를 더 정확하게 결정할 수 있습니다.
이 전략은 손실을 줄이기 위해 스톱 로스를 포함합니다.
이 전략은 또한 다음과 같이 주로 반영되는 몇 가지 위험을 가지고 있습니다.
MACD 자체는 잘못된 신호를 생성하는 경향이 있으므로 보조 지표가 좋은 필터링 효과를 가지고 있음에도 불구하고 손실을 완전히 피하는 것은 불가능합니다. 포지션 크기를 줄이는 것이 좋습니다.
RVI 및 CCI 지표가 잘못된 신호를 발산하여 더 나은 반전 기회를 놓치고 불필요한 손실을 증가시킬 수 있습니다. RVI 및 CCI 매개 변수를 합리적으로 조정하는 것이 좋습니다.
잘못된 스톱 손실 설정은 너무 자주 스톱 손실을 유발하거나 너무 느슨하다면 손실을 시간적으로 제어하지 못할 수 있습니다. 시장 변동성에 따라 스톱 손실 크기를 조정하는 것이 좋습니다.
이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.
현재 1시간과 6시간 두 시간 프레임을 사용하며, 더 안정적인 매개 변수를 찾기 위해 더 많은 시간 프레임 조합을 테스트 할 수 있습니다.
거래 지점을 판단하는 데 도움이되는 KDJ, WR, OBV 등 더 많은 지표가 도입 될 수 있습니다. 그러나 지나치게 복잡한 거래 신호를 생성하지 않도록 주의하십시오.
매개 변수는 다양한 품종에 대해 지속적으로 최적화 될 수 있으며 매개 변수 라이브러리를 설정 할 수 있습니다. 중고 저주파 거래에 적합한 품종에 대해 더 긴 사이클 매개 변수는 적절히 증가 할 수 있습니다.
동적 스톱 로스 메커니즘은 수익이 증가함에 따라 스톱 로스 포인트를 점차 이동하도록 설정할 수 있습니다. 또는 시장 변동성에 따라 실시간으로 스톱 로스 크기를 조정할 수 있습니다.
이중 MACD 반전 거래 전략은 트렌드 판단과 반전 신호를 포괄적으로 고려하고, 신호를 필터링하기 위해 RVI 및 CCI 지표에 의해 지원됩니다. 이 전략은 좋은 위험-이익 비율로 단기 조정을 효과적으로 식별 할 수 있으며, 내일 및 단기 거래에 적합하며, 또한 전반적인 전략 다양성을 제공하기 위해 멀티 전략 포트폴리오의 일부로 사용될 수 있습니다.
/*backtest start: 2023-01-05 00:00:00 end: 2024-01-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Bat MACD", overlay=true) fastLength = input(12) slowlength = input(26) MACDLength = input(9) h=1.05 MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD hmacd= aMACD>0? h*aMACD: -(1/h)*abs(MACD) MACDD= (request.security(syminfo.tickerid,'360',ema(close, fastLength)) - request.security(syminfo.tickerid,'360',ema(close,slowlength))) aMACDD = (request.security(syminfo.tickerid,'360',ema(ema(request.security(syminfo.tickerid,'360',close), fastLength)-ema(request.security(syminfo.tickerid,'360',close),slowlength), MACDLength))) deltad= MACDD-aMACDD L= input(0.95, title="SL") SL = L*ema(close,10) //MACD slow = input(26,"Short period") fast = input(12, "Long period") signal = input(9, "Smoothing period") //MACD = ema(close,fast)-ema(close,slow) dMACD= MACD<0? ema(MACD,5):0 Mcond= rising(dMACD,1) mcount=0.0 mcount := Mcond ? nz(mcount[1]) + 1 : nz(mcount[1]) counter=0 counter := (mcount-mcount[1]==0) ? nz(counter[1]) + 1 : 0 //counter := counter==3 ? 0: nz(counter[1]) pp=0.0 mc=0.0 pp:= (counter-counter[1]<0)? close[1] : nz(pp[1]) mc:= (counter-counter[1]<0)? MACD[1] : nz(mc[1]) bull = (pp-pp[1]<-close*0.005 and mc-mc[1]>0.02*abs(MACD) and MACD<0 and MACD[1]<0)? 1:0 //bgcolor(bull?green:white) //RVI p=10 CO=close-open HL=high-low value1 = (CO + 2*CO[1] + 2*CO[2] + CO[3])/6 value2 = (HL + 2*HL[1] + 2*HL[2] + HL[3])/6 num=sum(value1,p) denom=sum(value2,p) rvi=denom!=0?num/denom:0 //RVI drvi= (rvi<0.2)? ema(rvi-0.20,3):0 RVcond= rising(drvi,1) rvcount=0.0 rvcount := RVcond ? nz(rvcount[1]) + 1 : nz(rvcount[1]) rvcounter=0 rvcounter := (rvcount-rvcount[1]==0) ? nz(rvcounter[1]) + 1 : 0 //counter := counter==3 ? 0: nz(counter[1]) rvpp=0.0 rvmc=0.0 rvpp:= (rvcounter-rvcounter[1]<0)? close[1] : nz(rvpp[1]) rvmc:= (rvcounter-rvcounter[1]<0)? drvi[1] : nz(rvmc[1]) rvbull = (rvpp-rvpp[1]<-close*0.005 and rvmc-rvmc[1]>0.02 and drvi<0 and drvi[1]<0)? 1:0 //VolCCI length1 = input(10, minval=1) xMAVolPrice = ema(volume * close, length1) xMAVol = ema(volume, length1) src1 = xMAVolPrice / xMAVol map = sma(src1, length1) cci = (src1 - map) / (0.015 * dev(src1, length1)) cfi= (cci<0)? ema(cci,3) :0 CCcond= rising(cfi,1) cccount=0.0 cccount := CCcond ? nz(cccount[1]) + 1 : nz(cccount[1]) cccounter=0 cccounter := (cccount-cccount[1]==0) ? nz(cccounter[1]) + 1 : 0 //counter := counter==3 ? 0: nz(counter[1]) ccpp=0.0 ccmc=0.0 ccpp:= (cccounter-cccounter[1]<0)? close[1] : nz(ccpp[1]) ccmc:= (cccounter-cccounter[1]<0)? cci[1] : nz(ccmc[1]) ccbull = (ccpp-ccpp[1]<-close*0.003 and ccmc-ccmc[1]>20 and cci<-95 and cci[1]<-95)? 1:0 A= bull+ccbull+rvbull if ((MACD>hmacd) and deltad>0 and delta>delta[1]) strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close) if (crossunder(delta, 0) or crossunder(close,SL)) strategy.close("Long") if(crossover(low,SL) and SL-SL[1]<close*0.005 and SL-SL[1]>-close*0.005) strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close) if A strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close) plot(SL) //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)