L’idée centrale de cette stratégie est de rendre le cycle de ralentissement de l’indicateur RSI dynamique, s’ajustant automatiquement en fonction de la corrélation entre le prix et la dynamique, améliorant ainsi la praticité de l’indicateur RSI.
La stratégie commence par calculer la dynamique du prix, puis le coefficient de corrélation entre le prix et la dynamique. Un coefficient de corrélation proche de 1 indique une forte corrélation entre le prix et la dynamique; un coefficient de corrélation proche de 1 indique une forte corrélation entre le prix et la dynamique.
La longueur des cycles de l’indicateur RSI peut être ajustée en fonction de la corrélation entre le prix et la dynamique. Lorsque la corrélation est élevée, un cycle RSI plus court est utilisé; lorsqu’elle est faible, un cycle RSI plus long est utilisé.
Plus précisément, cette stratégie définit la longueur du cycle RSI comme une plage, par défaut 20-50. Après avoir calculé les coefficients correspondants du prix et de la dynamique, le coefficient correspondant est cartographié dans la plage 20-50, par une méthode de cartographie linéaire, comme la longueur du cycle de lissage final du RSI.
Cela permet d’ajuster automatiquement les paramètres de l’indicateur RSI en fonction de la situation du marché, en utilisant un RSI plus court lorsque les variations de prix et les variations de momentum sont fortement corrélées, ce qui le rend plus sensible; et en utilisant un RSI plus long lorsque la corrélation n’est pas forte, ce qui réduit l’impact du bruit sur le signal.
La stratégie de l’optimisation des paramètres en fonction de l’expérience et des retours d’expérience est une idée très innovante qui a le potentiel d’être utilisée dans la vie réelle après une optimisation et une amélioration continues.
/*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")