Saluran Harga Dinamik dengan Strategi Pengesanan Stop Loss

Penulis:ChaoZhang, Tarikh: 2024-02-01 10:52:33
Tag:

img

Ringkasan

Strategi ini dibangunkan berdasarkan penunjuk saluran harga Donchian. Penunjuk membentuk saluran harga dengan mengira harga tertinggi dan terendah dalam tempoh tertentu. Strategi ini menggunakan saluran harga untuk melaksanakan perdagangan dua hala dan menetapkan harga stop loss dan mengambil keuntungan. Harga stop loss ditetapkan pada garis tengah saluran harga, dan harga mengambil keuntungan ditetapkan pada peratusan tertentu di luar had atas dan bawah saluran harga. Strategi ini juga melaksanakan penjejakan stop loss dan mengambil keuntungan.

Prinsip Strategi

Pertama, strategi mengira had atas h dan had bawah l saluran harga berdasarkan parameter pclen. Pusat garisan tengah adalah purata had atas dan bawah saluran harga. Kemudian, harga keuntungan mengambil tpl dan tps dikira mengikut parameter keuntungan tp untuk kedudukan panjang dan pendek. Harga stop loss ditetapkan pada pusat garisan tengah saluran harga. Apabila harga menembusi saluran harga, kedudukan dagangan dari arah yang berbeza dikira mengikut saiz risikoposisi risklong dan riskshort. Strategi akan ditutup apabila harga memasuki semula saluran. Di samping itu, penapisan masa ditetapkan untuk hanya berdagang dalam julat tarikh yang ditentukan.

Logik perdagangan khusus adalah:

Isyarat masuk panjang: buka panjang apabila harga lebih besar daripada had atas saluran h dan jatuh kembali ke saluran

Isyarat keluar panjang: tutup panjang apabila harga adalah lebih rendah daripada pusat garis tengah saluran (stop loss) atau lebih tinggi daripada harga mengambil keuntungan tpl (mendapat keuntungan)

Isyarat kemasukan pendek: buka pendek apabila harga di bawah had bawah saluran l dan jatuh kembali ke saluran

Isyarat keluar pendek: tutup pendek apabila harga lebih tinggi daripada pusat garis tengah saluran (stop loss) atau lebih rendah daripada harga mengambil keuntungan (take profit)

Analisis Kelebihan

Kelebihan strategi ini ialah:

  1. Perdagangan dua hala boleh menangkap pembalikan trend harga
  2. Menggunakan saluran harga untuk menentukan arah trend dan mengelakkan pecah palsu
  3. Tetapkan stop loss dan mengambil keuntungan untuk mengawal risiko
  4. Mengira saiz kedudukan yang berkaitan dengan saiz risiko untuk mencapai risiko yang boleh dikawal
  5. Melaksanakan penjejakan stop loss dan mengambil keuntungan untuk mengunci lebih banyak keuntungan

Analisis Risiko

Terdapat juga beberapa risiko dalam strategi ini:

  1. Tetapan parameter saluran harga yang tidak betul boleh menyebabkan kekerapan dagangan yang terlalu tinggi atau peluang dagangan yang hilang
  2. Harga stop loss yang ditetapkan terlalu luas boleh meningkatkan pendedahan risiko
  3. Pengesanan mengambil keuntungan boleh mencetuskan lebih awal dalam tempoh turun naik yang tinggi

Risiko ini boleh dikurangkan dan dikawal dengan menyesuaikan parameter dan pemantauan manual.

Arahan pengoptimuman

Strategi ini juga boleh dioptimumkan dalam aspek berikut:

  1. Tambah lebih banyak penapis penunjuk untuk mengelakkan pembukaan dan penutupan yang kerap di pasaran yang terikat julat
  2. Algoritma stop loss dan mengambil keuntungan yang berbeza boleh diuji, seperti ATR stop loss
  3. Memperluas kepada sistem dagangan jangka masa yang menggunakan jangka masa yang lebih tinggi untuk menentukan arah trend
  4. Tambah modul saiz kedudukan untuk menyesuaikan kedudukan berdasarkan nisbah penggunaan modal
  5. Menggabungkan model pembelajaran mesin untuk menilai kadar kejayaan harga pecah untuk mengelakkan pecah palsu

Kesimpulan

Kesimpulannya, ini adalah strategi yang berkesan untuk melaksanakan perdagangan dua hala menggunakan penunjuk saluran harga. Dengan modul kawalan stop loss, mengambil keuntungan, dan saiz kedudukan yang betul, risiko dapat dikawal dengan baik. Dengan beberapa pengoptimuman dan penyesuaian, ia boleh menjadi strategi perdagangan kuantitatif yang kuat.


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

Lebih lanjut