Strategi Breakout Saluran Harga Dinamis


Tanggal Pembuatan: 2023-12-13 16:03:37 Akhirnya memodifikasi: 2023-12-13 16:03:37
menyalin: 3 Jumlah klik: 674
1
fokus pada
1621
Pengikut

Strategi Breakout Saluran Harga Dinamis

Ringkasan

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.

Prinsip Strategi

Perhitungan indikator

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.

Aturan masuk

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

Peraturan pertandingan

Ada dua pilihan aturan pertandingan:

  1. Jalan keluar

Pindo: Stop loss adalah batas bawah saluran;

Flat: Stop loss adalah batas atas saluran;

  1. Garis tengah

Semua posisi, baik posisi multihead atau posisi kosong, akan dihapus ketika harga kembali turun di bawah garis tengah saluran.

Pengendalian Risiko

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.

Analisis Keunggulan

Menangkap Trending Breakthrough

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.

Risiko yang Dapat Dikendalikan

Dengan stop loss proporsional, kerugian tunggal dapat dikendalikan dalam kisaran yang dapat ditanggung.

Parameter Optimasi Ruang Besar

Parameter seperti panjang siklus saluran, rasio risiko, dan metode stop loss dapat dioptimalkan untuk menyesuaikan diri dengan lebih banyak kondisi pasar.

Analisis risiko

Penembusan gagal

Harga untuk menembus batas atas dan bawah saluran tidak berarti pasti membentuk tren, ada probabilitas untuk gagal menembus, yang mudah dihentikan.

Peristiwa Gempa

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.

Arah optimasi

Saluran dinamis

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.

Memaksimalkan kesempatan masuk

Dalam kombinasi dengan penyaringan waktu masuk indikator lain, seperti indikator energi kuantitatif, rata-rata bergerak, dan lain-lain, untuk menghindari kegagalan dalam situasi getaran.

Regulasi Parameter

Menggunakan lebih banyak data historis untuk mengoptimalkan kombinasi parameter untuk tes, untuk menentukan parameter optimal yang sesuai dengan situasi pasar yang lebih luas.

Meringkaskan

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.

Kode Sumber Strategi
/*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)