I Seek Trends is a SuperTrend-style indicator that introduces a concept rarely seen in trend-following tools: a neutral expansion phase. While traditional SuperTrend indicators flip between bullish and bearish states, this indicator recognizes that markets often need time to establish a new direction after a trend ends. The neutral phase provides that buffer, reducing false signals during consolidation periods.
The name reflects the indicator’s purpose: it actively seeks confirmed trends rather than reacting impulsively to every price crossover.
The classic SuperTrend indicator, popularized by Olivier Seban, uses ATR-based bands that flip between support (in uptrends) and resistance (in downtrends). When price crosses the band, the indicator immediately switches direction.
This binary behavior creates a well-known problem: whipsaws during consolidation. When a trend ends and price enters a range, the SuperTrend flips back and forth, generating false signals. Traders either get stopped out repeatedly or learn to distrust the indicator during these periods.
I Seek Trends addresses this by introducing intermediate states that require confirmation before committing to a new trend direction.
Unlike traditional two-state trend indicators, I Seek Trends operates with five distinct states:
The state transitions follow a logical flow that requires confirmation:
The same logic applies in reverse for bearish-to-bullish transitions through state -2.
A one-bar lag is built into the transition logic. When entering a neutral state, the indicator waits one bar before allowing further transitions. This prevents the indicator from rapidly cycling through states on volatile bars and ensures each state has time to be visually recognized by the trader.
The indicator uses three separate ATR multipliers, allowing asymmetric configuration:
The indicator offers two options for measuring volatility:
The priceLength parameter applies smoothing to the price used for band calculation. Instead of using raw close prices, the indicator uses a simple moving average of the close. This reduces noise in the band placement and can help prevent false breakouts caused by single-bar spikes.
Higher smoothing values create more stable bands but may lag significant price moves. Lower values keep the bands responsive but may generate more state transitions.
The indicator displays support and resistance as both dots and lines for clear visibility:
// ============================================================================
// PRC_I Seek Trends
// 01/30/2026
// Nicolas @ www.prorealcode.com
// Coding & Trading with ProRealTime
// ============================================================================
// SuperTrend-style ATR trailing stop with neutral expansion phase
//
// STATES:
// 1 = Bullish (green dot only, multUp)
// -1 = Bearish (red dot only, multDown)
// 2 = Neutral from Bullish (green=multSide, red=multDown) - waiting confirmation
// -2 = Neutral from Bearish (green=multUp, red=multSide) - waiting confirmation
// 0 = Full Neutral (both sides multSide) - after failed breakout
//
// ============================================================================
// ---- Parameters
multUp = 5
multDown = 2
multSide = 5
IndLength = 14
indicator = 0
priceLength = 20
// ---------------------
// ATR
//IndLength = 14
if indicator = 0 then
indic = AverageTrueRange[IndLength]
elsif indicator = 1 then
indic = std[IndLength]
endif
IF BarIndex < IndLength+priceLength THEN
state = 0
supLine = average[priceLength,1](close)- indic * multSide
resLine = average[priceLength,1](close) + indic * multSide
neutralBar = 0
ELSE
state = state[1]
supLine = supLine[1]
resLine = resLine[1]
neutralBar = neutralBar[1]
ENDIF
IF state = 1 THEN
// BULLISH: green dot trails up (multUp), no red dot
newSup = average[priceLength,1](close)- indic * multUp
supLine = MAX(supLine, newSup)
// Break down -> Neutral from Bullish
IF close < supLine THEN
state = 2
neutralBar = 1 // Start lag counter
supLine = average[priceLength,1](close)- indic * multSide // Green expands to multSide
resLine = average[priceLength,1](close) + indic * multDown // Red appears with multDown
ENDIF
ELSIF state = -1 THEN
// BEARISH: red dot trails down (multDown), no green dot
newRes = average[priceLength,1](close) + indic * multDown
resLine = MIN(resLine, newRes)
// Break up -> Neutral from Bearish
IF close > resLine THEN
state = -2
neutralBar = 1 // Start lag counter
resLine = average[priceLength,1](close) + indic * multSide // Red expands to multSide
supLine = average[priceLength,1](close)- indic * multUp // Green appears with multUp
ENDIF
ELSIF state = 2 THEN
// NEUTRAL FROM BULLISH: green=multSide (trailing), red=multDown (trailing)
newSup = average[priceLength,1](close)- indic * multSide
newRes = average[priceLength,1](close) + indic * multDown
supLine = MAX(supLine, newSup)
resLine = MIN(resLine, newRes)
// Only allow transitions after lag period
IF neutralBar = 0 THEN
// Break down below green -> confirm Bearish
IF close[1] < supLine[1] THEN
state = -1
resLine = average[priceLength,1](close) + indic * multDown
// Break up above red -> Full Neutral (both multSide)
ELSIF close[1] > resLine[1] THEN
state = 0
neutralBar = 1 // Reset lag for full neutral
supLine = average[priceLength,1](close)- indic * multSide
resLine = average[priceLength,1](close) + indic * multSide
ENDIF
ELSE
neutralBar = 0 // Clear lag after 1 bar
ENDIF
ELSIF state = -2 THEN
// NEUTRAL FROM BEARISH: red=multSide (trailing), green=multUp (trailing)
newSup = average[priceLength,1](close)- indic * multUp
newRes = average[priceLength,1](close) + indic * multSide
supLine = MAX(supLine, newSup)
resLine = MIN(resLine, newRes)
// Only allow transitions after lag period
IF neutralBar = 0 THEN
// Break up above red -> confirm Bullish
IF close[1] > resLine[1] THEN
state = 1
supLine = average[priceLength,1](close)- indic * multUp
// Break down below green -> Full Neutral (both multSide)
ELSIF close[1] < supLine[1] THEN
state = 0
neutralBar = 1 // Reset lag for full neutral
supLine = average[priceLength,1](close)- indic * multSide
resLine = average[priceLength,1](close) + indic * multSide
ENDIF
ELSE
neutralBar = 0 // Clear lag after 1 bar
ENDIF
ELSIF state = 0 THEN
// FULL NEUTRAL: both multSide, trailing both
newSup = average[priceLength,1](close)- indic * multSide
newRes = average[priceLength,1](close) + indic * multSide
supLine = MAX(supLine, newSup)
resLine = MIN(resLine, newRes)
// Only allow transitions after lag period
IF neutralBar = 0 THEN
// Break up -> Bullish
IF close[1] > resLine[1] THEN
state = 1
supLine = average[priceLength,1](close)- indic * multUp
// Break down -> Bearish
ELSIF close[1] < supLine[1] THEN
state = -1
resLine = average[priceLength,1](close) + indic * multDown
ENDIF
ELSE
neutralBar = 0
ENDIF
ENDIF
// Green dot visibility
IF state = 1 OR state = 2 OR state = -2 OR state = 0 THEN
greenDot = supLine
greenAlpha = 255
ELSE
greenDot = supLine
greenAlpha = 0
ENDIF
// Red dot visibility
IF state = -1 OR state = 2 OR state = -2 OR state = 0 THEN
redDot = resLine
redAlpha = 255
ELSE
redDot = resLine
redAlpha = 0
ENDIF
rr=10
rg=10
rb=10
gr=10
gg=10
gb=10
if state=1 then
gr=0
gg=200
gb=30
elsif state=-1 then
rr=200
gg=0
gb=30
elsif (state=0 or state=2 or state=-2) then
rr=128
rg=128
rb=128
gr=128
gg=128
gb=128
endif
RETURN greenDot COLOURED(gr,gg,gb,greenAlpha) STYLE(point,2) AS "Support", redDot COLOURED(rr,rg,rb,redAlpha) STYLE(Point,2) AS "Resistance", greenDot COLOURED(gr,gg,gb,greenAlpha) STYLE(line,2) AS "Support", redDot COLOURED(rr,rg,rb,redAlpha) STYLE(line,2) AS "Resistance"
For trend following, enter long positions when the indicator transitions to state 1 (confirmed bullish) and exit when it leaves state 1. The neutral phases keep you out of choppy markets where trend-following strategies typically underperform.
For position management, use the support and resistance levels as dynamic stop-loss placements. The asymmetric multipliers let you set tighter stops in one direction if your strategy has a directional bias.
For market regime identification, monitor what percentage of time the indicator spends in neutral states versus trending states. Instruments or timeframes with high neutral-state percentages may not be suitable for trend-following approaches.
For confirmation, combine the indicator with momentum oscillators or volume analysis. Enter only when both the trend state and your secondary indicator align.
The key difference is patience. Standard SuperTrend reacts immediately to every crossover. I Seek Trends requires confirmation, accepting slightly later entries in exchange for fewer false signals.
In trending markets, both indicators perform similarly once the trend is established. The difference emerges at trend transitions where I Seek Trends filters out many of the whipsaws that plague the standard version.
The tradeoff is that genuine reversals will be signaled slightly later. The neutral phase confirmation requirement means you cannot catch the exact bottom or top. For most traders, this is an acceptable cost for improved signal quality.