Gagasan inti dari strategi ini adalah untuk membuat siklus perataan indikator RSI menjadi dinamis, menyesuaikan secara otomatis sesuai dengan korelasi antara harga dan momentum, sehingga meningkatkan kepraktisan indikator RSI.
Strategi ini pertama-tama menghitung momentum harga, kemudian menghitung koefisien korelasi antara harga dan momentum. Ketika koefisien korelasi mendekati 1, harga dan momentum sangat terkait positif; Ketika koefisien korelasi mendekati 1, harga dan momentum sangat terkait negatif.
Panjang siklus halus dari indikator RSI dapat disesuaikan sesuai dengan korelasi harga dan momentum. Bila korelasi tinggi, gunakan siklus RSI yang lebih pendek; Bila korelasi rendah, gunakan siklus RSI yang lebih panjang.
Secara khusus, strategi ini menetapkan panjang siklus RSI menjadi kisaran 20-50 secara default. Setelah menghitung koefisien terkait harga dan momentum, koefisien terkait dipetakan ke dalam kisaran 20-50 melalui metode pemetaan linier sebagai panjang siklus RSI yang disetel secara akhir.
Hal ini memungkinkan untuk menyesuaikan parameter indikator RSI secara otomatis sesuai dengan kondisi pasar, menggunakan RSI yang lebih pendek ketika perubahan harga dan perubahan momentum sangat terkait, sehingga lebih sensitif; ketika korelasi tidak kuat, menggunakan RSI yang lebih panjang untuk mengurangi pengaruh noise pada sinyal.
Strategi ini adalah ide yang layak untuk dipelajari, tetapi ada banyak ruang untuk perbaikan. Kuncinya adalah menemukan faktor-faktor yang menentukan yang mempengaruhi pilihan parameter RSI dan menerjemahkannya ke dalam indikator yang dapat diukur.
/*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")