Strategi Pecah Saluran Harga Dinamik


Tarikh penciptaan: 2023-12-13 16:03:37 Akhirnya diubah suai: 2023-12-13 16:03:37
Salin: 3 Bilangan klik: 674
1
fokus pada
1621
Pengikut

Strategi Pecah Saluran Harga Dinamik

Gambaran keseluruhan

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.

Prinsip Strategi

Pengiraan penunjuk

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.

Peraturan kemasukan

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

Peraturan permainan

Terdapat dua pilihan peraturan permainan:

  1. Jalan keluar

Pindo: harga stop loss sebagai had bawah saluran;

Flat: harga stop loss sebagai had atas saluran;

  1. Barisan tengah

Sama ada kedudukan berbilang atau kosong, apabila harga kembali jatuh ke bawah garis tengah saluran, semua kedudukan akan dihapuskan.

Kawalan Risiko

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.

Analisis kelebihan

Menangkap Trend Berjaya

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.

Risiko yang boleh dikawal

Menggunakan stop loss perkadaran boleh mengawal kerugian tunggal dalam julat yang boleh diterima.

Optimasi parameter ruang yang besar

Panjang kitaran saluran, nisbah risiko, dan cara menghentikan kerugian boleh dioptimumkan untuk menyesuaikan diri dengan lebih banyak keadaan pasaran.

Analisis risiko

Kegagalan Berjaya

Harga untuk menembusi saluran atas dan bawah tidak bermakna ia mesti membentuk trend, terdapat kebarangkalian untuk menembusi kegagalan, yang mudah dihentikan.

Keadaan Guncang

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.

Arah pengoptimuman

Laluan dinamik

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.

Mempertingkatkan peluang masuk

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.

Peraturan parameter

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

ringkaskan

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.

Kod 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)