Đây là một chiến lược giao dịch định lượng kết hợp chỉ số sức mạnh tương đối (RSI) với nhiều đường trung bình động. Chiến lược chủ yếu xác định xu hướng thị trường bằng cách theo dõi các tín hiệu chéo giữa các loại đường trung bình động khác nhau (bao gồm SMA, EMA, WMA và SMMA) trên chỉ số RSI, trong khi sử dụng các vùng mua quá mức và bán quá mức RSI như các tiêu chí quyết định bổ sung.
Chiến lược bao gồm một số bước tính toán chính: 1. Tính toán chỉ số RSI 14 giai đoạn với mức mua quá mức ở 70 và mức bán quá mức ở 30 2. Tính toán ba trung bình động khác nhau trên đường cong RSI: - MA1: 20 giai đoạn, lựa chọn SMA/EMA/WMA/SMMA - MA2: 50 thời gian, lựa chọn SMA/EMA/WMA/SMMA - MA3: Thời gian 100, lựa chọn SMA/EMA/WMA/SMMA 3. Quy tắc tạo tín hiệu giao dịch: - Báo hiệu mua: Khi MA2 vượt trên MA3 - Sản xuất tín hiệu: Khi MA2 vượt qua dưới MA3 4. Đồng thời phát hiện sự khác biệt của chỉ số RSI để tham khảo thêm
Chiến lược này xây dựng một hệ thống giao dịch thích nghi bằng cách kết hợp chỉ số RSI và nhiều đường trung bình động. Ưu điểm cốt lõi của nó nằm trong việc xác nhận chéo của nhiều chỉ số kỹ thuật và cấu hình tham số linh hoạt, trong khi phải chú ý đến sự chậm trễ của đường trung bình động và tác động của điều kiện thị trường đối với hiệu suất chiến lược. Thông qua tối ưu hóa liên tục và kiểm soát rủi ro, chiến lược này cho thấy hứa hẹn cho hiệu suất ổn định trong giao dịch thực tế.
/*backtest start: 2024-01-17 00:00:00 end: 2025-01-16 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}] */ //@version=6 strategy(title="Relative Strength Index with MA Strategy", shorttitle="RSI-MA Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=200) // RSI Inputs rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings") rsiSourceInput = input.source(close, "Source", group="RSI Settings") calculateDivergence = input.bool(false, title="Calculate Divergence", group="RSI Settings", tooltip="Calculating divergences is needed in order for divergence alerts to fire.") // RSI Calculation change_rsi = ta.change(rsiSourceInput) up = ta.rma(math.max(change_rsi, 0), rsiLengthInput) down = ta.rma(-math.min(change_rsi, 0), rsiLengthInput) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) // RSI Plot plot(rsi, "RSI", color=#7E57C2) hline(70, "RSI Upper Band", color=#787B86) hline(50, "RSI Middle Band", color=color.new(#787B86, 50)) hline(30, "RSI Lower Band", color=#787B86) fill(hline(70), hline(30), color=color.rgb(126, 87, 194, 90), title="RSI Background Fill") // RSI-based MA Inputs grpRSIMovingAverages = "RSI Moving Averages" ma1Length = input.int(20, title="MA1 Length", group=grpRSIMovingAverages) ma2Length = input.int(50, title="MA2 Length", group=grpRSIMovingAverages) ma3Length = input.int(100, title="MA3 Length", group=grpRSIMovingAverages) ma1Type = input.string("SMA", title="MA1 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages) ma2Type = input.string("EMA", title="MA2 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages) ma3Type = input.string("WMA", title="MA3 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages) // MA Calculation Function calcMA(source, length, type) => switch type "SMA" => ta.sma(source, length) "EMA" => ta.ema(source, length) "WMA" => ta.wma(source, length) "SMMA" => ta.rma(source, length) // MA Calculations ma1 = calcMA(rsi, ma1Length, ma1Type) ma2 = calcMA(rsi, ma2Length, ma2Type) ma3 = calcMA(rsi, ma3Length, ma3Type) // MA Plots plot(ma1, title="RSI MA1", color=color.blue) plot(ma2, title="RSI MA2", color=color.green) plot(ma3, title="RSI MA3", color=color.red) // Divergence (Retained from original script) lookbackRight = 5 lookbackLeft = 5 rangeUpper = 60 rangeLower = 5 bearColor = color.red bullColor = color.green textColor = color.white noneColor = color.new(color.white, 100) _inRange(bool cond) => bars = ta.barssince(cond) rangeLower <= bars and bars <= rangeUpper plFound = false phFound = false bullCond = false bearCond = false rsiLBR = rsi[lookbackRight] if calculateDivergence // Regular Bullish plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight)) rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and _inRange(plFound[1]) lowLBR = low[lookbackRight] priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1) bullCond := priceLL and rsiHL and plFound // Regular Bearish phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight)) rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and _inRange(phFound[1]) highLBR = high[lookbackRight] priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1) bearCond := priceHH and rsiLH and phFound // plot( // plFound ? rsiLBR : na, // offset=-lookbackRight, // title="Regular Bullish", // linewidth=2, // color=(bullCond ? bullColor : noneColor), // display = display.pane // ) plotshape( bullCond ? rsiLBR : na, offset=-lookbackRight, title="Regular Bullish Label", text=" Bull ", style=shape.labelup, location=location.absolute, color=bullColor, textcolor=textColor ) // plot( // phFound ? rsiLBR : na, // offset=-lookbackRight, // title="Regular Bearish", // linewidth=2, // color=(bearCond ? bearColor : noneColor), // display = display.pane // ) plotshape( bearCond ? rsiLBR : na, offset=-lookbackRight, title="Regular Bearish Label", text=" Bear ", style=shape.labeldown, location=location.absolute, color=bearColor, textcolor=textColor ) alertcondition(bullCond, title='Regular Bullish Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.") alertcondition(bearCond, title='Regular Bearish Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.') // ----- MUA/BÁN ----- // Điều kiện Mua: MA2 cắt lên MA3 và MA3 < 55 buyCondition = ta.crossover(ma2, ma3) // Điều kiện Bán: MA2 cắt xuống MA3 và MA3 > 40 sellCondition = ta.crossunder(ma2, ma3) // Thực hiện lệnh Mua/Bán if (buyCondition) strategy.entry("Buy", strategy.long, comment="Buy Signal") if (sellCondition) strategy.close("Buy", comment="Sell Signal") // ----- KẾT THÚC -----