
Strategi untuk melakukan breakout channel harga dinamis adalah strategi perdagangan kuantitatif berdasarkan indikator channel harga Donchian. Strategi ini menilai arah tren pasar berdasarkan garis batas atas dan bawah dari channel harga, dan membangun posisi over atau under saat harga menerobos channel.
Gagasan utama dari strategi ini adalah menggunakan breakout dari saluran harga Donchan. Untuk membangun tren pencarian headline ketika harga menembus batas atas saluran; untuk membangun tren pencarian headline ketika harga menembus batas bawah saluran.
Saluran harga dihitung dengan rumus berikut:
Garis atas = N periode tertinggi dari harga tertinggi
Batas bawah = N periode minimum harga terendah
Garis tengah = (garis batas atas + garis batas bawah) / 2
Di mana N adalah panjang siklus saluran, dengan default 50 dalam strategi ini.
Posisi tambahan dibuat ketika harga tertinggi pada garis K terbaru menembus batas atas saluran;
Posisi short position dibuat ketika harga terendah dari garis K terbaru jatuh di bawah garis batas bawah saluran.
Contoh:
K-Line tidak melebihi batas atas saluran; Saat ini K-Line High telah melampaui batas atas saluran. ==> Membangun Posisi Multi
Ada dua pilihan aturan pertandingan:
Pindo: Stop loss adalah batas bawah saluran;
Flat: Stop loss adalah batas atas saluran;
Semua posisi, baik posisi multihead atau posisi kosong, akan dihapus ketika harga kembali turun di bawah garis tengah saluran.
Pengendalian risiko menggunakan metode stop loss proporsional, dengan perhitungan jarak stop loss spesifik berdasarkan lebar saluran dan persentase risiko yang dapat ditanggung dari pengaturan.
Stop loss = harga masuk * (1 - persentase risiko yang dapat ditanggung)
Jarak stop loss = harga masuk * (1 + persentase risiko yang dapat ditanggung)
Sebagai contoh, setup untuk mengambil risiko lebih dari 2%, harga masuknya adalah \( 10.000, dan garis stop loss lebih dari 10.000 * (1 - 2%) = \) 9.800.
Ketika harga menembus batas atas dan bawah saluran, kemungkinan besar akan memulai tren arah baru. Pada saat ini, entry dapat menangkap perubahan harga yang lebih besar.
Dengan stop loss proporsional, kerugian tunggal dapat dikendalikan dalam kisaran yang dapat ditanggung.
Parameter seperti panjang siklus saluran, rasio risiko, dan metode stop loss dapat dioptimalkan untuk menyesuaikan diri dengan lebih banyak kondisi pasar.
Harga untuk menembus batas atas dan bawah saluran tidak berarti pasti membentuk tren, ada probabilitas untuk gagal menembus, yang mudah dihentikan.
Ketika pasar berada dalam pergerakan lebar, harga dapat sering memicu batas atas dan bawah saluran, yang menyebabkan peningkatan biaya transaksi dan kehilangan slippage karena terlalu sering diperdagangkan.
Panjang saluran harga dapat dipertimbangkan sebagai variabel, yang secara otomatis disesuaikan dengan fluktuasi pasar. Panjang saluran meningkat ketika pasar bergejolak, dan panjang saluran berkurang ketika tren jelas.
Dalam kombinasi dengan penyaringan waktu masuk indikator lain, seperti indikator energi kuantitatif, rata-rata bergerak, dan lain-lain, untuk menghindari kegagalan dalam situasi getaran.
Menggunakan lebih banyak data historis untuk mengoptimalkan kombinasi parameter untuk tes, untuk menentukan parameter optimal yang sesuai dengan situasi pasar yang lebih luas.
Strategi saluran harga dinamis secara keseluruhan adalah strategi pelacakan tren yang lebih sederhana dan intuitif. Kelebihannya adalah bahwa indikatornya jelas dan mudah dipahami; pengendalian risiko lebih masuk akal. Namun, ada juga beberapa masalah yang perlu dioptimalkan lebih lanjut, seperti penanganan kegagalan dan pasar yang bergoyang. Strategi ini lebih cocok sebagai alat bantu untuk perdagangan tren yang bekerja sama, dan kombinasi indikator atau model teknis lainnya akan lebih efektif.
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Noro
//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen = input(50, minval = 1, title = "Price Channel Length")
showll = input(true, defval = true, title = "Show lines")
showof = input(true, defval = true, title = "Show offset")
showdd = input(true, defval = true, title = "Show label (drawdown)")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2
//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center
//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")
//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)
//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort
//Trading
if h > 0
strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
strategy.close_all()
strategy.cancel("Long")
strategy.cancel("Short")
if showdd
//Drawdown
max = 0.0
max := max(strategy.equity, nz(max[1]))
dd = (strategy.equity / max - 1) * 100
min = 100.0
min := min(dd, nz(min[1]))
//Max loss size
equity := strategy.position_size == 0 ? strategy.equity : equity[1]
loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
maxloss := min(nz(maxloss[1]), loss)
//Label
min := round(min * 100) / 100
maxloss := round(maxloss * 100) / 100
labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
var label la = na
label.delete(la)
tc = min > -100 ? color.white : color.red
osx = timenow + round(change(time)*10)
osy = highest(100)
// la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)