Idea teras strategi ini adalah untuk menjadikan tempoh penyelarasan penunjuk RSI dinamik, menyesuaikan secara automatik berdasarkan korelasi antara harga dan momentum, dengan itu meningkatkan kegunaan penunjuk RSI.
Strategi ini mula-mula mengira momentum harga, kemudian mengira pekali korelasi antara harga dan momentum. Apabila pekali korelasi hampir 1, ia bermakna harga dan momentum sangat positif korelasi. Apabila pekali korelasi hampir -1, ia bermakna harga dan momentum sangat negatif korelasi.
Berdasarkan korelasi antara harga dan momentum, tempoh penyelarasan penunjuk RSI boleh diselaraskan. Apabila korelasi tinggi, tempoh RSI yang lebih pendek digunakan. Apabila korelasi rendah, tempoh RSI yang lebih lama digunakan.
Khususnya, strategi ini menetapkan julat tempoh RSI menjadi 20-50 secara lalai. Selepas mengira pekali korelasi antara harga dan momentum, ia menggunakan pemetaan linear untuk memetakan pekali korelasi ke julat 20-50 sebagai tempoh penyelarasan RSI akhir.
Ini membolehkan parameter RSI disesuaikan secara automatik berdasarkan keadaan pasaran. Apabila perubahan harga berkorelasi kuat dengan perubahan momentum, RSI tempoh yang lebih pendek digunakan untuk menjadikannya lebih sensitif. Apabila korelasi lemah, RSI tempoh yang lebih lama digunakan untuk mengurangkan kesan bunyi pada isyarat.
Idea penyesuaian dinamik tempoh pelunturan RSI adalah perlu dipelajari, tetapi pelaksanaan khusus mempunyai banyak ruang untuk peningkatan. Kuncinya adalah untuk mengenal pasti faktor-faktor yang menentukan yang mempengaruhi pemilihan parameter RSI, dan menukarnya menjadi penunjuk yang boleh diukur. Juga, jangan hanya bergantung pada model, pengoptimuman empirikal julat parameter diperlukan. Secara keseluruhan ini adalah idea yang sangat inovatif, dengan potensi praktikal selepas pengoptimuman dan penambahbaikan 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")