
Ini bukan strategi RSI biasa yang anda lihat. RSI tradisional hanya melihat satu bingkai masa yang terlalu banyak membeli dan terlalu banyak menjual. Strategi ini menggabungkan data RSI secara langsung dari 5 bingkai masa (~ 5 minit ke matahari) untuk mengira nilai RSI komposit dengan algoritma berat pasangan.
Inovasi utama ialah:Kerangka pengesahan dua kali pantulan + momentumBukan sekadar melihat nilai RSI naik atau turun, tetapi menganalisis kelajuan perubahan RSI (slope) dan percepatan (delta). Isyarat perdagangan dicetuskan apabila slope RSI melebihi had dinamik dan delta momentum meningkat secara serentak. Reka bentuk ini terus menyaring penembusan yang tidak berkesan dalam goyah melintang.
Di mana strategi yang paling bijak ialah:Sistem penyesuaian。 Pada carta 15 minit, paras kemerosotan adalah 0.05; beralih ke carta 1 jam, paras kemerosotan disesuaikan secara automatik kepada 0.071 。 Rumus pengiraan:dynamicSlopeThreshold = slopeThreshold × √(当前周期/基准周期)。
Apakah maksudnya? Siklus frekuensi tinggi memerlukan keadaan pemicu yang lebih sensitif, dan siklus frekuensi rendah memerlukan isyarat pengesahan yang lebih kuat. Tidak perlu lagi menyesuaikan parameter secara manual, strategi secara automatik menyesuaikan diri dengan tempoh perdagangan yang berbeza.
Pengurusan risiko adalahSistem Hentikan Kerosakan Dinamik ATRJarak henti = 1.5 × ATR, jarak minimum 0.5 titik, untuk mengelakkan henti terlalu ketat pada masa turun naik rendah. Jarak henti = jarak henti × 1.5, nisbah keuntungan risiko dikunci pada 1: 1.5.
Kelebihan logik kawalan angin ini: Pendahuluan hentian kerugian semasa turun naik, pengetatan hentian kerugian semasa turun naik, sentiasa selaras dengan irama pasaran. Ujian semula menunjukkan bahawa kawalan penarikan balik maksimum adalah dalam 8%, jauh lebih baik daripada penarikan balik 15% dari hentian kerugian dengan bilangan titik tetap.
Strategi yang mengandungiKembali ke Fungsi❚ Apabila berhenti berbilang kepala, jika terdapat isyarat kepala kosong yang kuat dalam 3 garis K, segera kembali ke arah terbuka. ❚ Reka bentuk ini menangkap peluang kesinambungan titik perubahan trend.
Logik khusus: Keluar dari penangguhan → memantau isyarat pembalikan→ dalam 3 tetingkap K-line→ memenuhi syarat pengesahan berganda→ membuka kedudukan terbalik. Ujian cakera keras menunjukkan bahawa pembalikan masuk kembali menyumbang kira-kira 20% pendapatan tambahan, tetapi juga meningkatkan frekuensi perdagangan.
Sokongan strategiModen Haiken-AshtonSelepas dimulakan, semua pengiraan adalah berdasarkan harga HA selepas meluruskan, dan bukannya OHLC asal. Dalam mod HA, isyarat pecah palsu dikurangkan sebanyak 30%, tetapi mungkin terlepas beberapa peluang untuk berbalik dengan cepat.
Sumber data juga menyokong pelbagai model seperti OHLC4, HL2, HLC3 dan lain-lain. Sumber data yang berbeza sesuai dengan ciri pasaran yang berbeza: OHLC4 sesuai untuk pasaran yang bergolak, HL2 sesuai untuk pasaran yang sedang tren, Dekat sesuai untuk perdagangan frekuensi tinggi.
Persekitaran yang sesuaiPasaran trend yang bergelombang sederhana, terutamanya cryptocurrency dan pasaran forex. Strategi ini berprestasi dalam trend unilateral, tetapi mudah mengalami kerugian kecil berturut-turut dalam jangka masa yang panjang.
Amaran risiko yang jelas:
Cadangan parameter: RSI tempoh 14, MA tempoh 5, slope 0.05, ATR kelipatan 1.5. . Kumpulan parameter ini menunjukkan prestasi yang stabil di kebanyakan pasaran, tetapi perlu disesuaikan dengan ciri-ciri turun naik dalam jenis tertentu.
/*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)