
Chiến lược giao dịch MACD hai chiều ngược là một chiến lược giao dịch định lượng sử dụng chỉ số MACD để nhận ra tín hiệu đảo ngược xu hướng. Chiến lược này kết hợp chỉ số RVI và chỉ số CCI để xác nhận thời gian mua để lọc ra một số đảo ngược giả. Chiến lược này có thể áp dụng cho 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 trung bình di chuyển nhanh hơn EMA ((12)) trừ đường trung bình di chuyển chậm hơn EMA ((26) để có được đường nhanh, sau đó sử dụng SIGNAL ((9) làm đường dài.
Chiến lược này sử dụng MACD hai chu kỳ thời gian để tìm 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ể, MACD 1 giờ trong ngày để tìm tín hiệu đảo ngược. Khi MACD 6 giờ đang trong xu hướng tăng, mức 1 giờ nếu có tín hiệu ngã chết đi qua đường dài dưới đường nhanh, cho thấy giá có thể đảo ngược lên.
Chỉ số RVI đo lường giá đóng cửa và giá mở cửa của một vài dòng K mới nhất với giá cao nhất và giá thấp nhất. Khi RVI thấp hơn 0,2 thì được coi là quá bán. Chỉ số CCI nhỏ hơn 100 là quá bán. Vì vậy, chiến lược sử dụng chỉ số RVI thấp hơn 0,2 và chỉ số CCI thấp hơn -95 để hỗ trợ tín hiệu mua xác nhận.
Chiến lược này kết hợp hai chu kỳ thời gian MACD và các chỉ số RVI và CCI, có thể xác định chính xác hơn các cơ hội đảo ngược, lọc ra một số tín hiệu đảo ngược giả, do đó cải thiện sự ổn định của chiến lược. Các ưu điểm cụ thể như sau:
Sử dụng MACD ở mức 6 giờ để đánh giá xu hướng lớn và tránh giao dịch trong môi trường bất ổn thị trường lớn.
MACD cấp 1 giờ nhận ra thời gian đảo ngược, có thể bắt được sự điều chỉnh giá trong một chu kỳ ngắn hơn.
Sử dụng kết hợp của chỉ số RVI và chỉ số CCI, có thể đánh giá chính xác hơn thời gian đảo ngược.
Chiến lược này có thể giúp giảm lỗ.
Chiến lược này cũng có một số rủi ro, đặc biệt là:
Chỉ số MACD tự nó dễ tạo ra tín hiệu sai, vì vậy ngay cả khi lọc chỉ số hỗ trợ có hiệu quả tốt, nó cũng không thể tránh hoàn toàn thua lỗ.
Chỉ số RVI và chỉ số CCI có thể phát tín hiệu sai, do đó bỏ lỡ cơ hội đảo ngược tốt hơn hoặc tăng tổn thất không cần thiết.
Cài đặt điểm dừng lỗ không đúng cách có thể gây ra dừng lỗ quá nhiều hoặc có thể quá thoải mái để không thể kiểm soát thua lỗ kịp thời.
Chiến lược này có thể được tiếp tục tối ưu hóa trong các khía cạnh sau:
Hiện tại sử dụng hai chu kỳ thời gian 1 giờ và 6 giờ, có thể thử nghiệm nhiều kết hợp chu kỳ thời gian hơn để tìm các tham số ổn định hơn.
Có thể giới thiệu thêm các chỉ số như KDJ, WR, OBV để hỗ trợ quyết định điểm mua và bán. Tuy nhiên, hãy tránh tạo ra tín hiệu giao dịch quá phức tạp.
Các tham số có thể được tối ưu hóa liên tục theo các tham số của các giống khác nhau, thiết lập một kho tham số. Các giống phù hợp với giao dịch tần số trung bình và thấp có thể tăng chu kỳ tham số một cách thích hợp.
Có thể thiết lập cơ chế dừng động, di chuyển điểm dừng dần dần sau khi kiếm được lợi nhuận. Hoặc điều chỉnh mức dừng theo thời gian thực theo mức độ biến động của thị trường.
Chiến lược giao dịch MACD cặp đảo ngược tích hợp các tín hiệu định hướng và đảo ngược, và được hỗ trợ bởi các tín hiệu lọc của chỉ số RVI và CCI. Chiến lược này có thể xác định hiệu quả điều chỉnh đường ngắn cung cấp tỷ lệ lợi nhuận rủi ro tốt hơn, phù hợp với giao dịch trong ngày và đường ngắn, hoặc có thể là một phần của một tập hợp nhiều chiến lược, cung cấp sự đa dạng của 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)