What is the Range Filter?
As the author of the original Range Filter describes it:
“This is an experimental study designed to filter out minor price action for a clearer view of trends. Inspired by the QQE’s volatility filter, this filter applies the process directly to price rather than to a smoothed RSI .
First, a smooth average price range is calculated for the basis of the filter and multiplied by a specified amount.
Next, the filter is calculated by gating price movements that do not exceed the specified range.
Lastly the target ranges are plotted to display the prices that will trigger filter movement.
Other different versions of the Range Filter code can be found here in the Library:
// Original Script > @DonovanWall
// Adapted Version > @guikroth
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////
// Color variables
downColorR = 255
downColorG = 69
downColorB = 0
upColorR = 50
upColorG = 205
upColorB = 50
midColorR = 0
midColorG = 191
midColorB = 255
// Source
src = customclose
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
// per = defval=100, minval=1, "Sampling Period"
// Range Multiplier
// mult = defval=3.0, minval=0.1, "Range Multiplier"
// Smooth Average Range
wper = per*2 -1
avrng = exponentialaverage[per](abs(src-src[1]))
smrng = mult * exponentialaverage[wper](avrng)
// Range Filter
rngfilt = src
If src > rngfilt[1] then
If rngfilt[1] > src-smrng then
rngfilt = rngfilt[1]
Else
rngfilt = src-smrng
endif
elsif rngfilt[1] < src+smrng then
rngfilt = rngfilt[1]
else
rngfilt = src+smrng
endif
filt = rngfilt
// Filter Direction
upward = 0
If filt > filt[1] then
upward = upward[1]+1
elsif filt < filt[1] then
upward = 0
else
upward = upward[1]
endif
downward = 0
If filt < filt[1] then
downward = downward[1]+1
elsif filt > filt[1] then
downward = 0
else
downward = downward[1]
endif
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Colors
If upward > 0 then
filtcolorR = upColorR
filtcolorG = upColorG
filtcolorB = upColorB
elsif downward > 0 then
filtcolorR = downColorR
filtcolorG = downColorG
filtcolorB = downColorB
else
filtcolorR = midColorR
filtcolorG = midColorG
filtcolorB = midColorB
endif
if src > filt and src > src[1] and upward > 0 then
barcolorR = upColorR
barcolorG = upColorG
barcolorB = upColorB
elsif src > filt and src < src[1] and upward > 0 then
barcolorR = upColorR
barcolorG = upColorG
barcolorB = upColorB
elsif src < filt and src < src[1] and downward > 0 then
barcolorR = downColorR
barcolorG = downColorG
barcolorB = downColorB
elsif src < filt and src > src[1] and downward > 0 then
barcolorR = downColorR
barcolorG = downColorG
barcolorB = downColorB
else
barcolorR = midColorR
barcolorG = midColorG
barcolorB = midColorB
endif
colorbetween(hband,filt,upColorR,upColorG,upColorB,30)
colorbetween(lband,filt,downColorR,downColorG,downColorB,30)
// Break Outs
longCond = (src > filt and src > src[1] and upward > 0) or (src > filt and src < src[1] and upward > 0)
shortCond = (src < filt and src < src[1] and downward > 0) or (src < filt and src > src[1] and downward > 0)
CondIni = 0
If longCond then
CondIni = 1
elsif shortCond then
CondIni = -1
else
CondIni = CondIni[1]
endif
longCondition = longCond and CondIni[1] = -1
shortCondition = shortCond and CondIni[1] = 1
//Alerts
If longCondition then
Drawarrowup(barindex,low-AverageTrueRange[14](close)) coloured("green",255)
endif
If shortCondition then
Drawarrowdown(barindex,high+AverageTrueRange[14](close)) coloured("red",255)
endif
Return filt style(line,4) coloured(barcolorR,barcolorG,barcolorB,255) as "Range Filter", hband style(line,2) coloured(upColorR,upColorG,upColorB,100) as "High Target", lband style(line,2) coloured(downColorR,downColorG,downColorB,100) as "Low Target"