Gagasan inti dari strategi ini adalah untuk membuat periode penyelarasan indikator RSI dinamis, secara otomatis menyesuaikannya berdasarkan korelasi antara harga dan momentum, sehingga meningkatkan kegunaan indikator RSI.
Strategi ini pertama menghitung momentum harga, kemudian menghitung koefisien korelasi antara harga dan momentum. Ketika koefisien korelasi mendekati 1, itu berarti harga dan momentum berkorelasi positif. Ketika koefisien korelasi mendekati -1, itu berarti harga dan momentum berkorelasi negatif.
Berdasarkan korelasi antara harga dan momentum, periode perataan indikator RSI dapat disesuaikan. Ketika korelasi tinggi, periode RSI yang lebih pendek digunakan. Ketika korelasi rendah, periode RSI yang lebih lama digunakan.
Secara khusus, strategi ini menetapkan rentang periode RSI menjadi 20-50 secara default. Setelah menghitung koefisien korelasi antara harga dan momentum, ia menggunakan pemetaan linier untuk memetakan koefisien korelasi ke rentang 20-50 sebagai periode penyelarasan RSI akhir.
Ini memungkinkan parameter RSI untuk disesuaikan secara otomatis berdasarkan kondisi pasar. Ketika perubahan harga berkorelasi kuat dengan perubahan momentum, RSI periode yang lebih pendek digunakan untuk membuatnya lebih sensitif. Ketika korelasi lemah, RSI periode yang lebih lama digunakan untuk mengurangi dampak kebisingan pada sinyal.
Ide untuk menyesuaikan periode perataan RSI secara dinamis layak dipelajari, tetapi implementasi spesifik memiliki banyak ruang untuk perbaikan. Kuncinya adalah mengidentifikasi faktor-faktor penentu yang mempengaruhi pemilihan parameter RSI, dan mengubahnya menjadi indikator yang dapat diukur. Juga, jangan hanya mengandalkan model, optimasi empiris rentang parameter diperlukan. Secara keseluruhan ini adalah ide yang sangat inovatif, dengan potensi praktis setelah optimasi dan perbaikan lebih lanjut.
/*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")