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.
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.
/*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] )