Die Kernidee der Strategie ist es, die Glatzephase des RSI-Indikators dynamisch zu gestalten und sich automatisch an die Korrelation zwischen Preis und Dynamik anzupassen, um die Funktionalität des RSI zu verbessern.
Die Strategie berechnet zunächst die Dynamik des Preises und dann den Korrelationskoeffizienten zwischen Preis und Dynamik. Ein Korrelationskoeffizient nahe 1 zeigt eine hohe positive Korrelation zwischen Preis und Dynamik; ein Korrelationskoeffizient nahe 1 zeigt eine negative Korrelation zwischen Preis und Dynamik.
Je nach Preis- und Dynamikkorrelation kann die Länge der Glatzephase des RSI-Indikators angepasst werden. Wenn die Korrelation hoch ist, werden kürzere RSI-Phasen verwendet; wenn die Korrelation niedrig ist, werden längere RSI-Phasen verwendet.
Konkret setzt die Strategie die RSI-Zykluslänge auf einen Bereich, der standardmäßig 20-50 beträgt. Nach der Berechnung der entsprechenden Koeffizienten für Preis und Dynamik wird der entsprechende Koeffizient durch die Methode der linearen Kartierung auf den Bereich 20-50 als endgültige Linienzykluslänge des RSI abgebildet.
Dies ermöglicht die automatische Anpassung der Parameter des RSI-Indikators an die Marktlage. Wenn Preisänderungen und Dynamikänderungen stark miteinander verbunden sind, wird ein kürzerer RSI verwendet, um ihn empfindlicher zu machen. Wenn die Korrelation schwach ist, wird ein längerer RSI verwendet, um den Einfluss von Noise auf das Signal zu reduzieren.
Die Strategie mit der dynamischen Anpassung des RSI-Gleichungszyklus ist eine Idee, die es wert ist, gelernt zu werden, aber die konkrete Umsetzung hat noch viel zu verbessern. Die Schlüssel ist, die entscheidenden Faktoren zu finden, die die Auswahl der RSI-Parameter beeinflussen, und diese in quantifizierbare Indikatoren zu übersetzen. Gleichzeitig sollte man sich nicht vollständig auf Modelle verlassen, sondern die Parameterbereiche nach Erfahrung und Rückmeldung optimieren.
/*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")