Chiến lược này sử dụng độ nghiêng của Moving Average (MA) và độ nghiêng của các chỉ số động lực để đưa ra quyết định giao dịch. Nó so sánh độ nghiêng của MA và độ nghiêng của động lực với các ngưỡng đặt, và tạo ra các tín hiệu giao dịch khi cả hai độ nghiêng vượt quá ngưỡng. Chiến lược cũng chứa bộ lọc biến động thấp sử dụng một MA khác để tạo ra tín hiệu khi biến động thị trường thấp.
Lòng cốt của chiến lược này nằm trong việc so sánh hai đường cong độ dốc. Đầu tiên, nó tính toán độ dốc của chỉ số MA và động lượng. Độ dốc phản ánh tốc độ thay đổi và hướng của đường cong. Sau đó, hai ngưỡng được sử dụng, khi cả độ dốc MA và độ dốc động vượt quá ngưỡng tương ứng, các tín hiệu giao dịch được tạo ra.
Ví dụ, khi cả độ nghiêng MA và độ nghiêng động lượng vượt quá đường trên, một tín hiệu mua được tạo ra; khi cả hai đường cong rơi xuống dưới đường dưới, một tín hiệu bán được tạo ra. Điều này có thể lọc ra một số tín hiệu sai.
Bộ lọc biến động thấp sử dụng MA dài hạn để xác định biến động thị trường. Khi biến động thấp, MA với các thông số khác nhau được sử dụng để tạo ra các tín hiệu giao dịch để thích nghi với các trạng thái thị trường khác nhau.
Chiến lược này có những lợi thế sau:
Bộ lọc kép để thiết lập tín hiệu giao dịch có thể lọc một số 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 chiến lược thích nghi với các điều kiện thị trường khác nhau với độ đàn hồi.
Khả năng tùy chỉnh cao cho các thông số khác nhau có thể được tối ưu hóa cho các sản phẩm khác nhau.
Nó không chứa chức năng sơn lại để giảm tác động từ việc gắn cong.
Chiến lược này cũng có một số rủi ro:
Bộ lọc kép có thể lọc một số tín hiệu thực tế và bỏ lỡ cơ hội. Điều này có thể được tối ưu hóa bằng cách điều chỉnh các tham số.
Việc xác định ngưỡng của bộ lọc biến động thấp cần kiểm tra cẩn thận.
Cài đặt tham số cho MA và chỉ số động lực cần được tối ưu hóa cho các sản phẩm cụ thể, và các tham số phổ biến rất khó xác định.
Chức năng không sơn lại không thể tránh hoàn toàn vấn đề điều chỉnh đường cong backtest, và hiệu suất giao dịch thực sự vẫn cần xác minh.
Khả năng tùy biến cao làm tăng sự phức tạp của không gian tham số và khó khăn của tối ưu hóa.
Chiến lược có thể được tối ưu hóa theo các hướng sau:
Kiểm tra nhiều kết hợp của chỉ số MA và động lượng để tìm các 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 sự chậm trễ và tiếng ồn.
Tối ưu hóa các tham số để tính toán độ dốc để tìm các kết hợp chỉ số ổn định hơn.
Kiểm tra các chỉ số và tham số biến động thấp khác nhau để cải thiện độ đàn hồi.
Kiểm tra trên các sản phẩm và khung thời gian khác nhau để tìm phạm vi áp dụng tốt nhất.
Xây dựng các cơ chế thích nghi tham số để giảm khối lượng công việc tối ưu hóa thủ công.
Đây là một chiến lược MA kép rất linh hoạt và có thể tùy chỉnh. Nó tham chiếu cả thông tin giá và động lực để ra quyết định, có thể lọc hiệu quả các tín hiệu sai. Bộ lọc biến động thấp cũng làm cho chiến lược linh hoạt hơn để thích nghi với những thay đổi của thị trường.
Với những cải tiến trong tối ưu hóa tham số và lựa chọn chỉ số, chiến lược này có thể trở thành một lựa chọn khả thi cho giao dịch thực tế.
/*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)