Idea utama strategi ini adalah untuk menjadikan kitaran perapisan RSI menjadi dinamik, menyesuaikan diri secara automatik mengikut hubungan antara harga dan momentum, dan dengan itu meningkatkan kegunaan RSI.
Strategi ini pertama-tama mengira pergerakan harga, dan kemudian mengira faktor perkaitan antara harga dan pergerakan. Apabila faktor perkaitan mendekati 1, harga dan pergerakan sangat berkait positif; apabila faktor perkaitan mendekati -1, harga dan pergerakan sangat berkait negatif.
Panjang kitaran halus RSI boleh disesuaikan mengikut hubungan harga dan momentum. Apabila hubungan tinggi, gunakan kitaran RSI yang lebih pendek; Apabila hubungan rendah, gunakan kitaran RSI yang lebih lama.
Khususnya, strategi ini menetapkan panjang kitaran RSI sebagai julat, secara lalai 20-50. Setelah mengira faktor berkaitan harga dan momentum, pemetaan faktor berkaitan ke dalam julat 20-50 sebagai panjang kitaran penyelesaian akhir RSI melalui kaedah pemetaan linear.
Ini membolehkan parameter RSI disesuaikan secara automatik mengikut keadaan pasaran, menggunakan RSI yang lebih pendek apabila perubahan harga dan perubahan momentum sangat berkaitan, menjadikannya lebih sensitif; apabila korelasi tidak kuat, menggunakan RSI yang lebih lama untuk mengurangkan kesan bunyi pada isyarat.
Strategi ini adalah idea yang patut dipelajari dengan menyesuaikan secara dinamik kitaran kelancaran RSI, tetapi terdapat banyak ruang untuk penambahbaikan. Kuncinya adalah untuk mencari faktor penentu yang mempengaruhi pilihan parameter RSI dan menterjemahkannya menjadi penunjuk yang boleh 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")