Chiến lược này là một phiên bản cải tiến của chỉ số MACD cổ điển, sử dụng 11 loại trung bình động khác nhau để làm mịn đường cong giá và giảm các tín hiệu gây hiểu nhầm. Chỉ số bao gồm đường nhanh, đường chậm và biểu đồ.
Tính toán đường trung bình động nhanh MA12. 11 phương pháp tính toán khác nhau cho đường trung bình động có sẵn để lựa chọn, với đường VAR Tỷ lệ biến đổi khối lượng theo mặc định.
Tính toán đường trung bình động chậm MA26. 11 phương pháp tính toán khác nhau cho các đường trung bình động có sẵn để lựa chọn, với đường VAR Tỷ lệ biến đổi khối lượng theo mặc định.
Tính toán sự khác biệt giữa đường nhanh và đường chậm SRC2 = MA12 - MA26.
Tính toán đường kích hoạt MATR cho SRC2 bằng cách sử dụng đường trung bình động có chiều dài 9. Có 11 phương pháp tính toán khác nhau có sẵn để lựa chọn, với đường VAR Tỷ lệ biến đổi khối lượng theo mặc định.
Tính toán biểu đồ MACD HIST = SRC2 - MATR. Các tín hiệu mua được tạo ra khi biểu đồ thay đổi từ âm sang dương. Các tín hiệu bán được tạo ra khi biểu đồ thay đổi từ dương sang âm.
11 loại đường trung bình động khác nhau có thể được chọn để tính toán đường nhanh, đường chậm và đường kích hoạt, làm giảm đáng kể sự chậm trễ của các đường trung bình động phổ biến và cải thiện độ chính xác của các tín hiệu dự đoán.
Dòng tỷ lệ biến đổi khối lượng VAR có thể tự động điều chỉnh trọng lượng của đường trung bình động để thích nghi tốt hơn với những thay đổi của thị trường.
Các đường trung bình động đôi với vùng đệm có thể lọc hiệu quả tiếng ồn thị trường.
Biểu đồ MACD như là tín hiệu kích hoạt có thể khắc phục vấn đề trì hoãn do sự vượt qua truyền thống của các đường MACD nhanh và chậm.
Chỉ số MACD có khả năng yếu trong việc đánh giá xu hướng hoặc hợp nhất thị trường.
Đường trung bình động có một mức độ chậm nhất định. VAR làm giảm một phần nhưng không thể giải quyết hoàn toàn vấn đề.
Sự tích lũy lỗi có thể dẫn đến tín hiệu sai hoặc thiếu tín hiệu hiệu quả.
Chọn phương pháp tính toán trung bình động phù hợp cho các điều kiện thị trường cụ thể dựa trên kết quả backtest.
Tối ưu hóa các thông số chiều dài của đường nhanh, đường chậm và đường kích hoạt để tìm kết hợp thông số tốt nhất để giảm tín hiệu sai.
Thêm các chỉ số phụ như RSI và Bollinger Bands để xác nhận tín hiệu mua / bán.
Chiến lược này là một phiên bản tối ưu hóa cho chỉ số MACD cổ điển. Bằng cách sử dụng nhiều mô hình trung bình động để tính toán đường nhanh, đường chậm và biểu đồ MACD, nó làm tăng đáng kể tính hữu ích của chỉ số này. Trong khi đó, nó cũng có một số hạn chế nhất định. Nâng cao tối ưu hóa liên tục theo điều kiện thị trường thực tế là cần thiết để tối đa hóa hiệu quả trong giao dịch.
/*backtest start: 2023-11-12 00:00:00 end: 2023-12-12 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KivancOzbilgic //developer: Gerald Appel //author: @kivancozbilgic strategy("MACD ReLoaded","MACDRe", overlay=true) src = input(close, title="Source") length=input(12, "Short Moving Average Length", minval=1) length1=input(26, "Long Moving Average Length", minval=1) length2=input(9, "Trigger Length", minval=1) T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"]) Var_Func(src,length)=> valpha=2/(length+1) vud1=src>src[1] ? src-src[1] : 0 vdd1=src<src[1] ? src[1]-src : 0 vUD=sum(vud1,9) vDD=sum(vdd1,9) vCMO=nz((vUD-vDD)/(vUD+vDD)) VAR=0.0 VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1]) VAR=Var_Func(src,length) DEMA = ( 2 * ema(src,length)) - (ema(ema(src,length),length) ) Wwma_Func(src,length)=> wwalpha = 1/ length WWMA = 0.0 WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1]) WWMA=Wwma_Func(src,length) Zlema_Func(src,length)=> zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2 zxEMAData = (src + (src - src[zxLag])) ZLEMA = ema(zxEMAData, length) ZLEMA=Zlema_Func(src,length) Tsf_Func(src,length)=> lrc = linreg(src, length, 0) lrc1 = linreg(src,length,1) lrs = (lrc-lrc1) TSF = linreg(src, length, 0)+lrs TSF=Tsf_Func(src,length) HMA = wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) T3e1=ema(src, length) T3e2=ema(T3e1,length) T3e3=ema(T3e2,length) T3e4=ema(T3e3,length) T3e5=ema(T3e4,length) T3e6=ema(T3e5,length) T3c1=-T3a1*T3a1*T3a1 T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1 T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1 T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1 T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3 getMA(src, length) => ma = 0.0 if mav == "SMA" ma := sma(src, length) ma if mav == "EMA" ma := ema(src, length) ma if mav == "WMA" ma := wma(src, length) ma if mav == "DEMA" ma := DEMA ma if mav == "TMA" ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1) ma if mav == "VAR" ma := VAR ma if mav == "WWMA" ma := WWMA ma if mav == "ZLEMA" ma := ZLEMA ma if mav == "TSF" ma := TSF ma if mav == "HULL" ma := HMA ma if mav == "TILL" ma := T3 ma ma MA12=getMA(src, length) Var_Func1(src,length1)=> valpha1=2/(length1+1) vud11=src>src[1] ? src-src[1] : 0 vdd11=src<src[1] ? src[1]-src : 0 vUD1=sum(vud11,9) vDD1=sum(vdd11,9) vCMO1=nz((vUD1-vDD1)/(vUD1+vDD1)) VAR1=0.0 VAR1:=nz(valpha1*abs(vCMO1)*src)+(1-valpha1*abs(vCMO1))*nz(VAR1[1]) VAR1=Var_Func1(src,length1) DEMA1 = ( 2 * ema(src,length1)) - (ema(ema(src,length1),length1) ) Wwma_Func1(src,length1)=> wwalpha1 = 1/ length1 WWMA1 = 0.0 WWMA1 := wwalpha1*src + (1-wwalpha1)*nz(WWMA1[1]) WWMA1=Wwma_Func1(src,length1) Zlema_Func1(src,length1)=> zxLag1 = length1/2==round(length1/2) ? length1/2 : (length1 - 1) / 2 zxEMAData1 = (src + (src - src[zxLag1])) ZLEMA1 = ema(zxEMAData1, length1) ZLEMA1=Zlema_Func1(src,length1) Tsf_Func1(src,length1)=> lrc1 = linreg(src, length1, 0) lrc11 = linreg(src,length1,1) lrs1 = (lrc1-lrc11) TSF1 = linreg(src, length1, 0)+lrs1 TSF1=Tsf_Func1(src,length1) HMA1 = wma(2 * wma(src, length1 / 2) - wma(src, length1), round(sqrt(length1))) T3e11=ema(src, length1) T3e21=ema(T3e11,length1) T3e31=ema(T3e21,length1) T3e41=ema(T3e31,length1) T3e51=ema(T3e41,length1) T3e61=ema(T3e51,length1) T3c11=-T3a1*T3a1*T3a1 T3c21=3*T3a1*T3a1+3*T3a1*T3a1*T3a1 T3c31=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1 T3c41=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1 T31=T3c11*T3e61+T3c21*T3e51+T3c31*T3e41+T3c41*T3e31 getMA1(src, length1) => ma1 = 0.0 if mav == "SMA" ma1 := sma(src, length1) ma1 if mav == "EMA" ma1 := ema(src, length1) ma1 if mav == "WMA" ma1 := wma(src, length1) ma1 if mav == "DEMA" ma1 := DEMA1 ma1 if mav == "TMA" ma1 := sma(sma(src, ceil(length1 / 2)), floor(length1 / 2) + 1) ma1 if mav == "VAR" ma1 := VAR1 ma1 if mav == "WWMA" ma1:= WWMA1 ma1 if mav == "ZLEMA" ma1 := ZLEMA1 ma1 if mav == "TSF" ma1 := TSF1 ma1 if mav == "HULL" ma1 := HMA1 ma1 if mav == "TILL" ma1 := T31 ma1 ma1 MA26=getMA1(src, length1) src2=MA12-MA26 Var_Func2(src2,length2)=> valpha2=2/(length2+1) vud12=src2>src2[1] ? src2-src2[1] : 0 vdd12=src2<src2[1] ? src2[1]-src2 : 0 vUD2=sum(vud12,9) vDD2=sum(vdd12,9) vCMO2=nz((vUD2-vDD2)/(vUD2+vDD2)) VAR2=0.0 VAR2:=nz(valpha2*abs(vCMO2)*src2)+(1-valpha2*abs(vCMO2))*nz(VAR2[1]) VAR2=Var_Func2(src2,length2) DEMA2 = ( 2 * ema(src2,length2)) - (ema(ema(src2,length2),length2) ) Wwma_Func2(src2,length2)=> wwalpha2 = 1/ length2 WWMA2 = 0.0 WWMA2 := wwalpha2*src2 + (1-wwalpha2)*nz(WWMA2[1]) WWMA2=Wwma_Func2(src2,length2) Zlema_Func2(src2,length2)=> zxLag2 = length2/2==round(length2/2) ? length2/2 : (length2 - 1) / 2 zxEMAData2 = (src2 + (src2 - src2[zxLag2])) ZLEMA2 = ema(zxEMAData2, length2) ZLEMA2=Zlema_Func2(src2,length2) Tsf_Func2(src2,length2)=> lrc2 = linreg(src2, length2, 0) lrc12 = linreg(src2,length2,1) lrs2 = (lrc2-lrc12) TSF2 = linreg(src2, length2, 0)+lrs2 TSF2=Tsf_Func2(src2,length2) HMA2 = wma(2 * wma(src2, length2 / 2) - wma(src2, length2), round(sqrt(length2))) T3e12=ema(src2, length2) T3e22=ema(T3e12,length2) T3e32=ema(T3e22,length2) T3e42=ema(T3e32,length2) T3e52=ema(T3e42,length2) T3e62=ema(T3e52,length2) T3c12=-T3a1*T3a1*T3a1 T3c22=3*T3a1*T3a1+3*T3a1*T3a1*T3a1 T3c32=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1 T3c42=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1 T32=T3c12*T3e62+T3c22*T3e52+T3c32*T3e42+T3c42*T3e32 getMA2(src2, length2) => ma2 = 0.0 if mav == "SMA" ma2 := sma(src2, length2) ma2 if mav == "EMA" ma2 := ema(src2, length2) ma2 if mav == "WMA" ma2 := wma(src2, length2) ma2 if mav == "DEMA" ma2 := DEMA2 ma2 if mav == "TMA" ma2 := sma(sma(src2, ceil(length2 / 2)), floor(length2 / 2) + 1) ma2 if mav == "VAR" ma2 := VAR2 ma2 if mav == "WWMA" ma2 := WWMA2 ma2 if mav == "ZLEMA" ma2 := ZLEMA2 ma2 if mav == "TSF" ma2 := TSF2 ma2 if mav == "HULL" ma2 := HMA2 ma2 if mav == "TILL" ma2 := T32 ma2 ma2 MATR=getMA2(MA12-MA26, length2) hist = src2 - MATR FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false buySignal = crossover(hist, 0) if (crossover(hist, 0)) strategy.entry("MacdLong", strategy.long, comment="MacdLong") sellSignal = crossunder(hist, 0) if (crossunder(hist, 0)) strategy.entry("MacdShort", strategy.short, comment="MacdShort") buy1= barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)