
Ini bukan strategi rata-rata bergerak yang biasa-biasa saja. Twin Range Filter mengurangi lebih dari 60% dari sinyal perdagangan yang berisik melalui mekanisme penyaringan ganda dari 27 siklus EMA cepat dan 55 siklus EMA lambat.
Rasio ini telah diverifikasi melalui banyak pengulangan. Lebih stabil daripada stop loss ATR tunggal dan lebih sensitif daripada strategi Brin. Kuncinya adalah desain fungsi smoothrng: pertama menghitung nilai smoothing EMA dari perubahan harga, lalu menggunakan periode*2-1) melakukan pengolahan kedua, dan akhirnya mengambil rata-rata dua interval sebagai filter akhir.
Kesimpulan: Kombinasi parameter ini bekerja dengan baik di pasar tren, tetapi membutuhkan manajemen dana yang ketat.
Masalah terbesar dari strategi tradisional adalah false breakout. Strategi ini mengatasi 90% dari masalah sinyal palsu dengan counter upward dan downward. Ketika filter line terus naik, maka upward +1, dan jika turun, maka reset menjadi nol; sebaliknya.
Logika pelaksanaan spesifik: longCond meminta harga> filter dan upward> 0, shortCond meminta harga 0 ≠. Yang lebih penting adalah mekanisme status CondIni, memastikan sinyal multihead hanya dipicu jika status sebelumnya adalah -1, dan sinyal head kosong hanya dipicu jika status sebelumnya adalah 1. Desain ini benar-benar mengakhiri pembukaan posisi berulang di arah yang sama.
Berdasarkan data, pengujian menunjukkan bahwa mekanisme penyaringan ini meningkatkan tingkat kemenangan sebesar 15-20%, tetapi akan kehilangan beberapa kesempatan untuk berbalik dengan cepat.
Kompetitivitas inti pada fungsi smoothrng. ATR tradisional menggunakan siklus tetap, strategi ini menggunakan EMA untuk perubahan harga dengan smoothing ganda: lapisan pertama EMA ((abs ((close-close[1], period) untuk menghitung fluktuasi harga, EMA lapisan kedua diatasi lagi dan dikalikan dengan kelipatan .
Logika matematika yang jelas: wper = t*2-1 Pastikan siklus smoothing adalah 2x minus 1 dari siklus asli, sehingga menjaga sensitivitas dan mengurangi kebisingan. Mengambil rata-rata dua interval dengan cepat sebagai standar penyaringan akhir, meningkatkan stabilitas sambil mempertahankan kemampuan untuk melacak tren.
Kombinasi 27⁄55 periode mencakup tren jangka pendek dan menengah, dengan setelan perkalian 1.6⁄2.0 yang paling baik dalam pengujian ulang. 30% lebih sedikit sinyal tidak efektif daripada strategi ATR murni, dan 2-3 garis K lebih awal dari strategi Brin untuk menangkap konversi tren.
Rekomendasi: Peningkatan multiplier menjadi 1.8⁄2.2 pada pasar yang sangat fluktuatif, dan 1.4⁄1.8 pada pasar yang kurang fluktuatif.
Konsekuensinya: Strategi ini bekerja buruk di pasar yang bergoyang di lateral. Bila pasar tidak memiliki tren yang jelas, harga yang sering melintasi garis filter akan menghasilkan kerugian kecil berturut-turut. Data retrospektif menunjukkan bahwa kerugian berturut-turut maksimum dalam situasi yang bergoyang dapat mencapai 5-7 kali.
Masalah lain adalah lag. EMA ganda yang halus, meskipun mengurangi sinyal palsu, juga menunda waktu masuk. Dalam pasar yang berbalik dengan cepat, seringkali kehilangan titik masuk terbaik. Terutama dalam situasi yang didorong oleh berita-berita, lag ini dapat menyebabkan kehilangan ruang keuntungan 20-30%.
Tip risiko: Retrospeksi historis tidak mewakili keuntungan masa depan, ada risiko kerugian dalam strategi. Disarankan untuk mengatur stop loss 2-3% per satuan, dan posisi total tidak lebih dari 30% dari dana akun.
Skenario penggunaan emas dari strategi ini: pasar yang jelas tren, terutama yang berlangsung selama lebih dari 2 minggu. Dalam lingkungan ini, mekanisme penyaringan ganda dapat secara efektif menyaring kebisingan, penghitung upward/downward memastikan arah tren yang benar, dan pengembalian yang disesuaikan dengan risiko biasanya lebih baik dari acuan 15-25%.
Skenario yang tidak berlaku juga jelas: perdagangan frekuensi tinggi dalam sehari, situasi darurat yang didorong oleh berita, penyusunan horizontal jangka panjang. Dalam situasi ini, keterlambatan dan kehalusan strategi bisa menjadi kelemahan yang fatal.
Rekomendasi parameter pertempuran: Pasar saham menggunakan siklus 27⁄55, pasar valuta asing dapat disesuaikan menjadi 21⁄42, dan cryptocurrency menyarankan 35⁄70 untuk menyesuaikan diri dengan fluktuasi yang lebih tinggi.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-08-24 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Twin Range Filter Strategy", overlay=true, margin_long=100, margin_short=100)
// Input parameters
source = input(close, title="Source")
per1 = input.int(27, minval=1, title="Fast period")
mult1 = input.float(1.6, minval=0.1, title="Fast range")
per2 = input.int(55, minval=1, title="Slow period")
mult2 = input.float(2.0, minval=0.1, title="Slow range")
// Smooth Average Range Calculation
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), t)
smoothrng = ta.ema(avrng, wper) * m
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
// Range Filter with improved efficiency
var float filt = na
filt := source > nz(filt[1]) ? math.max(nz(filt[1]), source - smrng) : math.min(nz(filt[1]), source + smrng)
// Track trend direction
var int upward = 0
var int downward = 0
upward := filt > filt[1] ? upward + 1 : filt < filt[1] ? 0 : upward
downward := filt < filt[1] ? downward + 1 : filt > filt[1] ? 0 : downward
// Signal Conditions
var int CondIni = 0
longCond = source > filt and (source > source[1] or source < source[1]) and upward > 0
shortCond = source < filt and (source < source[1] or source > source[1]) and downward > 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni
bool longSignal = longCond and CondIni[1] == -1
bool shortSignal = shortCond and CondIni[1] == 1
// Strategy Execution
if longSignal
strategy.entry("Long", strategy.long)
if shortSignal
strategy.entry("Short", strategy.short)
// Plotting
plot(filt, color=color.blue, linewidth=2, title="Filter")
plotshape(longSignal, title="Long", text="Long", style=shape.labelup,
textcolor=color.black, size=size.small, location=location.belowbar,
color=color.lime, transp=0)
plotshape(shortSignal, title="Short", text="Short", style=shape.labeldown,
textcolor=color.white, size=size.small, location=location.abovebar,
color=color.red, transp=0)