
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.
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)
Strategi ini mempunyai kelebihan berikut:
Strategi ini juga mempunyai risiko:
Risiko ini dapat dikurangkan dan dikawal dengan menyesuaikan parameter dan pemantauan buatan tangan.
Strategi ini juga boleh dioptimumkan dalam beberapa aspek:
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.
/*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)