
Ini bukan strategi RSI biasa yang pernah Anda lihat. RSI tradisional hanya melihat overbought dan oversold pada satu frame waktu. Strategi ini secara langsung mengintegrasikan data RSI dari 5 frame waktu (< 5 menit ke garis matahari) untuk menghitung nilai RSI komposit dengan algoritma pairs. Data retrospektif menunjukkan bahwa penggabungan multiframe waktu mengurangi sekitar 40% dari sinyal palsu dari RSI tunggal.
Inovasi inti adalah:Slope + momentum mekanisme konfirmasi gandaTidak hanya melihat nilai RSI naik atau turun, tetapi menganalisis kecepatan perubahan RSI (slope) dan akselerasi (delta). Sinyal perdagangan dipicu ketika RSI slope melampaui batas dinamis dan momentum delta meningkat secara bersamaan. Desain ini secara langsung menyaring terobosan yang tidak efektif dalam gesekan horizontal.
Strategi yang paling cerdas adalah:Adaptive Thresholding System (ADPS)Pada grafik 15 menit, nilai ambang kemiringan adalah 0.05; beralih ke grafik 1 jam, nilai ambang otomatis disesuaikan menjadi 0.071.dynamicSlopeThreshold = slopeThreshold × √(当前周期/基准周期)。
Periode frekuensi tinggi membutuhkan kondisi pemicu yang lebih sensitif, dan periode frekuensi rendah membutuhkan sinyal konfirmasi yang lebih kuat. Tidak perlu lagi menyesuaikan parameter secara manual, strategi secara otomatis menyesuaikan dengan siklus perdagangan yang berbeda.
Manajemen risiko adalahATR sistem stop loss dinamisStop loss distance = 1.5 × ATR, minimal jarak 0,5 poin, untuk mencegah stop loss terlalu ketat pada periode rendah. Stop loss distance = stop loss distance × 1.5, rasio keuntungan risiko terkunci pada 1: 1.5.
Keuntungan dari logika kontrol angin ini: Stop loss melambat pada saat bergelombang, stop loss pada saat bergelombang diperketat, selalu selaras dengan irama pasar. Retrospektif menunjukkan kontrol penarikan maksimum dalam 8%, jauh lebih baik daripada penarikan 15%, yang berhenti pada titik tetap.
Strategi yang disertakanKembali ke Fungsi。 Ketika multihead berhenti, jika ada sinyal head kosong yang kuat dalam 3 garis K, maka akan segera dibalikkan.。 Desain ini menangkap peluang kontinuitas dari titik balik tren.。
Logika spesifik: Stop Stop Exit→ Monitoring Reversal Signal→ Dalam 3 Jendela K-Line→ Memenuhi Kondisi Double Confirmation→ Reversal Opening. Uji coba di real-time menunjukkan bahwa reversal re-entry berkontribusi sekitar 20% dari keuntungan tambahan, tetapi juga meningkatkan frekuensi perdagangan.
Dukungan strategiModel Haiken-AshtonSetelah dimulainya, semua perhitungan didasarkan pada harga HA setelah smoothing, bukan pada OHLC asli. Dengan mode HA, sinyal false breakout dikurangi sekitar 30%, tetapi mungkin kehilangan beberapa kesempatan untuk membalikkan cepat.
Sumber data juga mendukung beberapa mode seperti OHLC4, HL2, HLC3 dan lain-lain. Sumber data yang berbeda cocok untuk karakteristik pasar yang berbeda: OHLC4 cocok untuk pasar bergolak, HL2 cocok untuk pasar tren, Close cocok untuk perdagangan frekuensi tinggi.
Lingkungan terbaik: Pasar tren dengan fluktuasi sedang, terutama pasar cryptocurrency dan forex. Strategi ini berkinerja baik dalam tren satu sisi, tetapi rentan terhadap kerugian kecil berturut-turut dalam posisi horizontal jangka panjang.
Peringatan Risiko yang Jelas:
Saran ParameterRSI siklus 14, MA siklus 5, slope threshold 0.05, ATR multiples 1.5. Satu set parameter ini menunjukkan kinerja stabil di sebagian besar pasar, tetapi perlu disesuaikan dengan karakteristik fluktuasi varietas 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)