Strategi Pengesanan Henti Kerugian Saluran Harga Dinamik


Tarikh penciptaan: 2024-02-01 10:52:33 Akhirnya diubah suai: 2024-02-01 10:52:33
Salin: 0 Bilangan klik: 599
1
fokus pada
1617
Pengikut

Strategi Pengesanan Henti Kerugian Saluran Harga Dinamik

Gambaran keseluruhan

Strategi ini dibangunkan berdasarkan indikator saluran harga Donchian. Ia membentuk saluran harga dengan mengira harga tertinggi dan terendah dalam tempoh tertentu. Strategi menggunakan saluran harga untuk melakukan perdagangan dua hala dan menetapkan harga berhenti dan hentikan.

Prinsip Strategi

Pertama, strategi mengira h dan l had atas dan bawah saluran harga berdasarkan parameter pclen ⋅ pusat garis tengah adalah purata had atas dan bawah saluran harga ⋅ kemudian, berdasarkan parameter penangguhan tp untuk kedudukan panjang dan kosong, harga penangguhan tpl dan tps dihitung ⋅ harga henti ditetapkan sebagai pusat saluran harga ⋅ apabila harga menembusi saluran harga, kedudukan dagangan yang berbeza dihitung berdasarkan ukuran risiko long dan risiko pendek ⋅ strategi akan melonggarkan kedudukan apabila harga memasuki saluran semula ⋅ selain itu, pengalihan masa ditetapkan, perdagangan hanya dalam tempoh masa yang ditetapkan ⋅

Logik urus niaga adalah seperti berikut:

Isyarat untuk membuka kedudukan: harga lebih besar daripada had h dan membuka kedudukan apabila turun ke dalam saluran Isyarat kedudukan terhad: harga terhad di bawah garis tengah saluran (stop loss) atau di atas harga terhad (stop loss)

Isyarat kosong: harga lebih rendah daripada had bawah saluran l dan kembali ke dalam saluran apabila kosong Isyarat kedudukan kosong: apabila harga lebih tinggi daripada garis tengah saluran (stop loss) atau lebih rendah daripada harga stop loss (stop loss)

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Perdagangan dua hala untuk menangkap perubahan harga
  2. Menggunakan Saluran Harga untuk Mengesan Trend dan Mengelakkan Penembusan Palsu
  3. Tetapkan Stop Loss dan Kawal Risiko
  4. Mengira saiz kedudukan yang berkaitan dengan saiz risiko, mewujudkan risiko yang terkawal
  5. Pelacakan Stop Loss dan Stop Stop yang membolehkan anda mengunci lebih banyak keuntungan

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Pengaturan parameter saluran harga yang tidak betul boleh menyebabkan frekuensi perdagangan yang terlalu tinggi atau peluang perdagangan yang terlewatkan
  2. Harga Stop Loss Terlalu Rendah Boleh Menambah Celah Risiko
  3. Tracking Stop boleh diaktifkan lebih awal semasa turun naik tinggi

Risiko ini dapat dikurangkan dan dikawal dengan menyesuaikan parameter dan pemantauan buatan tangan.

Arah pengoptimuman

Strategi ini juga boleh dioptimumkan dalam beberapa aspek:

  1. Menambah penapis untuk lebih banyak penunjuk untuk mengelakkan sering membuka posisi kosong dalam keadaan gegaran.
  2. Anda boleh menguji pelbagai algoritma stop loss seperti ATR stop loss dan sebagainya.
  3. Berkembang menjadi sistem dagangan sepanjang tempoh masa, menggunakan tempoh masa yang lebih tinggi untuk menentukan arah trend
  4. Menambah modul pengurusan kedudukan, menyesuaikan kedudukan mengikut peratusan penggunaan dana
  5. Menggunakan model pembelajaran mesin untuk menilai kejayaan penembusan harga dan mengelakkan penembusan palsu

ringkaskan

Strategi ini secara keseluruhan adalah kaedah yang berkesan untuk mencapai perdagangan dua hala menggunakan indikator saluran harga. Ia menyediakan modul kawalan stop loss dan kedudukan yang dapat mengawal risiko dengan baik. Dengan pengoptimuman dan penyesuaian tertentu, ia boleh menjadi strategi perdagangan kuantitatif yang kuat.

Kod sumber strategi
/*backtest
start: 2023-01-31 00:00:00
end: 2024-01-31 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

//@version=4
strategy(title = "Noro's RiskDonchian Strategy", shorttitle = "RiskDonchian str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
tp = input(defval = 20.0, minval = 1, title = "Take-profit, %")
tptype = input(defval = "2. Fix", options = ["1. None", "2. Fix", "3. Trailing"], title = "Take-profit type")
sltype = input(defval = "2. Center", options = ["1. None", "2. Center"], title = "Take-profit type")
risklong  = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
pclen = input(50, minval = 1, title = "Price Channel Length")
showll = input(true, defval = true, title = "Show lines")
showbg = input(false, defval = false, title = "Show Background")
showof = input(true, defval = true, title = "Show Offset")
showlabel = input(true, defval = true, title = "Show label")
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

//Take-profit
tpl = 0.0
tpl := tptype == "2. Fix" and strategy.position_size > 0 ? tpl[1] : h * (100 + tp) / 100

//Stop-loss
tps = 0.0
tps := tptype == "2. Fix" and strategy.position_size < 0 ? tps[1] : l * (100 - tp) / 100

//Lines
tplcol = showll and needlong and tptype != "1. None" ? color.lime : na
pclcol = showll and needlong ? color.blue : na
sllcol = showll and needlong and sltype != "1. None" ? color.red : na
tpscol = showll and needshort and tptype != "1. None" ? color.lime : na
pcscol = showll and needshort ? color.blue : na
slscol = showll and needshort and sltype != "1. None" ? color.red : na
offset = showof ? 1 : 0
plot(tpl, offset = offset, color = tplcol, title = "TP Long")
plot(h, offset = offset, color = pclcol, title = "Channel High")
plot(center, offset = offset, color = sllcol, title = "SL Long")
plot(center, offset = offset, color = slscol, title = "SL Short")
plot(l, offset = offset, color = pcscol, title = "Channel Low")
plot(tps, offset = offset, color = tpscol, title = "TP Short")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Lot size
risksizelong = -1 * risklong
risklonga = ((center / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = ((center / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
mo = 0
mo := strategy.position_size != 0 ? 0 : high >= center[1] and low <= center[1] ? 1 : mo[1]

if h > 0
    longlimit = tptype == "1. None" ? na : tpl
    longstop = sltype == "1. None" ? na : center
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime and mo)
    strategy.exit("TP Long", "Long", limit = longlimit, stop = longstop)
    shortlimit = tptype == "1. None" ? na : tps
    shortstop = sltype == "1. None" ? na : center
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime and mo)
    strategy.exit("Exit Short", "Short", limit = shortlimit, stop = shortstop)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showlabel

    //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]))
    
    //Label
    min := round(min * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)