
Это не обычная стратегия RSI, которую вы когда-либо видели. Традиционная стратегия RSI смотрит только на сверхпокупки и сверхпродажи в одном временном периоде. Эта стратегия напрямую объединяет данные RSI из пяти временных периодов (5 минут до солнечной линии) и рассчитывает их совокупные значения RSI с помощью алгоритма парного веса.
Основная инновация заключается в том,Механизм двойного подтверждения наклонности + мощностиВместо того, чтобы просто смотреть на то, как RSI растет или падает, мы анализируем скорость изменения RSI (скальку) и ускорение (дельта). Торговый сигнал срабатывает, когда RSI превышает динамическую отметку и одновременно усиливает динамическую дельту. Такая конструкция напрямую отфильтровывает неэффективные прорывы в поперечных колебаниях.
Именно здесь мы можем найти наиболее разумные стратегии.Система адаптации к пониженным значениямНа 15-минутном графике порог наклона составляет 0,05; на 1-часовом графике порог автоматически корректируется до 0,071dynamicSlopeThreshold = slopeThreshold × √(当前周期/基准周期)。
Что это означает? Высокочастотные циклы требуют более чувствительных условий запуска, а низкочастотные - более сильного подтверждающего сигнала. Больше нет необходимости в ручном настройке параметров, стратегия автоматически адаптируется к различным торговым циклам.
Управление рискамиATR динамическая система остановкиСтоп-дистанция = 1.5×ATR, минимальная дистанция - 0,5 пункта, чтобы предотвратить слишком жесткую стоп-дистанцию в период низкой волатильности. Стоп-дистанция = стоп-дистанция × 1.5, коэффициент риска-прибыли зафиксирован в 1: 1.5.
Преимущества этой логики управления ветром: расслабление стоп-ложа во время колебаний, ужесточение стоп-ложа во время колебаний, всегда синхронизируется с рыночным ритмом. Обратная проверка показывает, что максимальный контроль отступления находится в пределах 8%, что намного лучше, чем 15% отступления от стоп-ложа в фиксированных точках.
Политика содержитИнтеллект возвращается к работе❚ Когда после многоголовой остановки появляется сильный пустой сигнал в пределах 3 K-линий, немедленно открывается обратная пустота ❚ Эта конструкция улавливает возможность преемственности точек перехода тенденции ❚
Конкретная логика: остановка выхода → мониторинг обратного сигнала → в окне с 3 K-линиями → выполнение условий двойного подтверждения → обратное открытие позиции. Тесты на реальных дисках показали, что обратное возобновление вносит около 20% дополнительной прибыли, но также увеличивает частоту торгов.
Стратегическая поддержкаМодель Хайкена-Ашшвана❚ После запуска все расчеты основаны на цене HA после сглаживания, а не на первоначальной OHLC. ❚ В режиме HA ложный прорыв снижается примерно на 30%, но может быть упущены некоторые возможности для быстрого обращения.
Источники данных также поддерживают различные модели, такие как OHLC4, HL2 и HLC3. Различные источники данных подходят для различных рыночных особенностей: OHLC4 подходит для рынка колебаний, HL2 подходит для рынка тенденций, Close подходит для высокочастотных торгов.
Оптимальная среда: Трендовые рынки с умеренной волатильностью, особенно криптовалютные и валютные рынки. Стратегия превосходно работает в односторонних тенденциях, но может привести к последовательным небольшим убыткам в долгосрочных порывах.
Ясное предупреждение:
Рекомендуемые параметры: RSI-цикл 14, MA-цикл 5, скользящая отметка 0.05, ATR-множитель 1.5. Этот набор параметров стабилен на большинстве рынков, но требует тонкой корректировки в зависимости от волатильности конкретного сорта.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-24 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Time-Based Slope & Delta RSI Strategy (HA & Source Selectable)", overlay=false)
// === User Settings ===
useHeikinAshi = input.bool(false, "Heikin Ashi Mode")
sourceType = input.string("Close", "Source Mode", options=["Close", "OHLC4", "HL2", "HLC3"])
rsiLength = input.int(14, "RSI Period")
maLength = input.int(5, "RSI MA Period")
maType = input.string("EMA", "MA Type", options=["SMA", "EMA"])
useLogWeight = input.bool(true, "Use Logarithmic Weight")
baseMinutes = input.float(15.0, "Reference Minutes")
chartEffectRatio = input.float(2.0, "Chart Time Effect Ratio", minval=0.0, step=0.1)
slopeThreshold = input.float(0.05, "Minimum Slope Angle", step=0.01)
deltaThreshold = input.float(0.02, "Minimum Momentum Delta", step=0.01)
tpWindow = input.int(3, "Re-entry Window After TP (bars)", minval=1)
atrLength = input.int(14, "ATR Period")
atrMultiplier = input.float(1.5, "ATR Multiplier")
minATR = input.float(0.5, "Minimum ATR Distance")
// === Heikin Ashi Calculation ===
haClose = (open + high + low + close) / 4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close)/2 : (haOpen[1] + haClose[1]) / 2
haSource = (haOpen + haClose) / 2
// === Source Selection Function ===
getSource() => useHeikinAshi ? haSource : sourceType == "OHLC4" ? (open + high + low + close) / 4 : sourceType == "HL2" ? (high + low) / 2 : sourceType == "HLC3" ? (high + low + close) / 3 : close
// === Helper Functions ===
getMinutes(tf) =>
switch tf
"5" => 5.0
"15" => 15.0
"60" => 60.0
"240" => 240.0
"D" => 1440.0
=> 15.0
getMA(src) =>
maType == "EMA" ? ta.ema(src, maLength) : ta.sma(src, maLength)
rsiMA(tf) =>
src = close
rsi = ta.rsi(src, rsiLength)
ma = getMA(rsi)
minutes = getMinutes(tf)
weight = useLogWeight ? math.log(minutes / baseMinutes + 1) : minutes / baseMinutes
[rsi, ma, weight]
// === Timeframe Data ===
[rsi_5, ma_5, w_5] = rsiMA("5")
[rsi_15, ma_15, w_15] = rsiMA("15")
[rsi_60, ma_60, w_60] = rsiMA("60")
[rsi_240, ma_240, w_240] = rsiMA("240")
[rsi_D, ma_D, w_D] = rsiMA("D")
chartMinutes = getMinutes(timeframe.period)
autoSlopeFactor = math.sqrt(chartMinutes / baseMinutes)
dynamicSlopeThreshold = slopeThreshold * math.min(autoSlopeFactor, 2.0)
rsiChart = ta.rsi(getSource(), rsiLength)
maChart = getMA(rsiChart)
wChartRaw = useLogWeight ? math.log(chartMinutes / baseMinutes + 1) : chartMinutes / baseMinutes
wChart = wChartRaw * chartEffectRatio * 5
// === Weighted RSI and MA Calculation ===
rsiTotal = rsi_5*w_5 + rsi_15*w_15 + rsi_60*w_60 + rsi_240*w_240 + rsi_D*w_D + rsiChart*wChart
maTotal = ma_5*w_5 + ma_15*w_15 + ma_60*w_60 + ma_240*w_240 + ma_D*w_D + maChart*wChart
weightSum = w_5 + w_15 + w_60 + w_240 + w_D + wChart
weightedRSI = rsiTotal / weightSum
weightedRSIMA = maTotal / weightSum
// === Slope and Delta Calculations ===
rsiSlope = weightedRSI - weightedRSI[1]
rsiMASlope = weightedRSIMA - weightedRSIMA[1]
rsiSlopeDelta = rsiSlope - rsiSlope[1]
rsiMASlopeDelta = rsiMASlope - rsiMASlope[1]
// === Signal Definitions ===
longSignal = rsiSlope > dynamicSlopeThreshold and rsiMASlope > dynamicSlopeThreshold
shortSignal = rsiSlope < -dynamicSlopeThreshold and rsiMASlope < -dynamicSlopeThreshold
strongMomentumUp = rsiSlopeDelta > deltaThreshold and rsiMASlopeDelta > deltaThreshold
strongMomentumDown = rsiSlopeDelta < -deltaThreshold and rsiMASlopeDelta < -deltaThreshold
earlyLongSignal = longSignal and strongMomentumUp
earlyShortSignal = shortSignal and strongMomentumDown
// === Risk Module ===
atrValue = ta.atr(atrLength)
atrStop = math.max(atrValue * atrMultiplier, minATR)
tpDistance = atrStop * 1.5
// === Entry, TP, and SL ===
if (earlyLongSignal)
strategy.entry("Long", strategy.long)
strategy.exit("TP Long", from_entry="Long", limit=close + tpDistance)
strategy.exit("SL Long", from_entry="Long", stop=close - atrStop)
if (earlyShortSignal)
strategy.entry("Short", strategy.short)
strategy.exit("TP Short", from_entry="Short", limit=close - tpDistance)
strategy.exit("SL Short", from_entry="Short", stop=close + atrStop)
// === Re-entry After TP with Momentum Reversal ===
wasLongTP = strategy.opentrades == 0 and strategy.closedtrades > 0 and strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) == bar_index - 1
wasShortTP = strategy.opentrades == 0 and strategy.closedtrades > 0 and strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) == bar_index - 1
lastExitBar = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)
barsSinceTP = bar_index - lastExitBar
canReenter = barsSinceTP <= tpWindow
if (wasLongTP and earlyShortSignal and canReenter)
strategy.entry("Short After TP", strategy.short)
if (wasShortTP and earlyLongSignal and canReenter)
strategy.entry("Long After TP", strategy.long)
// === Plotting ===
plot(weightedRSI, color=color.orange, title="Weighted RSI")
plot(weightedRSIMA, color=color.blue, title="Weighted RSI MA")
plot(rsiSlope, title="RSI Slope", color=color.orange)
plot(rsiMASlope, title="RSI MA Slope", color=color.blue)
plot(rsiSlopeDelta, title="RSI Slope Delta", color=color.purple)
plot(rsiMASlopeDelta, title="RSI MA Slope Delta", color=color.fuchsia)
plotshape(earlyLongSignal, location=location.bottom, color=color.lime, style=shape.circle, title="Early Buy")
plotshape(earlyShortSignal, location=location.top, color=color.fuchsia, style=shape.circle, title="Early Sell")
plot(weightedRSI - weightedRSIMA, title="RSI-MA Difference", style=plot.style_columns, color=(weightedRSI - weightedRSIMA > 0 ? color.green : color.red))
momentumStrength = math.abs(rsiSlopeDelta + rsiMASlopeDelta)
bgcolor(momentumStrength > 0.2 ? color.new(color.green, 90) : momentumStrength < -0.2 ? color.new(color.red, 90) : na)
bgcolor(useHeikinAshi ? color.new(color.blue, 85) : na)