This strategy trades based on the price channel of the ZZ indicator, taking long/short positions when price breaks out above/below the channel bands. It aims to capture trend outbreak moves outside the channel range.
Specifically, it uses the ZZ indicator to calculate the price channel bands. When price breaks out upward from the lower band, go long. When price breaks down from the upper band, go short. Stop loss orders are used with the channel bands as stop loss levels. Trading hours are also defined to avoid overnight risks.
Risks can be reduced by widening channel range, optimizing stop loss, gauging trend strength etc.
This strategy trades price channel breakouts to identify trend outbreaks. Pros are simple clear signals and easy operation; Cons are whipsaws and failure to ride trends. Parameter optimization and strategy combination can overcome the cons while retaining pros. It helps traders master applying price channel techniques.
/*backtest start: 2022-09-14 00:00:00 end: 2023-09-20 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2019 //@version=4 strategy(title = "Noro's ZZ-4 Strategy", shorttitle = "Noro's ZZ-4 Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") len = input(7, minval = 1, title = "Length") showll = input(true, defval = true, title = "Show Levels") showbg = input(false, defval = false, title = "Show Background") showpc = input(false, defval = false, title = "Show Price Channel") 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(ohlc4, len) l = lowest(ohlc4, len) pccol = showpc ? color.blue : na plot(h, color = pccol, transp = 0) plot(l, color = pccol, transp = 0) //Levels ml = 0 ml := l > l[1] ? 1 : l < l[1] ? -1 : ml[1] ll = 0.0 ll := ml == 1 and ml[1] == -1 ? l[1] : ll[1] mh = 0 mh := h > h[1] ? 1 : h < h[1] ? -1 : mh[1] hl = 0.0 hl := mh == -1 and mh[1] == 1 ? h[1] : hl[1] //Lines colorh = showll and hl == hl[1] ? color.lime : na colorl = showll and ll == ll[1] ? color.red : na plot(hl, color = colorh, linewidth = 2, transp = 0, title = "Long") plot(ll, color = colorl, linewidth = 2, transp = 0, title = "Short") //Background size = strategy.position_size trend = 0 trend := size > 0 ? 1 : size < 0 ? -1 : high >= hl ? 1 : low <= ll ? -1 : trend[1] bgcol = showbg == false ? na : trend == 1 ? color.lime : trend == -1 ? color.red : na bgcolor(bgcol, transp = 80) //Trading truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59) lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if ll > 0 and hl > 0 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = hl, when=(truetime)) strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = ll, when=(truetime)) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short")