Strategi Twin Range Filter adalah strategi perdagangan berdasarkan turun naik harga. Ia menggunakan dua penunjuk julat purata dengan tetapan parameter yang berbeza, digabungkan dengan hubungan antara harga dan julat, untuk menjana isyarat perdagangan. Strategi ini sesuai untuk aset digital yang sangat tidak menentu seperti Bitcoin.
Strategi ini menggunakan dua penunjuk julat licin dengan panjang tempoh yang berbeza: penunjuk julat cepat (periode lalai 27) dan penunjuk julat perlahan (periode lalai 55).
Strategi Penapis Jangkitan Kembar membandingkan harga dengan kedua-dua penunjuk jangkitan untuk menentukan sama ada ia berada dalam jangkitan goyangan tertentu. Isyarat perdagangan dihasilkan apabila harga memecahkan jangkitan goyangan ini.
Secara khusus, strategi ini menggunakan garis median sebagai penanda aras, yang merupakan purata dua penunjuk julat. Isyarat panjang dihasilkan apabila harga berada di atas garis median dengan satu julat cepat; isyarat pendek dihasilkan apabila harga jatuh di bawah garis median dengan satu julat cepat.
Untuk menapis isyarat palsu, ia juga menambah syarat: isyarat hanya dihasilkan apabila pergerakan harga semasa konsisten dengan tempoh sebelumnya.
Ringkasnya, strategi ini mengenal pasti julat goyangan dengan penunjuk julat kembar, dan menghasilkan pesanan apabila harga memecahkan julat. penapis arah harga ditambah untuk mengurangkan isyarat palsu.
Kelebihan strategi Penapis Jarak Kembar:
Menggunakan ciri-ciri turun naik harga, dapat disesuaikan dengan aset yang sangat turun naik seperti Bitcoin.
Penunjuk julat kembar mengandungi kerangka masa yang berbeza. yang cepat menangkap peluang jangka pendek, manakala yang lambat mempertimbangkan trend jangka panjang.
Menambah penapis arah harga mengurangkan isyarat palsu dari turun naik jangka pendek.
Logik yang mudah dan jelas, mudah difahami dan dilaksanakan, sesuai untuk perdagangan algo.
Beberapa risiko strategi untuk diperhatikan:
Bergantung pada penunjuk turun naik, mungkin kurang berprestasi dalam persekitaran turun naik rendah.
Parameter julat perlu dioptimumkan untuk produk yang berbeza, jika tidak peluang perdagangan mungkin terlepas atau isyarat palsu berlaku.
Perbezaan antara harga dan turun naik tidak dipertimbangkan. Isyarat palsu mungkin berlaku jika turun naik meningkat tanpa kenaikan harga yang sepadan.
Tahap stop loss mungkin perlu diselaraskan dalam persekitaran turun naik yang tinggi.
Strategi ini boleh ditingkatkan dalam beberapa aspek:
Uji dan optimumkan parameter julat untuk mencari kombinasi optimum untuk produk dan jangka masa yang berbeza.
Tambahkan mekanisme stop loss dinamik berdasarkan turun naik baru-baru ini, untuk mengoptimumkan strategi stop loss.
Tambah penapis berdasarkan perbezaan turun naik harga untuk mengelakkan isyarat palsu.
Menggabungkan penunjuk lain seperti perubahan jumlah untuk meningkatkan kepastian kemasukan.
Uji dan tambahkan mekanisme keluar keuntungan yang sesuai yang sesuai dengan strategi.
Secara keseluruhan, Penapis Jangkitan Kembar adalah strategi perdagangan yang berkesan untuk aset yang sangat tidak menentu. Ia menggunakan ciri-ciri turun naik harga dengan baik dan menghasilkan logika perdagangan yang mudah dan jelas. Dengan penambahbaikan lanjut seperti pengoptimuman parameter dan pengurusan risiko, ia boleh menjadi komponen yang berharga dalam sistem perdagangan kuant. Ia juga memberikan pandangan tentang perdagangan algoritma berdasarkan ciri-ciri turun naik pasaran.
/*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")