Strategi Penembusan Saluran Harga Dinamik

Penulis:ChaoZhang, Tarikh: 2023-12-13 16:03:37
Tag:

img

Ringkasan

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.

Prinsip Strategi

Pengiraan Penunjuk

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.

Peraturan kemasukan

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

Peraturan Keluar

Terdapat dua peraturan keluar pilihan:

  1. Keluar Saluran

Penutupan kedudukan panjang: harga stop loss adalah had bawah saluran;

Penutupan kedudukan pendek: Harga stop loss adalah had atas saluran;

  1. Keluar Garis Tengah

Tidak kira kedudukan panjang atau pendek, tutup semua kedudukan apabila harga jatuh di bawah garis tengah saluran.

Kawalan Risiko

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.

Analisis Kelebihan

Menangkap Trend Breakouts

Apabila harga menembusi batas atas dan bawah saluran, sangat mungkin trend arah baru bermula.

Risiko yang boleh dikawal

Penggunaan stop loss proporsional boleh mengekalkan kerugian tunggal dalam julat yang boleh diterima.

Ruang Pengoptimuman Parameter Besar

Parameter seperti kitaran saluran, nisbah risiko, kaedah stop loss boleh dioptimumkan dan digabungkan untuk menyesuaikan lebih banyak persekitaran pasaran.

Analisis Risiko

Kegagalan Melanggar

Penembusan harga sempadan saluran tidak semestinya membentuk trend, terdapat kebarangkalian kegagalan penembusan, yang mungkin menyebabkan kerugian berhenti.

Pasaran Berhadapan Julat

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.

Arahan pengoptimuman

Saluran Dinamik

Pertimbangkan untuk menjadikan panjang saluran harga sebagai pembolehubah yang menyesuaikan diri secara automatik berdasarkan turun naik pasaran.

Mengoptimumkan Peluang Masuk

Menggabungkan penunjuk lain untuk menapis masa kemasukan, seperti penunjuk jumlah, purata bergerak, dan lain-lain untuk mengelakkan pecah yang tidak berkesan dalam pasaran berayun.

Pengoptimuman Parameter

Menggunakan lebih banyak data sejarah untuk menguji dan mengoptimumkan kombinasi parameter untuk menentukan parameter optimum untuk menyesuaikan diri dengan keadaan pasaran yang lebih luas.

Ringkasan

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)

Lebih lanjut