इस रणनीति का मुख्य विचार आरएसआई को गतिशील बनाने के लिए है, जो कीमत और गतिशीलता के बीच संबंध के आधार पर स्वचालित रूप से समायोजित होता है, जिससे आरएसआई की उपयोगिता में सुधार होता है।
यह रणनीति पहले मूल्य की गति की गणना करती है और फिर मूल्य और गति के बीच सहसंबंध गुणांक की गणना करती है। सहसंबंध गुणांक 1 के करीब होने पर, यह दर्शाता है कि मूल्य और गति अत्यधिक सकारात्मक रूप से संबंधित हैं; सहसंबंध गुणांक -1 के करीब होने पर, यह दर्शाता है कि मूल्य और गति अत्यधिक नकारात्मक रूप से संबंधित हैं।
मूल्य और गतिशीलता की प्रासंगिकता के आधार पर, आरएसआई सूचक के चिकनाई चक्र की लंबाई को समायोजित किया जा सकता है। जब प्रासंगिकता अधिक होती है, तो आरएसआई चक्र का उपयोग कम होता है; जब प्रासंगिकता कम होती है, तो आरएसआई चक्र का उपयोग लंबा होता है।
विशेष रूप से, इस रणनीति ने आरएसआई चक्र की लंबाई को 20-50 की एक सीमा के रूप में सेट किया है। मूल्य और गतिशीलता के संबंधित गुणांक की गणना करने के बाद, एक रैखिक मानचित्रण विधि के माध्यम से, आरएसआई के अंतिम चिकनाई चक्र की लंबाई के रूप में 20-50 की सीमा पर संबंधित गुणांक को मैप किया जाता है।
इस प्रकार, बाजार की स्थितियों के अनुसार, आरएसआई संकेतक के पैरामीटर को स्वचालित रूप से समायोजित किया जा सकता है, और जब कीमत में परिवर्तन और गतिशीलता में परिवर्तन के बीच एक मजबूत संबंध होता है, तो अधिक संक्षिप्त आरएसआई का उपयोग किया जाता है, जिससे यह अधिक संवेदनशील हो जाता है; और जब सहसंबंध कम होता है, तो संकेतों पर शोर के प्रभाव को कम करने के लिए अधिक लंबी अवधि के आरएसआई का उपयोग किया जाता है।
यह रणनीति आरएसआई को गतिशील रूप से समायोजित करने के लिए आरएसआई को चिकना करने के चक्र के बारे में सीखने के लायक है, लेकिन इसे लागू करने के लिए बहुत सुधार की जगह है। कुंजी यह है कि आरएसआई मापदंडों के चयन को प्रभावित करने वाले निर्णायक कारकों को ढूंढना और उन्हें एक मात्रात्मक संकेतक में परिवर्तित करना है। साथ ही, मॉडल पर पूरी तरह से भरोसा न करें, और अनुभव और प्रतिक्रिया के आधार पर पैरामीटर रेंज को अनुकूलित करने की आवश्यकता है। कुल मिलाकर, यह एक बहुत ही अभिनव विचार है, जिसमें अनुकूलन और सुधार जारी रखने के बाद व्यावहारिक उपयोग की क्षमता है।
/*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")