Range Breakout Momentum Tracking Strategy
This strategy combines range, momentum and trend-following indicators to capture short-term trends. The rules are: 1. Calculate the price range over a period (high minus low) and smooth it to get a smooth range…
Strategy Logic
This strategy combines range, momentum and trend-following indicators to capture short-term trends. The rules are:
Calculate the price range over a period (high minus low) and smooth it to get a smooth range indicator. This measures trend strength.
Compute a momentum indicator like the Hull curve over a timeframe. The Hull curve is effective in gauging short-term trend direction and strength.
When the smoothed range indicator changes color (e.g. red to green), it signals expanding range, and a long entry is taken if the Hull curve aligns (e.g. pointing up).
When the smoothed range flips color (e.g. green to red), it signals contracting range, and a short entry if taken if the Hull curve aligns (e.g. pointing down).
Add a trend-following stop loss mechanism like exiting longs if the Hull curve turns down.
Expanding ranges with directional momentum allows fast capturing of short-term trends. Trend-following stops control risk.
Advantages
- Combines multiple indicators for robust signals
- Range measures expansion, momentum gives direction
- Quickly capitalizes on short-term opportunities
Risks
- Prone to getting trapped, need timely stops
- Higher trade frequency means more costs
- Less effective in long sideways ranges
Summary
This strategy uses multiple technical indicators to quickly capitalize on short-term trends. Compared to long-term strategies, it trades more frequently to capture price swings. Strict stops are required to control risks.
Parameters
| Name | Default | What it controls |
|---|---|---|
| v_input_4 | 55 | Length(180-200 for floating S/R , 55 for swing entry) |
| v_input_int_3 | 21 | BB Period |
| v_input_float_2 | true | BB Deviations |
| v_input_bool_1 | true | ATR Filter |
| v_input_int_4 | 5 | ATR Period |
| v_input_bool_2 | false | Hide Labels |
| v_input_color_1 | green | (?Color)Range Filter Color Up |
| v_input_color_2 | red | Range Filter Color Up |
| v_input_color_3 | green | Hull Color Up |
| v_input_color_4 | red | Hull Color Up |
| v_input_color_5 | green | Follow Line Color Up |
| v_input_color_6 | red | Follow Line Color Up |
| v_input_1_ohlc4 | 0 | (?Range Filter)Source: ohlc4 | high | low | open | hl2 | hlc3 | hlcc4 | close |
| v_input_int_1 | 33 | Sampling Period |
| v_input_float_1 | 2.1 | Range Multiplier |
| v_input_2_close | 0 | (?Hull Suite)Source: close | high | low | open | hl2 | hlc3 | hlcc4 | ohlc4 |
| v_input_3 | 0 | Hull Variation: Ehma | Thma | Hma |
| v_input_5 | true | Color Hull according to trend? |
| v_input_6 | true | Show as a Band? |
| v_input_7 | true | Line Thickness |
| v_input_int_2 | 40 | Band Transparency |
Source Pine Script
/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-30 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © flygalaxies
// Strategy based on the Follow Line Indicator by Dreadblitz, Hull Suite by InSilico and Range Filter Buy and Sell 5 min by guikroth
// Designed for the purpose of back testing
// Strategy:
// - When the Range Filter Color Changes, And the HULL Suite is in that direction, Enter In that direction
// - e.g Range Filter Changes color from red to green, and Hull Suite is in Green. Enter Long
// - e.g Range Filter Changes color from green to red, and Hull Suite is in red. Enter Short
//
// Credits:
// Hull Suite by InSilico https://www.tradingview.com/u/InSilico/
// Range Filter Buy and Sell 5 min https://www.tradingview.com/u/guikroth/
// Follow Line Indicator by Dreadblitz https://www.tradingview.com/u/Dreadblitz/
// Follow line not used at this moment
//@version=5
strategy("Follow The Ranging Hull", overlay=true, initial_capital = 50000)
////////////////////
// COLOR INPUTS ///
//////////////////
rngFilterColorUp = input.color(title="Range Filter Color Up", defval = color.green, group="Color")
rngFilterColorDown = input.color(title="Range Filter Color Up", defval = color.red, group="Color")
hullColorUp = input.color(title="Hull Color Up", defval = color.green, group="Color")
hullColorDown = input.color(title="Hull Color Up", defval = color.red, group="Color")
fliColorUp = input.color(title="Follow Line Color Up", defval = color.green, group="Color")
fliColorDown = input.color(title="Follow Line Color Up", defval = color.red, group="Color")
///////////////////////////
// Range Filter INPUTS ///
/////////////////////////
src = input(defval=ohlc4, title="Source", group="Range Filter")
per = input.int(defval=33, minval=1, title="Sampling Period", group="Range Filter")
mult = input.float(defval=2.1, minval=0.1, title="Range Multiplier", group="Range Filter", step=0.1)
/////////////////////////
// Hull Suite INPUTS ///
///////////////////////
srcHull = input(close, title="Source", group="Hull Suite")
modeSwitch = input("Ehma", title="Hull Variation", options=["Hma", "Thma", "Ehma"], group="Hull Suite")
length = input(55, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?", group="Hull Suite")
visualSwitch = input(true, title="Show as a Band?", group="Hull Suite")
thicknesSwitch = input(1, title="Line Thickness", group="Hull Suite")
transpSwitch = input.int(40, title="Band Transparency",step=5, group="Hull Suite")
//////////////////////////
// FOLLOW LINE INPUTS ///
////////////////////////
BBperiod = input.int(defval = 21, title = "BB Period", minval = 1)
BBdeviations = input.float(defval = 1.00, title = "BB Deviations", minval = 0.1, step=0.05)
UseATRfilter = input.bool(defval = true, title = "ATR Filter")
ATRperiod = input.int(defval = 5, title = "ATR Period", minval = 1)
hl = input.bool(defval = false, title = "Hide Labels")
//////////////////////////
// Range Filter Logic ///
////////////////////////
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ta.ema(math.abs(x - x[1]), t)
smoothrng = ta.ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r :
x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
rngfilt
filt = rngfilt(src, smrng)
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
filtcolor = upward > 0 ? rngFilterColorUp : downward > 0 ? rngFilterColorDown : color.orange
filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")
////////////////////////
// Hull Suite Logic ///
//////////////////////
HMA(_srcHull, _length) => ta.wma(2 * ta.wma(_srcHull, _length / 2) - ta.wma(_srcHull, _length), math.round(math.sqrt(_length)))
EHMA(_srcHull, _length) => ta.ema(2 * ta.ema(_srcHull, _length / 2) - ta.ema(_srcHull, _length), math.round(math.sqrt(_length)))
THMA(_srcHull, _length) => ta.wma(ta.wma(_srcHull,_length / 3) * 3 - ta.wma(_srcHull, _length / 2) - ta.wma(_srcHull, _length), _length)
Mode(modeSwitch, src, len) =>
modeSwitch == "Hma" ? HMA(src, len) :
modeSwitch == "Ehma" ? EHMA(src, len) :
modeSwitch == "Thma" ? THMA(src, len/2) : na
_hull = Mode(modeSwitch, src, int(length))
HULL = _hull
MHULL = HULL[0]
SHULL = HULL[2]
hullColor = switchColor ? (HULL > HULL[2] ? hullColorUp : hullColorDown) : #ff9800
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
/////////////////////////
// Follow Line Logic ///
///////////////////////
BBUpper=ta.sma (close,BBperiod)+ta.stdev(close, BBperiod)*BBdeviations
BBLower=ta.sma (close,BBperiod)-ta.stdev(close, BBperiod)*BBdeviations
TrendLine = 0.0
iTrend = 0.0
buy = 0.0
sell = 0.0
BBSignal = close>BBUpper? 1 : close<BBLower? -1 : 0
if BBSignal == 1 and UseATRfilter == 1
TrendLine:=low-ta.atr(ATRperiod)
if TrendLine<TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == -1 and UseATRfilter == 1
TrendLine:=high+ta.atr(ATRperiod)
if TrendLine>TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == 0 and UseATRfilter == 1
TrendLine:=TrendLine[1]
//
if BBSignal == 1 and UseATRfilter == 0
TrendLine:=low
if TrendLine<TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == -1 and UseATRfilter == 0
TrendLine:=high
if TrendLine>TrendLine[1]
TrendLine:=TrendLine[1]
if BBSignal == 0 and UseATRfilter == 0
TrendLine:=TrendLine[1]
//
iTrend:=iTrend[1]
if TrendLine>TrendLine[1]
iTrend:=1
if TrendLine<TrendLine[1]
iTrend:=-1
//
buy:=iTrend[1]==-1 and iTrend==1 ? 1 : na
sell:=iTrend[1]==1 and iTrend==-1? 1 : na
//
plot(TrendLine, color=iTrend > 0? fliColorUp : fliColorDown ,style=plot.style_line,linewidth=2,transp=0,title="Trend Line")
plotshape(buy == 1 and hl == false? TrendLine-ta.atr(8) :na, text='?', style= shape.labelup, location=location.absolute, color=color.blue, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 and hl == false ?TrendLine+ta.atr(8):na, text='?', style=shape.labeldown, location=location.absolute, color=color.red, textcolor=color.white, offset=0, transp=0,size=size.auto)
if(true)
// RANGE FILTER ENTRY LONG WITH HULL
// if(filtcolor[1] == rngFilterColorDown and filtcolor == rngFilterColorUp)
strategy.entry("rngFiltLong", strategy.long, when = buy == 1 and hl == false)
// RANGE FILTER ENTRY SHORT WITH HULL
// if(filtcolor[1] == rngFilterColorUp and filtcolor == rngFilterColorDown)
strategy.entry("rngFiltShort", strategy.short, when = sell == 1 and hl == false)
// strategy.close("rngFiltLong", when = HULL < HULL[2] )
// strategy.close("rngFiltShort", when = HULL > HULL[2] )
Published by ChaoZhang on the FMZ strategy square · last modified 2023-09-14. 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.
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Range-Breakout-Momentum-Tracking-Strategy.md- npx agenkit install engineering-kit in your project
- Paste the command into your agent and approve each phase
- 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
- BB Breakout StrategyPine Script · Breakout · 1d
- Donchian Channel and Larry Williams Large Trade Index StrategyPine Script · Breakout · 1m
- Dual Breakout Volatility Channel StrategyPine Script · Breakout · 1h
- Dual MA Momentum Breakout StrategyPine Script · Breakout · 1h
- EMA and Bollinger Bands Breakout StrategyPine Script · Breakout · 1h
- Flexible Long Short Trading Strategy Based on Keltner ChannelsPine Script · Breakout · 1d