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.
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.
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
Ada dua aturan keluar opsional:
Penutupan posisi panjang: harga stop loss adalah batas bawah saluran;
Penutupan posisi pendek: harga stop loss adalah batas atas saluran;
Tidak peduli posisi panjang atau pendek, tutup semua posisi ketika harga jatuh kembali di bawah garis tengah saluran.
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.
Ketika harga menembus batas atas dan bawah saluran, sangat mungkin bahwa tren arah baru dimulai.
Penggunaan stop loss proporsional dapat menjaga kerugian tunggal dalam kisaran yang dapat diterima.
Parameter seperti siklus saluran, rasio risiko, metode stop loss dapat dioptimalkan dan digabungkan untuk menyesuaikan lebih banyak lingkungan pasar.
Penembusan harga batas saluran tidak selalu membentuk tren, ada kemungkinan kegagalan penembusan, yang kemungkinan akan menyebabkan stop loss.
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.
Pertimbangkan untuk membuat panjang saluran harga variabel yang secara otomatis menyesuaikan berdasarkan volatilitas pasar.
Menggabungkan indikator lain untuk menyaring waktu masuk, seperti indikator volume, rata-rata bergerak, dll. untuk menghindari terobosan yang tidak efektif di pasar osilasi.
Menggunakan lebih banyak data historis untuk menguji dan mengoptimalkan kombinasi parameter untuk menentukan parameter optimal untuk beradaptasi dengan kondisi pasar yang lebih luas.
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)