Sumber daya yang dimuat... Pemuatan...

Strategi Penembusan Saluran Harga Dinamis

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

img

Gambaran umum

Strategi Penembusan Saluran Harga Dinamis adalah strategi perdagangan kuantitatif berdasarkan indikator Saluran Harga Donchian. Strategi ini menilai arah tren pasar sesuai dengan garis atas dan bawah saluran harga, dan menetapkan posisi panjang atau pendek ketika harga menembus saluran.

Gagasan utama dari strategi ini adalah Menggunakan penembusan saluran harga Donchan. Ketika harga menembus batas atas saluran, buat posisi panjang untuk mencari tren; Ketika harga menembus batas bawah saluran, buat posisi pendek untuk mencari tren.

Prinsip Strategi

Perhitungan Indikator

Saluran harga dihitung dengan rumus berikut:

Upper Line = tertinggi tertinggi selama N periode terakhir

Garis bawah = Rendah terendah selama periode N terakhir

Garis tengah = (Garis atas + Garis bawah) / 2

Dimana N mewakili panjang siklus saluran. default adalah 50 untuk strategi ini.

Aturan Masuk

Ketika harga tertinggi dari K-line terbaru menembus batas atas saluran, buat posisi panjang;

Ketika harga terendah dari K-line terbaru menembus batas bawah saluran, buat posisi short.

Contoh:

Titik tinggi dari garis K sebelumnya tidak melebihi batas atas saluran;
Titik tertinggi dari garis K arus menembus batas atas saluran; Menetapkan posisi panjang

Peraturan Keluar

Ada dua aturan keluar opsional:

  1. Saluran Keluar

Penutupan posisi panjang: harga stop loss adalah batas bawah saluran;

Penutupan posisi pendek: harga stop loss adalah batas atas saluran;

  1. Keluar dari garis tengah

Tidak peduli posisi panjang atau pendek, tutup semua posisi ketika harga jatuh kembali di bawah garis tengah saluran.

Pengendalian Risiko

Kontrol risiko mengadopsi stop loss proporsional untuk menghitung jarak stop loss spesifik berdasarkan amplitudo saluran dan persentase risiko yang dapat diterima.

Harga awal dari nilai tukar rupiah (RR)

Jarak stop loss pendek = Harga masuk * (1 + Persentase risiko yang dapat diterima)

Misalnya, jika risiko yang dapat diterima ditetapkan pada 2%, harga masuk adalah $10.000, maka garis stop loss untuk posisi panjang adalah $10.000 * (1 - 2%) = $9.800.

Analisis Keuntungan

Menangkap Trend Breakouts

Ketika harga menembus batas atas dan bawah saluran, sangat mungkin bahwa tren arah baru dimulai.

Risiko yang Bisa Dikendalikan

Penggunaan stop loss proporsional dapat menjaga kerugian tunggal dalam kisaran yang dapat diterima.

Ruang Optimasi Parameter Besar

Parameter seperti siklus saluran, rasio risiko, metode stop loss dapat dioptimalkan dan digabungkan untuk menyesuaikan lebih banyak lingkungan pasar.

Analisis Risiko

Kegagalan Melanggar

Penembusan harga batas saluran tidak selalu membentuk tren, ada kemungkinan kegagalan penembusan, yang kemungkinan akan menyebabkan stop loss.

Pasar Berbatas Jangkauan

Ketika pasar terikat pada kisaran, harga dapat sering menyentuh batas atas dan bawah saluran, yang mengakibatkan perdagangan yang terlalu sering, sehingga meningkatkan biaya transaksi dan kerugian geser.

Arahan Optimasi

Saluran Dinamis

Pertimbangkan untuk membuat panjang saluran harga variabel yang secara otomatis menyesuaikan berdasarkan volatilitas pasar.

Optimalkan Peluang Masuk

Menggabungkan indikator lain untuk menyaring waktu masuk, seperti indikator volume, rata-rata bergerak, dll. untuk menghindari terobosan yang tidak efektif di pasar osilasi.

Optimasi Parameter

Menggunakan lebih banyak data historis untuk menguji dan mengoptimalkan kombinasi parameter untuk menentukan parameter optimal untuk beradaptasi dengan kondisi pasar yang lebih luas.

Ringkasan

Strategi saluran harga dinamis umumnya merupakan strategi pelacakan tren yang relatif sederhana dan intuitif. Keuntungannya adalah sinyal yang jelas dan mudah dipahami; Kontrol risiko relatif wajar. Tetapi masih ada beberapa masalah yang harus dioptimalkan lebih lanjut, seperti penanganan kegagalan dan pasar osilasi. Strategi ini lebih cocok sebagai alat bantu untuk perdagangan tren, dan efeknya akan lebih baik bila dikombinasikan dengan indikator atau model teknis lainnya.


/*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 banyak