Range Filtered Trend Signals indicator

Range Filtered Trend Signals indicator

1. Introduction

The Range Filtered Trend Signals indicator (by AlgoAlpha) is a composite tool designed to help traders identify both tentative “in-range” price movements and decisive trend changes. By combining three powerful elements

  1. Kalman filter to smooth price noise,
  2. SuperTrend algorithm to gauge directional bias on the filtered line, and
  3. volatility-based range filter to spot mild breakouts—
    this indicator offers clear visual cues for entries and exits on any market or timeframe.

Why combine these components?

  • Noise reduction: The Kalman filter adaptively smooths price data, preserving real movements while suppressing random fluctuations.
  • Trend bias: SuperTrend applied to the smoothed line defines when the market is trending up or down.
  • Range filtering: Dynamic bands based on recent volatility highlight genuine momentum moves without overreacting to micro-noise.

Together, they produce two distinct signal types:

  • “In-range” breakouts (dots when price crosses a volatility band but trend has not yet shifted), and
  • Trend-change alerts (colored fills when the filtered line flips relative to the SuperTrend).

2. Input Parameters

Parameter Default Description Recommended Range
kalmanAlpha 0.01 Measurement noise coefficient; smaller values yield smoother filtering but slower response. 0.005 – 0.05
kalmanBeta 0.10 Process noise coefficient; controls adaptability of the error covariance update. 0.05 – 0.2
kalmanPeriod 77 Period factor in the Kalman update; higher values emphasize longer-term smoothing. 50 – 150
dev 1.20 Multiplier for the range bands; determines band width relative to recent volatility. 1.0 – 2.0
supertrendFactor 0.70 ATR multiplier for SuperTrend; larger values produce wider SuperTrend bands (less frequent flips). 0.5 – 3.0
supertrendAtrPeriod 7 ATR look-back for SuperTrend; controls sensitivity to true range fluctuations. 5 – 14

Tip: Start with the default values, then tweak one group at a time (Kalman vs. SuperTrend vs. range factor) to match your preferred balance of responsiveness vs. noise suppression.

3. Internal Logic

3.1 Kalman Filter Smoothing

The Kalman filter produces a smoothed price line K by iteratively updating:

  1. Estimate update:
    – v3 = kalmanAlpha * kalmanPeriod
    – gain = v2 / (v2 + v3)
    – v1 = v1_prev + gain * (close – v1_prev)
  2. Error covariance update:
    – v2 = (1 – gain) * v2 + kalmanBeta / kalmanPeriod

Here, v1 is the estimated true price, and v2 is its error variance. Smaller kalmanAlpha/larger kalmanPeriod yield heavier smoothing; a higher kalmanBeta adapts variance faster when volatility changes.

3.2 SuperTrend on the Filtered Line

Using the smoothed series K as the “price,” a standard SuperTrend computation defines two bands:

  • UpperBand = K + supertrendFactor × ATR(supertrendAtrPeriod)
  • LowerBand = K – supertrendFactor × ATR(supertrendAtrPeriod)

Logic ensures each band only moves in a favorable direction (Upper never decreases unless broken, Lower never increases unless broken). The SuperTrend line itself alternates between the latest Upper and Lower band depending on whether K is above or below the prior band—yielding a clean up/down bias on the Kalman-filtered price.

3.3 Volatility-Based Range Filter

A Weighted Average of the daily range (high – low) over 200 bars defines vola—a smoothed measure of recent volatility. Two dynamic range bands are then set:

  • UpperRange = K + dev × vola
  • LowerRange = K – dev × vola

These bands capture typical short-term swings around the Kalman line.

3.4 Signal Generation

The indicator produces two types of visual signals:

  1. In-Range Breakouts:
    • When the current close crosses above UpperRange or below LowerRangeand the SuperTrend line has not just flipped (isupertrend = isupertrend[1]), a small dot is plotted at the breakout point. This flags a potential pullback or continuation within the prevailing trend.
  2. Trend-Change Alerts:
    • When the SuperTrend line flips (i.e., its value differs from the prior bar) and K has crossed through the old band, the chart background (or the Kalman line) is filled in green for an up-flip or red for a down-flip. This highlights a more decisive shift in market direction.

4. Interpretation of Signals

  1. In-Range Breakouts (Dots):
    • Purpose: Catch smaller, intra-trend opportunities without waiting for a full trend flip.
    • How to trade: Look for price retests of the breakout level or close-of-bar confirmation before entering in the direction of the predominant trend.
  2. Trend-Change Alerts (Fills):
    • Purpose: Identify robust reversals when noise has been removed and volatility bands confirm momentum beyond typical ranges.
    • How to trade: Consider these as primary entry/exit points—enter on the next bar after the fill appears, or wait for a retest of the SuperTrend line for a more conservative approach.

Example Scenario: On an hourly chart of EUR/USD, price may cross the upper range band (dot signal) three times, indicating small pullbacks within an uptrend. Eventually, the Kalman-filtered line pierces the SuperTrend band and the background turns green—a high-conviction signal to establish a new long position.

5. Configuration and Advanced Adjustments

  • Adapting to Timeframes:
    • Shorter timeframes (e.g., 5 min) often require a smaller kalmanPeriod (e.g., 50) and slightly higher dev (e.g., 1.5) to avoid false dots.
    • Longer charts (daily/weekly) benefit from a larger kalmanPeriod (100–150) and modest supertrendFactor (1.5–2.0) for stable swings.
  • Optimizing Kalman vs. SuperTrend:
    • Increase kalmanBeta if the filter is too sluggish to adapt after sudden volatility spikes.
    • Raise supertrendAtrPeriod if you want the trend filter to ignore small whipsaws.
  • Volatility Regime Tuning:
    • In trending, low-volatility markets, reduce dev toward 1.0 to tighten bands and capture earlier in-range moves.
    • In choppy/high-volatility periods, raise dev toward 2.0 to avoid over-signaling.
  • Combining with Other Tools:
    • Use higher-timeframe Simple Moving Averages or RSI to confirm the direction flagged by this indicator.
    • Overlay support/resistance zones to validate Swing entries on dot signals.

6. Full ProBuilder Code

Share this

Risk disclosure:

No information on this site is investment advice or a solicitation to buy or sell any financial instrument. Past performance is not indicative of future results. Trading may expose you to risk of loss greater than your deposits and is only suitable for experienced investors who have sufficient financial means to bear such risk.

ProRealTime ITF files and other attachments : How to import ITF files into ProRealTime platform?

PRC is also on YouTube, subscribe to our channel for exclusive content and tutorials

  1. larouedegann • 7 days ago #

    format de fichier incorrect ???

  2. Iván • 7 days ago #

    ohh! I exported from V13… If you are working with V12 you will not be able to load. Sorry
    You can copy and paste the code

    • roccafragius • 6 days ago #

      Hi Ivan, thanks a lot, very useful. I trieed to put a timeframe of 3 minutes on the first line and a timeframe default before the colorbwtween instractions, in order to use it in the windows of 1 minutes
      Unfortunatelly it doesn’t work , please could you check what it is wrong?

      //—————————————————–//
      //PRC_Range Filtered Trend Signals | indicator
      //16.06.2025
      //Iván González @ http://www.prorealcode.com
      //Sharing ProRealTime knowledge
      //translated from tradingview code
      //—————————————————–//
      // — Parámetros de Entrada —
      //—————————————————–//
      // Grupo Filtro Kalman
      TIMEFRAME(3 minutes, UPDATEONCLOSE )
      kalmanAlpha = 0.01
      kalmanBeta = 0.1
      kalmanPeriod = 77
      dev = 1.2
      // Grupo Supertrend
      supertrendFactor = 0.7
      supertrendAtrPeriod = 7
      //—————————————————–//
      // — Lógica del Filtro Kalman —
      //—————————————————–//
      ONCE v2 = 1.0
      IF BarIndex <= 1 THEN
      v1 = close[1]
      else
      v3 = kalmanAlpha * kalmanPeriod
      v5 = v1
      v4 = v2 / (v2 + v3)
      v1 = v5 + v4 * (close – v5)
      v2 = (1 – v4) * v2 + kalmanBeta / kalmanPeriod
      ENDIF
      k = v1 // Línea del Filtro Kalman
      //—————————————————–//
      // — Lógica del Supertrend —
      //—————————————————–//
      src=k
      atr=averagetruerange[supertrendAtrPeriod]

      upperband=src+supertrendFactor*atr
      lowerband=src-supertrendFactor*atr

      if barindexlowerband[1] or k[1]<lowerband[1] then
      lowerband=lowerband
      else
      lowerband=lowerband[1]
      endif

      if upperbandupperband[1] then
      upperband=upperband
      else
      upperband=upperband[1]
      endif

      if isupertrend[1]=upperband[1] then
      if k>upperband then
      direction=-1
      else
      direction=1
      endif
      else
      if k<lowerband then
      direction=1
      else
      direction=-1
      endif
      endif

      if direction=-1 then
      isupertrend=lowerband
      else
      isupertrend=upperband
      endif

      endif
      //—————————————————–//
      // — Lógica Principal del Indicador —
      //—————————————————–//
      vola = WeightedAverage[200](high – low)

      // Bandas del Filtro de Rango
      upper = k + vola * dev
      lower = k – vola * dev

      midbody = (close + open) / 2
      //—————————————————–//
      // — Visualización y Dibujo —
      //—————————————————–//
      rk=124
      gk=124
      bk=124
      ak=255

      if close crosses over upper and isupertrend=isupertrend[1] then
      r=124
      g=124
      b=124
      a1=255
      a2=255
      inrange=1
      elsif close crosses under lower and isupertrend=isupertrend[1] then
      r=124
      g=124
      b=124
      a1=255
      a2=255
      inrange=1
      elsif isupertrendisupertrend[1] and k<isupertrend then
      r=255
      g=0
      b=0
      a1=255
      a2=0
      inrange=0
      elsif isupertrendisupertrend[1] and k>isupertrend then
      r=0
      g=255
      b=0
      a1=0
      a2=255
      inrange=0
      endif
      if inrange=1 then
      ak=0
      endif
      TIMEFRAME(default, UPDATEONCLOSE )
      //—————————————————–//
      colorbetween(k,midbody,r,g,b,ak*0.1)
      colorbetween(lower,upper,124,124,124,30*inrange)
      //—————————————————–//
      return k as “K” style(line,3)coloured(rk,gk,bk,ak), upper as “Upper” coloured(r,g,b,a1)style(point,2), lower as “Lower” coloured(r,g,b,a2)style(point,2)

    • Iván • 6 days ago #

      Change line 23 for this IF BarIndex <= 2 THEN

  3. roccafragius • 6 days ago #

    Thank you so much!!!!!! :):)

  4. roccafragius • 5 days ago #

    Hi Ivan, unfortunatelly I still hace some problem using timeframe 3 minutes in 1 minutes, the indicator it seems is not working fine. Using the original in 3 minutes the result is different. I opened a post in https://www.prorealcode.com/topic/use-of-indicator-with-timeframe-3-minutes-in-wiindow-with-1-minute/ in order to be able to attach the screenshot of the display. Please could you take a look? Thank you in advance!! Ciao Franco

avatar
Register or

Likes

avatar avatar
Related users ' posts
Nicolas Rien, il faut l'appliquer sur la charte. Soit le mettre sur le graphique du prix, à l'aide d...
signorini Merci pour votre réponse. Je l'applique sur la charte, j'utilise la petite clé pour effacer ...
signorini Je vous remercie, Nicolas. C'est fixé. Très bon week-end.
Abz  hi , you need to add the indicator from the "price" menu in chart
Francesco Thank you Abz!
phanz Hi Nicolas, this is an interesting strategy. For long position, I assume entry when prices ...
Krallenmann Hallo Nicolas, kannst du mir die Regeln für den Halftrend Indikator sagen? Aus dem Code kann...
davefransman Dear Nicolas, i want set a alert on the "HalfTrend "custom moving average" met Heikin Ashi w...
Nicolas Please post the question in a new forum topic, that would need custom coding I believe.
Lyam Pareil ne marche pas dommage
ahmedbouaziz89 Bonjour, quand j'ajoute le code ou le fichier dans l'outils screeners de Prorealtime je ne v...
tyvix Bonjour le code marche bien c est juste qu'il n y a pas d opportunité au moment ou vous le...
verdi55 Is there such a thing as a free lunch ?
maceng Thanks Nicolas for this great work! I would like to understand the math behind it in order t...
Nicolas Sorry I have no time to provide assistance for python programmers. Have a good day.
Maz Hi all, firstly happy to know that this is helping you. I look into updating it for PRT11 wh...
Nicolas just use 3 times a linear regression channel code you will find in the library.
leederbyshire Here's the link to alternative linear regression channel indicator Nicolas is referring to t...
Wing Yes, investigate as much as you want. For more insight, you can view the linet1, linet2 etc....
CKW Hi Wing, Thanks for your sharing. I am still trying to breakdown & understand your code...
Wing Hello CKW. No, the parameter, 7 in this case, is used when calling the RSI indicator to ide...
Nicolas Je vais faire l'indicateur et expliquer comment en même temps dans un sujet de forum. Plus s...
gregus merci nicolas toute ma gratitude est pour toi sa sera bien pratique car je pense ne pas etre...
Nicolas Ok merci donc d'ouvrir un sujet spécifique pour cette demande donc :) 
algotrader This indicator looks coolBut on attempt to use it for a strategy dev'I get an error.."The in...
dajvop @algotrader if you at the bottom of the code add: RETURN Buffer1 as "up", Buffer2 as "down",...
Bateson Si cela peut servir, l'indicateur Sadukey a été créé en utilisant un générateur de filtre ap...
Nicolas
9 years ago
ALMA MACD
ALMA MACD
7
Indicators
Arnaud HALVICK Great indicator, thank you!
JMat45 Hi Nicolas, just reviewing this indicator and noticed that you have double assigned the vari...
Nicolas That would not make any difference because the code is read from top to bottom.
MikeGC I don't know if you have used the variables a and b to optimise the parameters for the Super...
gianpiero75 I have not optimized, I multiplied the parameters for 6 (5,8), to use them on the 4  hoursTF...
bertrandpinoy bonjour Mike j utilise TrendChaser V2.0 et quand il prend position cela ne programme pas le ...
Pelle Nævestad Thanks Nicolas, this is a keeper!
Chicane23 Hi, when uploaded the WAE isnt showing histogram; only line. Is there a way to modify?
Nicolas Change the way the lines are displayed in the indicator settings window : histogram, lines, ...
Dimi.A Perfect for counter-trend scalping. I like this!
viktorthuns Hi Nicolas! Great work you've done with all your indicators. Just wondering about the code a...
Nicolas the value is not a boolean but an average of an addition of booleans. As stated in the descr...
eisi If i switch between different Markets, the Backgroundcolour will appear where it should not...
datageek How can I get alerts on colour change?
NAMBO40 Hello, I would like to add a 25 period SMA moving average. It's possible?
Fabio Anthony Terrenzio this strategy works only in a well defined trend
brosly Good afternoon I am trying to get the complete code of lex strategy made by adolfo since I s...
dreif123 hi Adolfo, is Alex Auto Trading Botindex working on DAX as well ? if so , can you post the...
Doctrading I forgot to write at the beginning :  a = 50 b = 50 These are intermediate levels Sorry
DerPat Thank you. This one could be an aid in my current research on stochastics.
Pelayo it is possible that in line 12 we should put seuilinf=-b, thaks for all
Doctrading Hello, Someone asked me something (his results seemed to be different) on my email, but it ...
Glen Marquis Not your best..So what is your best strategy? :)
GraHal Hi Nicolas I like this and would like to understand it fully so please forgive the (maybe) d...
Nicolas Hi GraHal, the Factor parameter is only a multiplier of the ATR that is added or subtracted ...
GraHal Nicolas, thank you for your useful and informative response. Yes I optimise using ProBackte...

Top