Strategi Penembusan Saluran Harga Dinamik adalah strategi perdagangan kuantitatif berdasarkan penunjuk Saluran Harga Donchian. Strategi ini menilai arah trend pasaran mengikut garis atas dan bawah saluran harga, dan menubuhkan kedudukan panjang atau pendek apabila harga menembusi saluran.
Idea utama strategi ini adalah menggunakan penembusan saluran harga Donchan. Apabila harga menembusi batas atas saluran, buat kedudukan panjang untuk mencari trend; Apabila harga menembusi batas bawah saluran, buat kedudukan pendek untuk mencari trend.
Saluran harga dikira dengan formula berikut:
Garis Atas = Tinggi tertinggi sepanjang N tempoh yang lalu
Garis Bawah = Garis terendah dalam tempoh N yang lalu
Garis tengah = (Garis atas + Garis bawah) / 2
Di mana N mewakili panjang kitaran saluran. lalai adalah 50 untuk strategi ini.
Apabila harga tertinggi K-Line terkini memecahkan had atas saluran, mewujudkan kedudukan panjang;
Apabila harga terendah dari K-line terbaru memecahkan batas bawah saluran, buat kedudukan pendek.
Contoh:
Titik tinggi garis K sebelumnya tidak melebihi had atas saluran;
Titik tertinggi garis K semasa menembusi had atas saluran;
==> Menetapkan kedudukan panjang
Terdapat dua peraturan keluar pilihan:
Penutupan kedudukan panjang: harga stop loss adalah had bawah saluran;
Penutupan kedudukan pendek: Harga stop loss adalah had atas saluran;
Tidak kira kedudukan panjang atau pendek, tutup semua kedudukan apabila harga jatuh di bawah garis tengah saluran.
Kawalan risiko menggunakan kerugian hentian yang proporsional untuk mengira jarak hentian kehilangan khusus berdasarkan amplitud saluran dan peratusan risiko yang boleh diterima.
Jarak stop loss panjang = Harga kemasukan * (1 - Peratusan risiko yang boleh diterima)
Jarak stop loss pendek = Harga kemasukan * (1 + Peratusan risiko yang boleh diterima)
Sebagai contoh, jika risiko yang boleh diterima ditetapkan pada 2%, harga kemasukan adalah $ 10,000, maka garis stop loss untuk kedudukan panjang adalah 10,000 * (1 - 2%) = $ 9,800.
Apabila harga menembusi batas atas dan bawah saluran, sangat mungkin trend arah baru bermula.
Penggunaan stop loss proporsional boleh mengekalkan kerugian tunggal dalam julat yang boleh diterima.
Parameter seperti kitaran saluran, nisbah risiko, kaedah stop loss boleh dioptimumkan dan digabungkan untuk menyesuaikan lebih banyak persekitaran pasaran.
Penembusan harga sempadan saluran tidak semestinya membentuk trend, terdapat kebarangkalian kegagalan penembusan, yang mungkin menyebabkan kerugian berhenti.
Apabila pasaran terikat julat, harga mungkin sering menyentuh batas atas dan bawah saluran, mengakibatkan perdagangan yang terlalu kerap, sehingga meningkatkan kos transaksi dan kerugian seluncur.
Pertimbangkan untuk menjadikan panjang saluran harga sebagai pembolehubah yang menyesuaikan diri secara automatik berdasarkan turun naik pasaran.
Menggabungkan penunjuk lain untuk menapis masa kemasukan, seperti penunjuk jumlah, purata bergerak, dan lain-lain untuk mengelakkan pecah yang tidak berkesan dalam pasaran berayun.
Menggunakan lebih banyak data sejarah untuk menguji dan mengoptimumkan kombinasi parameter untuk menentukan parameter optimum untuk menyesuaikan diri dengan keadaan pasaran yang lebih luas.
Strategi Saluran Harga Dinamik pada umumnya adalah strategi penjejakan trend yang agak mudah dan intuitif. Kelebihannya adalah isyarat yang jelas dan mudah difahami; Kawalan risiko agak munasabah. Tetapi masih ada beberapa masalah yang perlu dioptimumkan lebih lanjut, seperti mengendalikan kegagalan dan pasaran berayun. Strategi ini lebih sesuai sebagai alat tambahan untuk perdagangan trend, dan kesannya akan lebih baik apabila digabungkan dengan penunjuk atau model teknikal lain.
/*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)