이중 MACD 반전 거래 전략

저자:차오장, 날짜: 2024-01-12 14:49:47
태그:

img

전반적인 설명

이중 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 지표를 결합하여 역전 기회를 정확하게 식별하고 전략의 안정성을 향상시키기 위해 일부 잘못된 역전 신호를 필터링합니다. 구체적인 장점은 다음과 같습니다.

  1. 6시간 MACD를 사용하여 주요 트렌드를 결정하고 더 넓은 시장에서 불확실성이 증가하는 환경에서 거래를 피하십시오.

  2. 1시간 MACD는 반전 시기를 파악하고 짧은 주기의 가격 조정 사항을 포착합니다.

  3. RVI 지표와 CCI 지표의 조합은 반전의 시기를 더 정확하게 결정할 수 있습니다.

  4. 이 전략은 손실을 줄이기 위해 스톱 로스를 포함합니다.

위험 분석

이 전략은 또한 다음과 같이 주로 반영되는 몇 가지 위험을 가지고 있습니다.

  1. MACD 자체는 잘못된 신호를 생성하는 경향이 있으므로 보조 지표가 좋은 필터링 효과를 가지고 있음에도 불구하고 손실을 완전히 피하는 것은 불가능합니다. 포지션 크기를 줄이는 것이 좋습니다.

  2. RVI 및 CCI 지표가 잘못된 신호를 발산하여 더 나은 반전 기회를 놓치고 불필요한 손실을 증가시킬 수 있습니다. RVI 및 CCI 매개 변수를 합리적으로 조정하는 것이 좋습니다.

  3. 잘못된 스톱 손실 설정은 너무 자주 스톱 손실을 유발하거나 너무 느슨하다면 손실을 시간적으로 제어하지 못할 수 있습니다. 시장 변동성에 따라 스톱 손실 크기를 조정하는 것이 좋습니다.

최적화 방향

이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.

  1. 현재 1시간과 6시간 두 시간 프레임을 사용하며, 더 안정적인 매개 변수를 찾기 위해 더 많은 시간 프레임 조합을 테스트 할 수 있습니다.

  2. 거래 지점을 판단하는 데 도움이되는 KDJ, WR, OBV 등 더 많은 지표가 도입 될 수 있습니다. 그러나 지나치게 복잡한 거래 신호를 생성하지 않도록 주의하십시오.

  3. 매개 변수는 다양한 품종에 대해 지속적으로 최적화 될 수 있으며 매개 변수 라이브러리를 설정 할 수 있습니다. 중고 저주파 거래에 적합한 품종에 대해 더 긴 사이클 매개 변수는 적절히 증가 할 수 있습니다.

  4. 동적 스톱 로스 메커니즘은 수익이 증가함에 따라 스톱 로스 포인트를 점차 이동하도록 설정할 수 있습니다. 또는 시장 변동성에 따라 실시간으로 스톱 로스 크기를 조정할 수 있습니다.

요약

이중 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)

더 많은