Основная идея этой стратегии заключается в том, чтобы сделать период сглаживания индикатора RSI динамичным, автоматически корректируя его на основе корреляции между ценой и импульсом, тем самым повышая полезность индикатора RSI.
Стратегия сначала рассчитывает импульс цены, а затем вычисляет коэффициент корреляции между ценой и импульсом. Когда коэффициент корреляции близок к 1, это означает, что цена и импульс высоко положительно коррелируют. Когда коэффициент корреляции близок к -1, это означает, что цена и импульс высоко отрицательно коррелируют.
На основе корреляции между ценой и импульсом можно корректировать период сглаживания индикатора RSI. Когда корреляция высока, используется более короткий период RSI. Когда корреляция низкая, используется более длительный период RSI.
В частности, эта стратегия устанавливает диапазон периода RSI на уровне 20-50 по умолчанию. После расчета коэффициента корреляции между ценой и импульсом она использует линейное отображение, чтобы отобразить коэффициент корреляции в диапазоне 20-50 как окончательный период сглаживания RSI.
Это позволяет автоматически корректировать параметры RSI на основе рыночных условий. Когда изменения цены сильно коррелируют с изменениями импульса, используется более короткий период RSI, чтобы сделать его более чувствительным. Когда корреляция слаба, используется более длительный период RSI, чтобы уменьшить влияние шума на сигнал.
Идея динамической корректировки периода сглаживания РСИ стоит изучить, но в конкретной реализации есть много возможностей для улучшения. Ключ в том, чтобы определить решающие факторы, влияющие на выбор параметров РСИ, и преобразовать их в количественные показатели. Кроме того, не полагайтесь исключительно на модель, необходима эмпирическая оптимизация диапазонов параметров. В целом это очень инновационная идея, с практическим потенциалом после дальнейших оптимизаций и улучшений.
/*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")