
Strategi penembusan saluran harga dinamik adalah strategi perdagangan kuantitatif berdasarkan penunjuk saluran harga Donchian. Strategi ini menilai arah trend pasaran berdasarkan garis atas dan bawah saluran harga, dan menetapkan kedudukan jual beli atau jual beli ketika harga menembusi saluran.
Gagasan utama strategi ini adalah menggunakan penembusan saluran harga Donchan. Apabila harga menembusi saluran atas, binalah tren mencari arah yang lebih tinggi; Apabila harga jatuh di bawah saluran, binalah tren mencari arah yang lebih rendah.
Saluran harga dikira dengan formula berikut:
Garis atas = N tempoh tertinggi harga tertinggi
Garis bawah = N tempoh minimum harga terendah
Garis tengah = (garis atas + garis bawah) / 2
N mewakili panjang kitaran saluran, yang secara default dalam strategi ini adalah 50.
Apabila harga teratas bagi K Line terkini melepasi had atas saluran, buat kedudukan tambahan;
Apabila harga terendah pada garis K terkini jatuh di bawah garis bawah saluran, kedudukan kosong akan ditubuhkan.
Contohnya:
Punca tertinggi K tidak melebihi had atas saluran; Pada masa ini, titik tertinggi di garisan K telah melampaui batas atas saluran. ==> Menubuhkan pelbagai kedudukan
Terdapat dua pilihan peraturan permainan:
Pindo: harga stop loss sebagai had bawah saluran;
Flat: harga stop loss sebagai had atas saluran;
Sama ada kedudukan berbilang atau kosong, apabila harga kembali jatuh ke bawah garis tengah saluran, semua kedudukan akan dihapuskan.
Pengendalian risiko menggunakan kaedah penangguhan perkadaran, dengan jarak penangguhan tertentu dikira berdasarkan peratusan risiko yang boleh diterima berdasarkan lebar saluran dan tetapan.
Buat jarak penangguhan tambahan = harga kemasukan * (1 - peratusan risiko yang dapat ditanggung)
Jarak Stop Loss = Harga Masuk * (1 + peratus risiko yang boleh ditanggung)
Sebagai contoh, untuk menetapkan risiko tambahan sebanyak 2%, harga kemasukan adalah \( 10,000, dan untuk satu-satunya garis berhenti sebanyak 10,000 * (1 - 2%) = \) 9,800.
Apabila harga menembusi saluran atas dan bawah, kemungkinan besar akan memulakan trend arah baru. Pada masa ini, kemasukan dapat menangkap perubahan harga yang lebih besar.
Menggunakan stop loss perkadaran boleh mengawal kerugian tunggal dalam julat yang boleh diterima.
Panjang kitaran saluran, nisbah risiko, dan cara menghentikan kerugian boleh dioptimumkan untuk menyesuaikan diri dengan lebih banyak keadaan pasaran.
Harga untuk menembusi saluran atas dan bawah tidak bermakna ia mesti membentuk trend, terdapat kebarangkalian untuk menembusi kegagalan, yang mudah dihentikan.
Apabila pasaran berada dalam pergerakan lebar, harga mungkin sering mencetuskan up dan down saluran, yang menyebabkan peningkatan kos perdagangan dan kehilangan slippage akibat terlalu kerap berdagang.
Panjang saluran harga boleh dipertimbangkan sebagai pembolehubah, menyesuaikan secara automatik mengikut turun naik pasaran. Panjang saluran meningkat apabila pasaran bergolak, dan panjang saluran berkurangan apabila trend jelas.
Gabungan dengan penapisan masa masuk ke dalam permainan dengan penunjuk lain, seperti penunjuk tenaga kuantitatif, purata bergerak, dan lain-lain, untuk mengelakkan penembusan yang tidak berkesan dalam keadaan gegaran.
Menggunakan lebih banyak data sejarah untuk menguji dan mengoptimumkan kombinasi parameter untuk menentukan parameter optimum yang sesuai dengan keadaan pasaran yang lebih luas.
Strategi saluran harga dinamik secara keseluruhan adalah strategi pengesanan trend yang lebih mudah dan intuitif. Kelebihannya adalah bahawa tanda-tanda jelas dan mudah difahami; kawalan risiko lebih masuk akal. Tetapi ada beberapa masalah yang perlu dioptimumkan lagi, seperti penanganan kegagalan dan pasaran yang bergolak.
/*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)