
Esta não é uma estratégia de RSI comum que você já viu. A estratégia tradicional de RSI só olha para o overbought/oversold de um único período de tempo. Esta estratégia integra diretamente os dados de RSI de 5 períodos de tempo (de 5 minutos para o sol) e calcula o valor de RSI integrado com o algoritmo de pesos pares. Os dados de retrospectiva mostram que a fusão de vários períodos de tempo tem cerca de 40% menos sinais falsos do que o RSI único.
A inovação central é:Mecanismo de dupla confirmação de inclinação + potênciaEm vez de simplesmente ver o valor do RSI em alta ou baixa, analisa a velocidade de mudança do RSI (a inclinação) e a aceleração (a delta). O sinal de negociação é acionado quando a inclinação do RSI excede o limiar dinâmico e o delta do momentum aumenta simultaneamente.
A estratégia mais inteligente é:Sistemas adaptativos de redução❚ No gráfico de 15 minutos, a inclinação é de 0,05; quando se muda para o gráfico de 1 hora, a inclinação é automaticamente ajustada para 0,071 ❚ Fórmula de cálculo:dynamicSlopeThreshold = slopeThreshold × √(当前周期/基准周期)。
O que isso significa? Ciclos de alta frequência requerem condições de disparo mais sensíveis, ciclos de baixa frequência requerem sinais de confirmação mais fortes. Não há mais necessidade de ajustes manuais de parâmetros, a estratégia se adapta automaticamente a diferentes ciclos de negociação.
A gestão de riscos éATR sistema de parada de danosA distância de parada = 1.5 × ATR, a distância mínima é de 0,5 pontos, para evitar que a parada fique muito apertada durante os períodos de baixa volatilidade. A distância de parada = distância de parada × 1.5, a relação de risco / ganho é bloqueada em 1: 1.5.
Os benefícios dessa lógica de controle de vento: a flexibilidade de parada de perda durante a maior parte da onda e o aperto de parada de perda durante a hora de onda, sempre em sincronia com o ritmo do mercado. A retrospectiva mostra que o controle de retração máxima está dentro de 8%, muito melhor do que a retração de 15% da parada de perda em pontos fixos.
Estratégia incluídaInteligência reverte para funçãoQuando o multi-cabeça pára, se um sinal de cabeçalho forte dentro de 3 linhas K, imediatamente inverter o vazio. Este design captura a oportunidade de continuidade do ponto de viragem da tendência.
Lógica específica: paralisação de saída→ monitorar o sinal de reversão→ dentro da janela de 3 linhas K→ satisfazer a condição de dupla confirmação→ abrir posição de reversão. Os testes em disco rígido mostraram que a reversão de reentrada contribuiu com cerca de 20% de receita adicional, mas também aumentou a frequência de negociação.
Apoio estratégicoModelo do mapa de Haiken e AshDepois de ligado, todos os cálculos são baseados no preço do HA após o suavização, e não no original OHLC. No modo HA, o falso sinal de ruptura é reduzido em cerca de 30%, mas é possível perder algumas oportunidades de reversão rápida.
A fonte de dados também suporta vários modos, como OHLC4, HL2 e HLC3. Diferentes fontes de dados são adequadas para diferentes características do mercado: OHLC4 é adequado para mercados de turbulência, HL2 é adequado para mercados de tendência e Close é adequado para negociações de alta frequência.
O melhor ambiente para issoMercados de tendência com moderada volatilidade, especialmente os mercados de criptomoedas e de divisas. A estratégia tem um bom desempenho em tendências unilaterais, mas é suscetível a pequenas perdas consecutivas em correntes horizontais de longo prazo.
Alerta de risco clara:
Recomendações de parâmetrosO conjunto de parâmetros mostra um desempenho estável na maioria dos mercados, mas precisa ser ajustado de acordo com as características de flutuação de cada tipo específico.
/*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)