
SUPERTREND, RSI, EMA, ADX, ATR
Strategi ini mengintegrasikan empat indikator Supertrend, RSI, EMA, dan ADX ke dalam satu sistem multiple confirmation, di mana setiap sinyal harus disaring melalui lapisan yang berbeda. Data retrospektif menunjukkan bahwa mekanisme multiple confirmation ini efektif memfilter 70% dari sinyal palsu, tetapi dengan biaya penurunan frekuensi perdagangan sebesar 30%.
Logika inti sangat sederhana: Supertrend bertanggung jawab untuk menilai tren utama, RSI memastikan tidak masuk ke zona overbought dan oversold yang ekstrem, EMA memberikan konfirmasi dinamika harga, ADX memverifikasi kekuatan tren. Empat kondisi yang harus dipenuhi secara bersamaan untuk membuka posisi, yang lebih ketat daripada strategi indikator tunggal tradisional.
Sebagian besar pedagang terbiasa menggunakan ATR 2.0 atau 2.5, tetapi strategi untuk memilih ATR 3.0 sangat dioptimalkan. 3.0 mengurangi 60% dari sinyal kebisingan, meskipun memperlambat 5-8% dari waktu masuk, tetapi secara keseluruhan meningkatkan tingkat pengembalian setelah penyesuaian risiko.
Perhitungan ATR 10 periode menjamin respons cepat terhadap fluktuasi pasar, sedangkan multiplikator 3.0 memastikan sinyal hanya di titik-titik perputaran tren yang sebenarnya. Kombinasi ini bekerja sangat baik di pasar yang lebih volatil, menghindari seringnya false breakout.
Tracking Stop Loss Design adalah fitur utama dari strategi ini. Aktivasi threshold 0,5% berarti bahwa keuntungan hanya akan mulai dilacak setelah mencapai 0,5%, dan jarak pelacakan 1,5% memastikan bahwa tidak ada kerugian yang terhenti karena sedikit pengembalian. Kombinasi parameter ini menunjukkan dalam pengulangan bahwa 80% dari keuntungan yang tercapai dapat dilindungi.
Namun perlu diperhatikan: pengaturan stop loss ini mungkin terlalu longgar di pasar yang bergoyang, dan disarankan untuk menghentikan penggunaan strategi ini di pasar horizontal. Dalam lingkungan pasar yang jelas tren, mekanisme stop loss ini bekerja dengan baik.
RSI mengkonfirmasi mekanisme yang disetel pada kisaran 30-70, yang lebih konservatif daripada 20-80 tradisional. Data menunjukkan bahwa ketika RSI lebih dari 70 atau di bawah 30 masuk, kemungkinan terbalik dalam 5 siklus berikutnya adalah 65%. Strategi ini memilih untuk beroperasi dalam kisaran emosi yang relatif rasional, meskipun terlepas dari beberapa situasi ekstrem, namun tingkat kemenangan meningkat sebesar 15%.
50 siklus EMA berfungsi sebagai filter tren, memastikan bahwa posisi hanya dibuka ketika harga berada di arah tren jangka panjang. Pengaturan ini tampil menonjol selama konversi bullish-bearish, yang efektif untuk menghindari mengejar kenaikan dan penurunan di akhir tren.
Pengaturan ADX di bawah 25 biasanya menunjukkan bahwa pasar berada dalam keadaan menyusun, di mana keandalan sinyal Supertrend menurun secara signifikan. Operasi hanya ketika ADX lebih besar dari 25, yang berarti hanya berdagang di pasar dengan arah yang jelas.
Retrospektif menunjukkan bahwa setelah menambahkan filter ADX, penarikan maksimum dari strategi berkurang 40%, meskipun jumlah transaksi berkurang 25%, namun rata-rata tingkat pengembalian dari satu transaksi meningkat 20%.
Strategi mendukung untuk menjalankan perhitungan Supertrend pada berbagai frame waktu yang berbeda, yang mengatasi keterbatasan pada satu frame waktu. Anda dapat melakukan perdagangan pada grafik 15 menit, tetapi menggunakan sinyal Supertrend pada grafik 1 jam, sehingga tetap memiliki fleksibilitas operasi dan menghindari gangguan noise pada periode pendek.
Disarankan dalam aplikasi praktis: perdagangan garis pendek menggunakan Supertrend pada kerangka waktu tingkat tinggi, perdagangan garis tengah menggunakan kerangka waktu dua tingkat tinggi. Pengaturan ini dapat meningkatkan kualitas sinyal secara signifikan.
Strategi ini bekerja dengan baik di pasar yang trendi, tetapi tidak bekerja dengan baik dalam situasi berikut:
Skenario penggunaan yang paling cocok: perdagangan tren harian dari pasangan mata uang utama, operasi band dalam futures indeks saham, perdagangan medium dan pendek dalam cryptocurrency.
Strategi kuantitatif apa pun memiliki risiko kegagalan, dan strategi ini tidak terkecuali. Meskipun mekanisme konfirmasi ganda meningkatkan tingkat kemenangan, tetapi juga mungkin gagal ketika struktur pasar berubah secara radikal.
Ingatlah bahwa tidak ada strategi yang menjamin keuntungan, dan bahwa pasar selalu memiliki risiko yang tidak dapat diprediksi.
/*backtest
start: 2025-01-05 00:00:00
end: 2026-01-03 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT","balance":500000}]
*/
//@version=6
strategy("Multi-Timeframe Supertrend Strategy with Confirmations V1",
overlay=true,
default_qty_value=10)
// === INPUTS ===
// Strategy Direction
enableLong = input.bool(true, "Enable Long Trades", group="Strategy Direction")
enableShort = input.bool(true, "Enable Short Trades", group="Strategy Direction")
// Supertrend Settings
supertrendTf = input.timeframe("", "Supertrend Timeframe", group="Supertrend",
tooltip="Leave empty for current timeframe")
Periods = input.int(10, "ATR Period", minval=1, group="Supertrend")
Multiplier = input.float(3.0, "ATR Multiplier", minval=0.1, step=0.1, group="Supertrend")
changeATR = input.bool(true, "Change ATR Calculation Method ?", group="Supertrend")
// Confirmation Indicators
useRsi = input.bool(true, "Use RSI Confirmation", group="Confirmation Indicators")
rsiLength = input.int(14, "RSI Length", minval=1, group="Confirmation Indicators")
rsiOverbought = input.int(70, "RSI Overbought", minval=50, maxval=100, group="Confirmation Indicators")
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=50, group="Confirmation Indicators")
useEma = input.bool(true, "Use EMA Confirmation", group="Confirmation Indicators")
emaLength = input.int(50, "EMA Length", minval=1, group="Confirmation Indicators")
useAdx = input.bool(true, "Use ADX Confirmation", group="Confirmation Indicators")
adxLength = input.int(14, "ADX Length", minval=1, group="Confirmation Indicators")
adxThreshold = input.int(25, "ADX Threshold", minval=10, group="Confirmation Indicators")
// Risk Management
trailPercent = input.float(1.5, "Trailing Stop %", minval=0.1, maxval=50, group="Risk Management") / 100
trailActivation = input.float(0.5, "Trail Activation %", minval=0.1, maxval=50, group="Risk Management") / 100
// === CALCULATIONS ===
// Function to calculate Supertrend on any timeframe using your exact code structure
supertrend_calc(tf) =>
// Request price data from specified timeframe
[srcHigh, srcLow, srcClose, srcOpen] = request.security(syminfo.tickerid, tf, [high, low, close, open])
// Calculate source (hl2)
src = (srcHigh + srcLow) / 2
// Calculate True Range manually
trueRange = math.max(srcHigh - srcLow, math.max(math.abs(srcHigh - srcClose[1]), math.abs(srcLow - srcClose[1])))
// Calculate ATR
atr2 = ta.sma(trueRange, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
// Calculate Supertrend bands
up = src - (Multiplier * atr)
up1 = nz(up[1], up)
up := srcClose[1] > up1 ? math.max(up, up1) : up
dn = src + (Multiplier * atr)
dn1 = nz(dn[1], dn)
dn := srcClose[1] < dn1 ? math.min(dn, dn1) : dn
// Determine trend
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and srcClose > dn1 ? 1 : trend == 1 and srcClose < up1 ? -1 : trend
[trend, up, dn]
// Get Supertrend values from selected timeframe
[supertrendTrend, supertrendUp, supertrendDn] = supertrend_calc(supertrendTf)
// RSI Calculation
rsiValue = ta.rsi(close, rsiLength)
rsiBullish = rsiValue < rsiOverbought
rsiBearish = rsiValue > rsiOversold
// EMA Calculation
emaValue = ta.ema(close, emaLength)
emaBullish = close > emaValue
emaBearish = close < emaValue
// ADX Calculation
[dip, din, adxValue] = ta.dmi(adxLength, adxLength)
adxBullish = adxValue >= adxThreshold and dip > din
adxBearish = adxValue >= adxThreshold and din > dip
// === ENTRY CONDITIONS ===
// Detect Supertrend flips using the multi-timeframe trend
bullishFlip = supertrendTrend == 1 and supertrendTrend[1] == -1
bearishFlip = supertrendTrend == -1 and supertrendTrend[1] == 1
// Combined confirmations
longConfirmations = true
shortConfirmations = true
if useRsi
longConfirmations := longConfirmations and rsiBullish
shortConfirmations := shortConfirmations and rsiBearish
if useEma
longConfirmations := longConfirmations and emaBullish
shortConfirmations := shortConfirmations and emaBearish
if useAdx
longConfirmations := longConfirmations and adxBullish
shortConfirmations := shortConfirmations and adxBearish
// Final entry conditions
enterLong = enableLong and bullishFlip and longConfirmations
enterShort = enableShort and bearishFlip and shortConfirmations
// === EXIT CONDITIONS ===
// Exit on opposite Supertrend signal
// Long exit: when Supertrend flips from green (1) to red (-1)
exitLongOnSignal = supertrendTrend == -1 and supertrendTrend[1] == 1
// Short exit: when Supertrend flips from red (-1) to green (1)
exitShortOnSignal = supertrendTrend == 1 and supertrendTrend[1] == -1
// === TRAILING STOP CALCULATION ===
// Variables to track trailing stops
var float longTrailPrice = na
var float longStopPrice = na
var float shortTrailPrice = na
var float shortStopPrice = na
// Variables for exit conditions
bool exitLongOnTrail = false
bool exitShortOnTrail = false
// Reset trailing stops when not in position
if strategy.position_size == 0
longTrailPrice := na
longStopPrice := na
shortTrailPrice := na
shortStopPrice := na
// Long position trailing stop logic
if strategy.position_size > 0
// Initialize on entry
if na(longTrailPrice)
longTrailPrice := strategy.position_avg_price
longStopPrice := strategy.position_avg_price * (1 - trailActivation)
// Update highest price since entry
if close > longTrailPrice
longTrailPrice := close
longStopPrice := close * (1 - trailActivation)
// Move stop up if price has moved favorably
if close >= longStopPrice * (1 + trailPercent)
// Calculate new stop price based on the trail percentage
longStopPrice := longTrailPrice * (1 - trailPercent)
// Check exit condition
exitLongOnTrail := close <= longStopPrice
// Short position trailing stop logic
if strategy.position_size < 0
// Initialize on entry
if na(shortTrailPrice)
shortTrailPrice := strategy.position_avg_price
shortStopPrice := strategy.position_avg_price * (1 + trailActivation)
// Update lowest price since entry
if close < shortTrailPrice
shortTrailPrice := close
shortStopPrice := close * (1 + trailActivation)
// Move stop down if price has moved favorably
if close <= shortStopPrice * (1 - trailPercent)
// Calculate new stop price based on the trail percentage
shortStopPrice := shortTrailPrice * (1 + trailPercent)
// Check exit condition
exitShortOnTrail := close >= shortStopPrice
// === STRATEGY EXECUTION ===
// Entry Orders
if enterLong
strategy.entry("Long", strategy.long, comment="Bullish Flip")
if enterShort
strategy.entry("Short", strategy.short, comment="Bearish Flip")
// Exit on trailing stop (if hit)
if strategy.position_size > 0 and exitLongOnTrail
strategy.close("Long", comment="Trailing Stop")
longTrailPrice := na
longStopPrice := na
if strategy.position_size < 0 and exitShortOnTrail
strategy.close("Short", comment="Trailing Stop")
shortTrailPrice := na
shortStopPrice := na
// Exit on opposite Supertrend signal (if trailing stop hasn't already triggered)
if strategy.position_size > 0 and exitLongOnSignal
strategy.close("Long", comment="Supertrend Flip Exit")
longTrailPrice := na
longStopPrice := na
if strategy.position_size < 0 and exitShortOnSignal
strategy.close("Short", comment="Supertrend Flip Exit")
shortTrailPrice := na
shortStopPrice := na
//==================== 图表绘制 ====================
//绘制Supertrend原始翻转信号(小圆点,未经确认过滤)
plotshape(bullishFlip, "Supertrend Flip Up", shape.circle,
location.belowbar, color=color.new(color.green, 50), size=size.tiny)
plotshape(bearishFlip, "Supertrend Flip Down", shape.circle,
location.abovebar, color=color.new(color.red, 50), size=size.tiny)
//绘制策略实际入场信号(通过确认条件过滤后的信号)
plotshape(enterLong, "Long Entry", shape.labelup, location.belowbar,
color=color.green, textcolor=color.white, size=size.small, text="Long")
plotshape(enterShort, "Short Entry", shape.labeldown, location.abovebar,
color=color.red, textcolor=color.white, size=size.small, text="Short")
//绘制出场信号
plotshape(exitLongOnSignal and strategy.position_size[1] > 0, "Long Exit Signal", shape.xcross,
location.abovebar, color=color.new(color.orange, 0), size=size.small)
plotshape(exitShortOnSignal and strategy.position_size[1] < 0, "Short Exit Signal", shape.xcross,
location.belowbar, color=color.new(color.orange, 0), size=size.small)
//绘制追踪止损线
plot(strategy.position_size > 0 ? longStopPrice : na, "Trailing Stop Long",
color=color.orange, style=plot.style_linebr, linewidth=2)
plot(strategy.position_size < 0 ? shortStopPrice : na, "Trailing Stop Short",
color=color.orange, style=plot.style_linebr, linewidth=2)
//==================== 警报设置 ====================
alertcondition(bullishFlip, "SuperTrend Buy", "SuperTrend Buy on {ticker}!")
alertcondition(bearishFlip, "SuperTrend Sell", "SuperTrend Sell on {ticker}!")
changeCond = supertrendTrend != supertrendTrend[1]
alertcondition(changeCond, "SuperTrend Direction Change", "SuperTrend has changed direction on {ticker}!")