0bps

Strategy vault / Breakout

ZZ 4 Price Channel Breakout Strategy

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.

Author
ChaoZhang
Complexity
Intermediate · 70 lines
Parameters
13
Backtest bar
1d · swing
Tested on
BTC/USDT · futures

Overview

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.

Strategy Logic

  1. Calculate price channel upper/lower bands
  2. Go long when price breaks out above upper band
  3. Go short when price breaks down below lower band
  4. Set trading time range
  5. Clear positions before daily close

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.

Advantage Analysis

  1. Price channel identifies potential trend breakouts
  2. Simple and clear trading signals
  3. Customizable channel period fits different products and cycles
  4. Trading hours and daily exit manage risks
  5. Stop loss limits single trade loss

Risk Analysis

  1. Whipsaws inside channel may repeatedly hit stop loss
  2. Requires timely parameter tuning, otherwise channel range may be inaccurate
  3. Breakouts can be false, risks of being trapped
  4. Profit potential is limited by channel range
  5. Fails to fully capitalize on trend moves

Risks can be reduced by widening channel range, optimizing stop loss, gauging trend strength etc.

Optimization Directions

  1. Test different parameter combinations for best setup
  2. Widen price channel to capture larger moves
  3. Add trend indicator to avoid false breakouts
  4. Optimize stop loss to prevent being trapped
  5. Increase position size to maximize breakout profits
  6. Evaluate profitability across different date ranges

Summary

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.

Parameters

NameDefaultWhat it controls
v_input_1trueLong
v_input_2trueShort
v_input_3100Capital, %
v_input_47Length
v_input_5trueShow Levels
v_input_6falseShow Background
v_input_7falseShow Price Channel
v_input_81900From Year
v_input_92100To Year
v_input_10trueFrom Month
v_input_1112To Month
v_input_12trueFrom day
v_input_1331To day

Source Pine Script

/*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")

Published by ChaoZhang on the FMZ strategy square · last modified 2023-09-21. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.

Build this with AgenKit

A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.

in Claude Code, Cursor, Codex & 4 more
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/ZZ-4-Price-Channel-Breakout-Strategy.md
  1. npx agenkit install engineering-kit in your project
  2. Paste the command into your agent and approve each phase
  3. Get tests, backtest, risk controls and a paper-trading switch

Understand it first

Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.

Related specs

esc

Try , , or .

↑↓ move↵ open