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.
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)
Keuntungan dari strategi ini adalah:
Ada juga beberapa risiko dalam strategi ini:
Risiko ini dapat dikurangi dan dikendalikan dengan menyesuaikan parameter dan pemantauan manual.
Strategi ini juga dapat dioptimalkan dalam aspek berikut:
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)