L'idée de base de cette stratégie est de rendre dynamique la période de lissage de l'indicateur RSI, en l'ajustant automatiquement en fonction de la corrélation entre prix et dynamique, améliorant ainsi l'utilité de l'indicateur RSI.
La stratégie calcule d'abord l'élan du prix, puis calcule le coefficient de corrélation entre le prix et l'élan. Lorsque le coefficient de corrélation est proche de 1, cela signifie que le prix et l'élan sont fortement corrélés positivement. Lorsque le coefficient de corrélation est proche de -1, cela signifie que le prix et l'élan sont fortement corrélés négativement.
En fonction de la corrélation entre le prix et la dynamique, la période de lissage de l'indicateur RSI peut être ajustée.
Plus précisément, cette stratégie définit la plage de période du RSI à 20 à 50 par défaut. Après avoir calculé le coefficient de corrélation entre le prix et l'élan, elle utilise une cartographie linéaire pour cartographier le coefficient de corrélation à la plage de 20 à 50 comme la période de lissage finale du RSI.
Cela permet d'ajuster automatiquement les paramètres du RSI en fonction des conditions du marché. Lorsque les changements de prix sont fortement corrélés avec les changements de momentum, un RSI à courte période est utilisé pour le rendre plus sensible. Lorsque la corrélation est faible, un RSI à plus longue période est utilisé pour réduire l'impact du bruit sur le signal.
L'idée d'ajuster dynamiquement la période de lissage du RSI vaut la peine d'être apprise, mais la mise en œuvre spécifique a beaucoup de marge d'amélioration. La clé est d'identifier les facteurs décisifs affectant la sélection des paramètres du RSI et de les convertir en indicateurs quantifiables.
/*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")