Saluran Harga Dinamis dengan Strategi Pelacakan Stop Loss

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

img

Gambaran umum

Strategi ini dikembangkan berdasarkan indikator saluran harga Donchian. Indikator membentuk saluran harga dengan menghitung harga tertinggi dan terendah selama periode tertentu. Strategi ini menggunakan saluran harga untuk menerapkan perdagangan dua arah dan menetapkan harga stop loss dan take profit. Harga stop loss ditetapkan pada garis tengah saluran harga, dan harga take profit ditetapkan pada persentase tertentu di luar batas atas dan bawah saluran harga. Strategi ini juga menerapkan pelacakan stop loss dan take profit.

Prinsip Strategi

Pertama, strategi menghitung batas atas h dan batas bawah l saluran harga berdasarkan parameter pclen. Pusat garis tengah adalah rata-rata batas atas dan bawah saluran harga. Kemudian, harga take profit tpl dan tps dihitung sesuai dengan parameter take profit tp untuk posisi panjang dan pendek. Harga stop loss ditetapkan pada pusat garis tengah saluran harga. Ketika harga menembus saluran harga, posisi perdagangan dari arah yang berbeda dihitung sesuai dengan ukuran risiko posisi risklong dan riskshort. Strategi akan ditutup ketika harga kembali memasuki saluran. Selain itu, penyaringan waktu diatur hanya untuk berdagang dalam kisaran tanggal yang ditentukan.

Logika perdagangan khusus adalah:

Sinyal masuk panjang: buka panjang ketika harga lebih besar dari batas atas saluran h dan jatuh kembali ke saluran

Sinyal keluar panjang: tutup panjang ketika harga lebih rendah dari pusat garis tengah saluran (stop loss) atau lebih tinggi dari harga take profit (take profit)

Sinyal masuk pendek: buka pendek ketika harga di bawah batas bawah saluran l dan jatuh kembali ke saluran

Sinyal keluar pendek: tutup pendek ketika harga lebih tinggi dari pusat garis tengah saluran (stop loss) atau lebih rendah dari harga take profit (take profit)

Analisis Keuntungan

Keuntungan dari strategi ini adalah:

  1. Perdagangan dua arah dapat menangkap pembalikan tren harga
  2. Menggunakan saluran harga untuk menentukan arah tren dan menghindari pecah palsu
  3. Atur stop loss dan ambil keuntungan untuk mengendalikan risiko
  4. Menghitung ukuran posisi yang terkait dengan ukuran risiko untuk mencapai risiko yang dapat dikontrol
  5. Mengimplementasikan pelacakan stop loss dan mengambil keuntungan untuk mengunci lebih banyak keuntungan

Analisis Risiko

Ada juga beberapa risiko dalam strategi ini:

  1. Pengaturan parameter saluran harga yang tidak tepat dapat menyebabkan frekuensi perdagangan yang terlalu tinggi atau kehilangan peluang perdagangan
  2. Harga stop loss yang ditetapkan terlalu luas dapat meningkatkan eksposur risiko
  3. Pelacakan mengambil keuntungan dapat memicu dini dalam periode volatilitas tinggi

Risiko ini dapat dikurangi dan dikendalikan dengan menyesuaikan parameter dan pemantauan manual.

Arahan Optimasi

Strategi ini juga dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan filter indikator lebih banyak untuk menghindari pembukaan dan penutupan yang sering di pasar yang terikat rentang
  2. Algoritma stop loss dan take profit yang berbeda dapat diuji, seperti ATR stop loss
  3. Memperluas ke sistem perdagangan cross-timeframe menggunakan jangka waktu yang lebih tinggi untuk menentukan arah tren
  4. Tambahkan modul ukuran posisi untuk menyesuaikan posisi berdasarkan rasio pemanfaatan modal
  5. Mengintegrasikan model pembelajaran mesin untuk menilai tingkat keberhasilan price breakouts untuk menghindari false breakouts

Kesimpulan

Kesimpulannya, ini adalah strategi yang efektif untuk menerapkan perdagangan dua arah menggunakan indikator saluran harga. Dengan stop loss yang tepat, mengambil keuntungan, dan modul kontrol ukuran posisi, risiko dapat dikendalikan dengan baik. Dengan beberapa optimasi dan penyesuaian, ini dapat 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 banyak