A ideia central desta estratégia é tornar o período de suavização do indicador RSI dinâmico, ajustando-o automaticamente com base na correlação entre preço e momento, melhorando assim a utilidade do indicador RSI.
A estratégia calcula primeiro o momento do preço, em seguida, calcula o coeficiente de correlação entre o preço e o momento. Quando o coeficiente de correlação está perto de 1, isso significa que o preço e o momento estão altamente correlacionados positivamente. Quando o coeficiente de correlação está perto de -1, isso significa que o preço e o momento estão altamente correlacionados negativamente.
Com base na correlação entre o preço e o momento, o período de suavização do indicador RSI pode ser ajustado. Quando a correlação é alta, um período RSI mais curto é usado. Quando a correlação é baixa, um período RSI mais longo é usado.
Especificamente, esta estratégia define o intervalo de período do RSI para ser de 20-50 por padrão.
Isso permite que os parâmetros do RSI sejam ajustados automaticamente com base nas condições do mercado. Quando as mudanças de preço estão fortemente correlacionadas com mudanças de momento, um RSI de período mais curto é usado para torná-lo mais sensível. Quando a correlação é fraca, um RSI de período mais longo é usado para reduzir o impacto do ruído no sinal.
A ideia de ajustar dinamicamente o período de suavização do RSI vale a pena aprender, mas a implementação específica tem muito espaço para melhoria. A chave é identificar os fatores decisivos que afetam a seleção do parâmetro do RSI e convertê-los em indicadores quantificáveis. Além disso, não confie puramente no modelo, é necessária otimização empírica de intervalos de parâmetros.
/*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")