
반전 쌍 MACD 거래 전략은 MACD 지표를 사용하여 트렌드 반전 신호를 식별하는 양적 거래 전략이다. 이 전략은 RVI 지표와 CCI 지표를 결합하여 구매 시기를 확인하고 일부 가짜 반전을 필터링한다. 이 전략은 일내 및 단선 거래에 적합하다.
전략은 주로 MACD 지표에 기초한다. MACD는 빠른 이동 평균 EMA ((12) 를 빼고 느린 이동 평균 EMA ((26) 를 얻으며, SIGNAL ((9) 을 느린 라인으로 사용한다. 빠른 라인 상에서 느린 라인을 통과하면 골든 크로스를 생성하고, 빠른 라인 아래에서 느린 라인을 통과하면 데드 크로스를 생성하면 하락한다.
이 전략은 양 시간 주기 MACD 지표를 사용하여 역전 기회를 찾습니다. 전략은 6 시간 수준의 MACD를 사용하여 전반적인 트렌드 방향을 판단하고, 하루 중 1 시간 수준의 MACD는 역전 신호를 찾습니다. 6 시간 MACD가 상승 추세에있을 때, 1 시간 수준은 빠른 선 아래에서 긴 선을 통과하는 데 필요한 사각지대가 발생하면 가격이 상승으로 전환 될 수 있음을 나타냅니다.
RVI 지표는 최신 몇 개의 K 선의 폐쇄 가격과 개방 가격과 최고 가격과 최저 가격과의 관계를 측정한다. RVI가 0.2보다 낮으면 과매매로 간주된다. CCI 지표가 100보다 작으면 과매매를 의미한다. 따라서 전략은 RVI 지표가 0.2보다 낮고 CCI 지표가 95보다 낮으면 두 가지 조건을 사용하여 구매를 확인하는 신호를 보조한다.
이 전략은 이중 시간 주기 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)