La idea central de esta estrategia es hacer dinámico el período de suavización del indicador RSI, ajustándolo automáticamente en función de la correlación entre el precio y el impulso, mejorando así la utilidad del indicador RSI.
La estrategia primero calcula el momento del precio, luego calcula el coeficiente de correlación entre el precio y el momento. Cuando el coeficiente de correlación está cerca de 1, significa que el precio y el momento están altamente correlacionados positivamente. Cuando el coeficiente de correlación está cerca de -1, significa que el precio y el momento están altamente correlacionados negativamente.
Basado en la correlación entre el precio y el impulso, el período de suavización del indicador RSI se puede ajustar. Cuando la correlación es alta, se utiliza un período RSI más corto. Cuando la correlación es baja, se utiliza un período RSI más largo.
Específicamente, esta estrategia establece el intervalo de período del RSI como 20-50 por defecto. Después de calcular el coeficiente de correlación entre precio e impulso, utiliza un mapeo lineal para asignar el coeficiente de correlación al intervalo de 20-50 como el período de suavizado final del RSI.
Esto permite que los parámetros del RSI se ajusten automáticamente en función de las condiciones del mercado. Cuando los cambios de precio están fuertemente correlacionados con los cambios de impulso, se utiliza un RSI de período más corto para hacerlo más sensible. Cuando la correlación es débil, se utiliza un RSI de período más largo para reducir el impacto del ruido en la señal.
La idea de ajustar dinámicamente el período de suavizado del RSI vale la pena aprender, pero la implementación específica tiene mucho margen de mejora. La clave es identificar los factores decisivos que afectan la selección de parámetros del RSI y convertirlos en indicadores cuantificables. Además, no confíe únicamente en el modelo, se necesita una optimización empírica de rangos de parámetros. En general, esta es una idea muy innovadora, con potencial práctico después de nuevas optimizaciones y mejoras.
/*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")