Strategi ini menjana rentang harga berdasarkan turun naik harga yang halus, dan menghasilkan isyarat perdagangan apabila harga menembusi rentang.
Strategi ini mula-mula mengira julat turun naik purata harga dalam tempoh tertentu, kemudian meratakan julat turun naik menggunakan purata bergerak eksponensial untuk menjana turun naik yang merata. Volatiliti yang merata dikalikan dengan pekali memberikan julat jalur. Apabila harga melanggar band atas, isyarat beli dihasilkan. Apabila harga melanggar band bawah, isyarat jual dihasilkan.
Khususnya, slmng turun naik yang dihaluskan dikira oleh fungsi smoothhrng. Band hband atas dan band lband bawah band harga kemudian dikira berdasarkan slmng. Syarat panjang longCondition dan syarat pendek shortCondition ditubuhkan berdasarkan itu. Apabila longCondition dipenuhi, isyarat beli dihasilkan. Apabila shortCondition dipenuhi, isyarat jual dihasilkan.
Kelebihan strategi ini ialah:
Menggunakan turun naik harga untuk membina isyarat perdagangan dapat dengan berkesan mengesan perubahan pasaran.
Penghapusan turun naik dengan purata bergerak eksponensial boleh menapis bunyi bising dan menjana isyarat perdagangan yang lebih boleh dipercayai.
Julat rentang boleh diselaraskan melalui pekali turun naik, menjadikan strategi lebih fleksibel.
Digabungkan dengan penghakiman pecah, ia boleh menangkap peluang perdagangan tepat pada masanya apabila pembalikan trend berlaku.
Terdapat juga beberapa risiko dalam strategi ini:
Dalam turun naik pasaran yang tidak normal, turun naik yang dihaluskan mungkin tidak mencerminkan turun naik sebenar dengan tepat, yang membawa kepada isyarat yang salah. Parameter boleh dioptimumkan untuk meningkatkan model.
Tetapan julat band yang tidak betul boleh menyebabkan overtrading atau isyarat yang tidak mencukupi. Parameter yang berbeza boleh diuji untuk mencari julat yang optimum.
Terdapat kelewatan masa dalam isyarat breakout, yang boleh menyebabkan kemasukan awal atau kemasukan lewat.
Strategi ini boleh dioptimumkan melalui:
Ujian kitaran data harga yang berbeza untuk mencari tempoh yang paling sesuai untuk mengira turun naik.
Mencuba algoritma purata bergerak yang berbeza seperti purata bergerak yang ditimbang.
Memperkenalkan jumlah dagangan atau penunjuk lain untuk mengesahkan isyarat pecah.
Menetapkan stop loss atau trailing stop untuk mengawal kerugian setiap perdagangan.
Mengoptimumkan pelbagai pekali turun naik untuk menentukan julat jalur yang optimum.
Logik keseluruhan strategi ini adalah jelas, menggunakan turun naik harga untuk membina jalur dan harga pecah untuk menjana isyarat perdagangan, yang boleh dengan berkesan mengesan perubahan trend pasaran.
/*backtest start: 2023-01-22 00:00:00 end: 2024-01-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true) // Source src = input(defval=close, title="Source") // Sampling Period per = input(defval=100, minval=1, title="Sampling Period") // Range Multiplier mult = input(defval=3.0, minval=0.1, title="Range Multiplier") // Smooth Average Range smoothrng(x, t, m) => wper = (t * 2) - 1 avrng = ema(abs(x - x[1]), t) smoothrng = ema(avrng, wper) * m smoothrng smrng = smoothrng(src, per, mult) // 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(src, smrng) // Filter Direction 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]) // Target Bands hband = filt + smrng lband = filt - smrng // Breakouts longCondition = (src > filt) and (src > src[1]) and (upward > 0) shortCondition = (src < filt) and (src < src[1]) and (downward > 0) strategy.entry("Buy", strategy.long, when = longCondition) strategy.entry("Sell", strategy.short, when = shortCondition) // Plotting plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter") hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target") lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target") // Fills fill(hbandplot, lbandplot, color=color.aqua, title="Target Range") // Bar Color barcolor(longCondition ? color.green : shortCondition ? color.red : na) // Alerts alertcondition(longCondition, title="Buy Alert", message="BUY") alertcondition(shortCondition, title="Sell Alert", message="SELL")