Chiến lược giao dịch đảo ngược MACD kép là một chiến lược giao dịch định lượng sử dụng chỉ số MACD để xác định tín hiệu đảo ngược xu hướng. Chiến lược này cũng kết hợp chỉ số RVI và chỉ số CCI để xác nhận tín hiệu mua và lọc ra một số đảo ngược sai. Chiến lược này phù hợp với giao dịch trong ngày và ngắn hạn.
Chiến lược này chủ yếu dựa trên chỉ số MACD. MACD là đường EMA di chuyển nhanh (Fast Moving Average EMA) (12) trừ đi đường EMA di chuyển chậm (Slow Moving Average EMA) (26) để có được đường nhanh, và sau đó sử dụng SIGNAL (SIGNAL)) (9) như đường chậm. Khi đường nhanh vượt qua đường chậm để tạo ra Golden Cross, nó tăng; Khi đường nhanh vượt qua đường chậm để tạo ra Dead Cross, nó giảm.
Chiến lược này sử dụng các chỉ số MACD khung thời gian kép để xác định cơ hội đảo ngược. Chiến lược sử dụng MACD 6 giờ để xác định hướng xu hướng tổng thể và MACD 1 giờ để tìm tín hiệu đảo ngược. Khi MACD 6 giờ đang trong xu hướng tăng, nếu đường nhanh 1 giờ vượt qua dưới đường chậm để tạo ra tín hiệu chéo chết, nó cho thấy giá có thể đảo ngược lên. Tại thời điểm này, kết hợp chỉ số RVI và chỉ số CCI để xác nhận thêm và tạo ra tín hiệu mua.
Chỉ số RVI đo mối quan hệ giữa giá đóng cửa và giá mở cửa của một vài ngọn nến gần đây nhất so với giá cao nhất và thấp nhất. Chỉ số RVI dưới 0,2 được coi là bán quá mức. Chỉ số CCI dưới -100 chỉ ra bán quá mức. Vì vậy, chiến lược sử dụng chỉ số RVI dưới 0,2 và chỉ số CCI dưới -95 để giúp xác nhận tín hiệu mua.
Chiến lược này kết hợp hai khung thời gian MACD và chỉ số RVI và CCI để xác định chính xác cơ hội đảo ngược và lọc ra một số tín hiệu đảo ngược sai để cải thiện tính ổn định của chiến lược.
Sử dụng MACD 6 giờ để xác định xu hướng chính và tránh giao dịch trong môi trường có sự không chắc chắn gia tăng trên thị trường rộng lớn hơn.
MACD 1 giờ xác định thời gian đảo ngược và ghi lại các điều chỉnh giá chu kỳ ngắn hơn.
Sự kết hợp của chỉ số RVI và chỉ số CCI có thể xác định chính xác hơn thời gian đảo ngược.
Chiến lược này bao gồm lệnh dừng lỗ để giảm lỗ.
Chiến lược cũng có một số rủi ro, chủ yếu được phản ánh trong:
Bản thân MACD có xu hướng tạo ra các tín hiệu sai, vì vậy mặc dù các chỉ số phụ có hiệu ứng lọc tốt, nhưng không thể tránh hoàn toàn thua lỗ.
Các chỉ số RVI và CCI có thể phát ra tín hiệu không chính xác, do đó bỏ lỡ cơ hội đảo ngược tốt hơn hoặc làm tăng tổn thất không cần thiết.
Cài đặt stop loss không chính xác có thể kích hoạt stop loss quá thường xuyên hoặc không kiểm soát được các lỗ trong thời gian nếu quá lỏng lẻo.
Chiến lược có thể được tối ưu hóa thêm từ các khía cạnh sau:
Hiện nay sử dụng hai khung thời gian 1 giờ và 6 giờ, nhiều kết hợp khung thời gian hơn có thể được thử nghiệm để tìm các thông số ổn định hơn.
Có thể giới thiệu thêm các chỉ số, chẳng hạn như KDJ, WR, OBV, vv để hỗ trợ đánh giá các điểm giao dịch.
Các tham số có thể được tối ưu hóa liên tục cho các giống khác nhau và các thư viện tham số có thể được thiết lập. Đối với các giống phù hợp với giao dịch tần số trung bình và thấp, các tham số chu kỳ dài hơn có thể được tăng phù hợp.
Một cơ chế dừng lỗ động có thể được thiết lập để dần dần di chuyển điểm dừng lỗ khi lợi nhuận tăng hoặc điều chỉnh quy mô dừng lỗ trong thời gian thực theo biến động thị trường.
Chiến lược giao dịch đảo ngược MACD kép xem xét toàn diện phán đoán xu hướng và tín hiệu đảo ngược, và được hỗ trợ bởi các chỉ số RVI và CCI để lọc tín hiệu. Chiến lược này có thể xác định hiệu quả các điều chỉnh ngắn hạn với tỷ lệ rủi ro-lợi nhuận tốt, phù hợp với giao dịch trong ngày và ngắn hạn, và cũng có thể được sử dụng như một phần của danh mục đầu tư đa chiến lược để cung cấp sự đa dạng chiến lược tổng thể.
/*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)