Ý tưởng cốt lõi của chiến lược này là làm cho thời gian làm mịn của chỉ số RSI năng động, tự động điều chỉnh nó dựa trên mối tương quan giữa giá và động lực, do đó cải thiện tính hữu ích của chỉ số RSI.
Chiến lược đầu tiên tính toán động lực của giá, sau đó tính toán hệ số tương quan giữa giá và động lực. Khi hệ số tương quan gần 1, điều đó có nghĩa là giá và động lực có tương quan tích cực cao. Khi hệ số tương quan gần -1, điều đó có nghĩa là giá và động lực có tương quan tiêu cực cao.
Dựa trên mối tương quan giữa giá và động lực, thời gian làm mịn của chỉ số RSI có thể được điều chỉnh. Khi mối tương quan cao, một thời gian RSI ngắn hơn được sử dụng. Khi mối tương quan thấp, một thời gian RSI dài hơn được sử dụng.
Cụ thể, chiến lược này thiết lập phạm vi thời gian RSI là 20-50 theo mặc định. Sau khi tính toán hệ số tương quan giữa giá và động lượng, nó sử dụng lập bản đồ tuyến tính để lập bản đồ hệ số tương quan đến phạm vi 20-50 như là thời gian làm mịn RSI cuối cùng.
Điều này cho phép các thông số RSI được tự động điều chỉnh dựa trên điều kiện thị trường. Khi thay đổi giá có mối tương quan mạnh mẽ với sự thay đổi động lực, RSI ngắn hạn được sử dụng để làm cho nó nhạy cảm hơn. Khi mối tương quan yếu, RSI dài hạn được sử dụng để giảm tác động của tiếng ồn lên tín hiệu.
Ý tưởng điều chỉnh động thời gian làm mịn RSI là đáng để học hỏi, nhưng việc thực hiện cụ thể có nhiều chỗ để cải thiện. Chìa khóa là xác định các yếu tố quyết định ảnh hưởng đến việc lựa chọn tham số RSI và chuyển đổi chúng thành các chỉ số có thể định lượng. Ngoài ra, không chỉ dựa vào mô hình, tối ưu hóa thực nghiệm của phạm vi tham số là cần thiết. Nhìn chung đây là một ý tưởng rất sáng tạo, với tiềm năng thực tế sau khi tối ưu hóa và cải tiến thêm.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 ) // +++++++++++++++++++++ // ++ INPUT ++ // +++++++++++++++++++++ // Momentum len = input.int(10, "Momentum Length", 1, group = "Dynamic RSI Momentum") src = input.source(close, "Source", group = "Dynamic RSI Momentum") min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum") max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum") upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum") dnLvl = input.float(30, "OverSold", 0, 100, group = "Dynamic RSI Momentum") // +++++++++++++++++++++ // ++ CALCULATION ++ // +++++++++++++++++++++ // RMA Function rmaFun(src, len) => sma = ta.sma(src, len) alpha = 1/len sum = 0.0 sum := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1]) // RSI Function rsiFun(src, len) => 100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / rmaFun(src[1] - src > 0 ? src[1] - src : 0, len)) // Momentum momVal = src - src[len] // Calculation Price vs Momentum corr = ta.correlation(src, momVal, len) corr := corr > 1 or corr < -1 ? float(na) : corr rsiLen = 0 rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0)) rsiMom = rsiFun(src, rsiLen) // +++++++++++++++++++++ // ++ STRATEGY ++ // +++++++++++++++++++++ long = ta.crossover(rsiMom, dnLvl) short = ta.crossunder(rsiMom, upLvl) // +++> Long <+++++ if long and not na(rsiMom) strategy.entry("Long", strategy.long) // +++> Short <+++++ if short and not na(rsiMom) strategy.entry("Short", strategy.short) // +++++++++++++++++++++ // ++ PLOT ++ // +++++++++++++++++++++ plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow) hline(50, "Mid Line", color.gray) upperLine = hline(upLvl, "Upper Line", color.gray) lowerLine = hline(dnLvl, "Lower Line", color.gray) fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")