
Chiến lược này sử dụng độ lệch của đường trung bình di chuyển ((MA) và độ lệch của chỉ số động lực để đưa ra quyết định giao dịch. Nó so sánh độ lệch MA và độ lệch động lực với ngưỡng thiết lập, tạo ra tín hiệu giao dịch khi cả hai độ lệch vượt quá ngưỡng.
Trọng tâm của chiến lược này là so sánh hai đường cong độ dốc. Đầu tiên, nó sẽ tính toán độ dốc của MA và chỉ số động lực. Độ dốc phản ánh tốc độ và hướng thay đổi của đường cong.
Ví dụ, một tín hiệu mua được tạo ra khi cả đường MA và đường động lực đều vượt quá đường lên; một tín hiệu bán được tạo ra khi cả hai đường cong đều rơi xuống đường. Điều này có thể lọc ra một số tín hiệu giả.
Bộ lọc biến động thấp sử dụng một MA dài để đánh giá sự biến động của thị trường. Khi biến động thấp, MA sử dụng các tham số khác nhau để tạo ra tín hiệu giao dịch để thích ứng với các tình trạng thị trường khác nhau.
Chiến lược này có một số ưu điểm:
Sử dụng bộ lọc kép để thiết lập tín hiệu giao dịch, bạn có thể lọc một phần tiếng ồn và cải thiện chất lượng tín hiệu.
Bộ lọc biến động thấp cho phép các chiến lược có thể thích ứng với các tình trạng thị trường khác nhau và có tính linh hoạt.
Cho phép tùy chỉnh cao các tham số khác nhau, có thể được tối ưu hóa cho các giống khác nhau.
Có tính năng không sơn, có thể làm giảm ảnh hưởng của đường cong phù hợp với kết quả.
Chiến lược này cũng có một số rủi ro:
Bộ lọc kép có thể lọc ra một số tín hiệu thực, dẫn đến cơ hội bị bỏ lỡ. Nó có thể được tối ưu hóa bằng cách điều chỉnh tham số.
Bộ lọc sóng thấp xác định ngưỡng cần được kiểm tra cẩn thận. Nếu tham số không đúng, tín hiệu có thể bị lệch.
Các thiết lập tham số MA và chỉ số động lực cần được tối ưu hóa cho các giống cụ thể, và các tham số chung trên toàn thị trường khó xác định.
Chức năng không sơn không thể hoàn toàn tránh được vấn đề phù hợp với đường cong phản hồi, hiệu quả đĩa cứng vẫn cần được xác minh.
Các tham số tùy chỉnh cao sẽ làm cho các tham số không gian phức tạp, tối ưu hóa khó khăn hơn.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Kiểm tra nhiều loại MA khác nhau và kết hợp các chỉ số động lực để tìm ra chỉ số phù hợp nhất.
Tối ưu hóa các tham số chiều dài của MA và chỉ số động lượng, cân bằng độ trễ và tiếng ồn.
Tối ưu hóa các tham số trong tính toán độ dốc, tìm một sự kết hợp của các chỉ số ổn định hơn.
Thử nghiệm các chỉ số và tham số khác nhau về biến động thấp, tăng tính linh hoạt.
Thử nghiệm trên các giống và chu kỳ khác nhau để tìm ra phạm vi ứng dụng tốt nhất.
Xây dựng cơ chế tự điều chỉnh tham số, giảm công việc tối ưu hóa thủ công.
Chiến lược này nói chung là một chiến lược MA kép rất linh hoạt và có thể tùy chỉnh. Nó tham khảo thông tin về giá cả và động lực để đưa ra quyết định và có thể lọc hiệu quả các tín hiệu giả. Bộ lọc dao động thấp cũng làm cho chiến lược linh hoạt hơn và có thể thích ứng với sự thay đổi của thị trường.
Bằng cách tối ưu hóa các tham số và cải thiện lựa chọn chỉ số, chiến lược này có thể trở thành một lựa chọn đáng xem xét để áp dụng trong thị trường thực. Nó cung cấp một mẫu tham chiếu cho các quyết định giao dịch sử dụng MA và chỉ số động lực.
/*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"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Allenlk
//@version=4
strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
//Inputs
matype = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average")
masrc = input(close, title="MA Source", group="Moving Average")
malen = input(5, title="Moving Average Length - LookBack Period", group="Moving Average")
factorT3 = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average")
maderiv = input(3, title="MA Slope Lookback", minval=1, group="Moving Average")
masmooth = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average")
momtype = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average")
momsrc = input(close, title="Momentum Source", group="Momentum Moving Average")
momlen = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average")
momderiv = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average")
momsmooth = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average")
higherTf = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution")
higherTfmult = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution")
buffup = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
bufflow = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
lowVolMALength = input(28, title="Big MA Length", minval=1, group="Low Volatility Function")
MAlength = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function")
MAThresh = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function")
Volminimum = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function")
//Low Volatility Function
//When Volatility is low refer to the slope of a long moving average
low_vol_MA = sma(close, lowVolMALength)
low_vol_down = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh
low_vol_up = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1
percent_volatility = (1 - (low / high)) * 100
chng_MA = sma(percent_volatility, MAlength)
bad_vol = chng_MA < Volminimum
//No repaint function
nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])
//hull ma definition
hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen)))
//TEMA definition
ema1 = ema(masrc, malen)
ema2 = ema(ema1, malen)
ema3 = ema(ema2, malen)
tema = 3 * (ema1 - ema2) + ema3
//Tilson T3
factor = factorT3 *.10
gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor
t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor)
tilT3 = t3(masrc, malen, factor)
//MA Type
avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3
//MA Slope Percentage
DeltaAvg = (avg / avg[maderiv]) - 1
SmoothedAvg = sma(DeltaAvg, masmooth)
MAout = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult
//Momentum indicators
Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na
//Momentum Slope Percentage
Deltamom = (Momentum / Momentum[momderiv]) - 1
SmoothedMom = sma(Deltamom, momsmooth)
Momout = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom)
//Plottings
plot(buffup, color=color.green, title="Buy line")
plot(bufflow, color=color.red, title="Sell line")
plot(MAout, color=color.blue, linewidth=2, title="MA Slope")
plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope")
longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup
if (longCondition)
strategy.entry("Buy", strategy.long)
shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow
if (shortCondition)
strategy.entry("Sell", strategy.short)