A ideia central da estratégia é tornar o ciclo de suavização do RSI dinâmico, ajustando-se automaticamente de acordo com a correlação entre o preço e a dinâmica, melhorando a praticidade do RSI.
A estratégia primeiro calcula a dinâmica dos preços e, em seguida, calcula o coeficiente de correlação entre preço e dinâmica. Quando o coeficiente de correlação é próximo a 1, o preço e a dinâmica estão altamente correlacionados; quando o coeficiente de correlação é próximo a 1, o preço e a dinâmica estão altamente correlacionados.
De acordo com a correlação entre o preço e a dinâmica, pode-se ajustar o comprimento do ciclo de smoothing do indicador RSI. Quando a correlação é alta, use um ciclo RSI mais curto; Quando a correlação é baixa, use um ciclo RSI mais longo.
Especificamente, esta estratégia define o comprimento do ciclo RSI como um intervalo de 20 a 50 por defeito. Após calcular os coeficientes relevantes de preço e dinâmica, os coeficientes relevantes são mapeados para o intervalo de 20 a 50 por meio do método de mapeamento linear como o comprimento do ciclo de smoothing final do RSI.
Isso permite ajustar automaticamente os parâmetros do indicador RSI de acordo com as condições do mercado, usando um RSI mais curto para torná-lo mais sensível quando há uma forte correlação entre a mudança de preço e a mudança de momentum; e, quando a correlação não é forte, usando um RSI mais longo para reduzir o impacto do ruído no sinal.
A estratégia vale a pena aprender a idéia de ajustar dinamicamente o ciclo de suavização do RSI, mas há muito espaço para melhoria na implementação concreta. A chave é encontrar os fatores decisivos que afetam a escolha dos parâmetros do RSI e traduzi-los em indicadores quantificáveis. Ao mesmo tempo, não se baseie exclusivamente no modelo e também otimizar o alcance dos parâmetros com base na experiência e no feedback.
/*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")