Strategi Twin Range Filter adalah strategi perdagangan yang didasarkan pada volatilitas harga. Strategi ini memanfaatkan dua indikator rentang rata-rata dengan pengaturan parameter yang berbeda, dikombinasikan dengan hubungan antara harga dan rentang, untuk menghasilkan sinyal perdagangan.
Strategi ini menggunakan dua indikator kisaran halus dengan panjang periode yang berbeda: indikator kisaran cepat (periode default 27) dan indikator kisaran lambat (periode default 55).
Strategi Twin Range Filter membandingkan harga dengan dua indikator kisaran untuk menentukan apakah saat ini berada dalam kisaran osilasi tertentu.
Secara khusus, strategi ini menggunakan garis median sebagai patokan, yang merupakan rata-rata dari dua indikator kisaran. Sinyal panjang dihasilkan ketika harga berada di atas garis median dengan satu kisaran cepat; sinyal pendek dihasilkan ketika harga jatuh di bawah garis median dengan satu kisaran cepat.
Untuk menyaring sinyal palsu, ia juga menambahkan kondisi: sinyal hanya dihasilkan ketika pergerakan harga saat ini konsisten dengan periode sebelumnya.
Singkatnya, strategi ini mengidentifikasi kisaran osilasi dengan indikator kisaran kembar, dan menghasilkan pesanan ketika harga menembus kisaran. Filter arah harga ditambahkan untuk mengurangi sinyal palsu.
Keuntungan dari strategi Twin Range Filter:
Menggunakan fitur volatilitas harga, dapat beradaptasi dengan aset yang sangat fluktuatif seperti Bitcoin.
Indikator range kembar mengandung kerangka waktu yang berbeda. yang cepat menangkap peluang jangka pendek, sementara yang lambat mempertimbangkan tren jangka panjang.
Menambahkan filter arah harga mengurangi sinyal palsu dari fluktuasi jangka pendek.
Logika yang sederhana dan jelas, mudah dipahami dan diimplementasikan, cocok untuk perdagangan algo.
Beberapa risiko strategi untuk dicatat:
Bergantung pada indikator volatilitas, mungkin berkinerja buruk dalam lingkungan volatilitas rendah.
Parameter rentang harus dioptimalkan untuk produk yang berbeda, jika tidak, peluang perdagangan mungkin terlewatkan atau sinyal palsu terjadi.
Perbedaan antara harga dan volatilitas tidak dipertimbangkan. Sinyal palsu dapat terjadi jika volatilitas meningkat tanpa kenaikan harga yang sesuai.
Tingkat stop loss mungkin perlu disesuaikan dalam lingkungan volatilitas tinggi. Stop terlalu ketat menyebabkan stop out yang berlebihan.
Strategi ini dapat ditingkatkan dalam beberapa aspek:
Uji dan optimalkan parameter rentang untuk menemukan kombinasi optimal untuk produk dan kerangka waktu yang berbeda.
Tambahkan mekanisme stop loss dinamis berdasarkan volatilitas baru-baru ini, untuk mengoptimalkan strategi stop loss.
Tambahkan filter berdasarkan divergensi volatilitas harga untuk menghindari sinyal palsu.
Masukkan indikator lain seperti perubahan volume untuk meningkatkan kepastian masuk.
Uji dan tambahkan mekanisme keluar mengambil keuntungan yang sesuai yang sesuai dengan strategi.
Secara keseluruhan, Twin Range Filter adalah strategi perdagangan yang efektif untuk aset yang sangat fluktuatif. Ini memanfaatkan karakteristik volatilitas harga dengan baik dan menghasilkan logika perdagangan yang sederhana dan jelas. Dengan peningkatan lebih lanjut seperti optimasi parameter dan manajemen risiko, ini dapat menjadi komponen yang berharga dalam sistem perdagangan kuantitatif. Ini juga memberikan wawasan tentang perdagangan algoritmik berdasarkan fitur volatilitas pasar.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-12 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © colinmck, greenmask9 //@version=4 strategy(title="Twin Range Filter Algo", overlay=true) source = input(defval=close, title="Source") // Smooth Average Range per1 = input(defval=27, minval=1, title="Fast period") mult1 = input(defval=1.6, minval=0.1, title="Fast range") per2 = input(defval=55, minval=1, title="Slow period") mult2 = input(defval=2, minval=0.1, title="Slow range") smoothrng(x, t, m) => wper = t * 2 - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper) * m smoothrng smrng1 = smoothrng(source, per1, mult1) smrng2 = smoothrng(source, per2, mult2) smrng = (smrng1 + smrng2) / 2 // Range Filter rngfilt(x, r) => rngfilt = x rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r rngfilt filt = rngfilt(source, smrng) upward = 0.0 upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1]) downward = 0.0 downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1]) hband = filt + smrng lband = filt - smrng longCond = bool(na) shortCond = bool(na) longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0 shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] long = longCond and CondIni[1] == -1 short = shortCond and CondIni[1] == 1 // Plotting // Strategy // From this part on, programmer is greenmaks9 // Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false) disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false) //second l2 = input(title="ATR1", defval=32, minval=1) s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"]) atr2(source, l2) => if s2 == "SMA" sma(source, l2) else if s2 == "RMA" rma(source, l2) else if s2 == "EMA" ema(source, l2) else wma(source, l2) //third l3 = input(title="ATR2", defval=64, minval=1) s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"]) atr3(source, l3) => if s3 == "RMA" rma(source, l3) else if s3 == "SMA" sma(source, l3) else if s3 == "EMA" ema(source, l3) else wma(source, l3) atr20=atr2(tr(true), l2) atr30=atr3(tr(true), l3) strategy.initial_capital = 50000 ordersize=floor(strategy.initial_capital/close) profit = input(title="Ticks profit", type=input.integer, defval=900) stop = input(title="Ticks stoploss", type=input.integer, defval=300) maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17) bull = long and (atr20<atr30 or disabler) bear = short and (atr20<atr30 or disabler) bullclock = barssince(bull) bearclock = barssince(bear) if (bull) strategy.entry("Twin Long", strategy.long, ordersize) strategy.exit("Exit", from_entry = "Twin Long", profit = profit, loss = stop) if (bear) strategy.entry("Twin Short", strategy.short, ordersize) strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop) //time stoploss strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out") strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")