Lagging Indicator Accuracy In ThinkOrSwim

bobhobe

New member
I use moving average that identifies breakout points.
The accuracy of the breakout/breakdown points are not that good.
Any suggestions to improve accuracy would be appreciated.
 
Last edited by a moderator:
Why Lagging Indicators Can Trip Up DayTraders
Lagging Indicators like Short Moving averages (MAs) are popular tools; and serve as training wheels for new traders to learn to read charts. Therefore, perform an essential service.

But Lagging Strategies are not a profitable overall option.
This is because they come with a built-in lag that quietly eats away at profits.
For daytraders trying to catch quick moves, this delay—plus the chaos of choppy markets—can make trading way harder than it needs to be.

Late Entries, Missed Opportunities
Lagging Indicators are based on past prices, not what's happening right now. That means by the time it tells you to buy, the price has already taken off. You’re jumping in late—after the best part of the move is gone.

For example, if you're using a crossover strategy, such as 9ema crossing above 20ema, the “buy” signal often shows up after the surge. You end up buying late, which shrinks your profit potential right from the start.

Delayed Exits, Lost Gains
That same lag also messes with your exit. When a trend starts to fade, the lagging indicator doesn’t react fast enough. So while the price is already dropping, you're still holding on—waiting for the MA to catch up.

By the time it signals “sell,” you’ve given back a chunk of your gains. It’s like showing up late to a party and being stuck there even though the fun’s already over.

Whipsaws: The Choppy Market Trap
In sideways or range-bound markets, prices bounce around without a clear direction. This is where lagging indicators can really mislead you.

In chop, they trigger a bunch of false signals. You might go long on a bullish cross, only to get stopped out when the price flips back down. Repeat that a few times, and you’re racking up small losses fast.


⚠️ The Big Picture: Why Lagging Indicators Can Hurt Day Traders
They work best in smooth, trending markets. But let’s be real—those aren’t guaranteed day to day.
  • In trending markets, the lag means you miss the juiciest part of the move.
  • In choppy markets, the lag creates fake signals that lead to losses and higher costs.
Put together, this combo makes it tough for day traders to consistently make money. You miss out when the market’s moving, and you bleed slowly when it’s not.


What New Day Traders Should Know
Lagging indicators are slow to react and can mislead you in messy markets.
Laggers like moving averages are great for spotting long-term trends, but for fast-paced day trading, they often cause late entries, early exits, and a pile of false signals. If you're relying on MAs alone, you're likely leaving profits on the table—and paying extra for the privilege.

Trending indicators are useful and integral when reviewing trend. Use of lagging indicators should be limited to confirming trend and never as entry.

What are the best indicators for day trading entry / exit:
https://usethinkscript.com/threads/what-are-the-best-indicators-in-thinkorswim.14498/#post-151586
https://usethinkscript.com/threads/using-oscillators-profitably-in-thinkorswim.11497/
 
Last edited:
this isn't bad but, it gives a delayed signal.
https://usethinkscript.com/threads/hma-arrow-on-price.13046/

After I tested it, I noticed I was giving a decent amount of money back especially if move is fast.
Question for you is, can you have the arrow present itself when the color of the Hull MA changes instead of relying on price change.

Thanks in advance.

You are correct.

Moving averages supertrends, and other trending indicators are meant to track TREND!
They make poor entry/exit for several reasons.
read more: https://usethinkscript.com/threads/lagging-indicator-accuracy-in-thinkorswim.15624/
 
Out of all the Hull MA Arrow combination Indicators this one works the best.
https://usethinkscript.com/threads/...t-scan-for-thinkorswim.947/page-5#post-102164

It's not as delayed as the others. You end up being one bar behind where with the others it was a two or three bar lag.
No, you are being fooled by a repainting indicator.
This indicator has even more delay than all other moving averages.

It uses futures bars.
It waits until the future and then goes back and retroactively paints the signal that looks nice but didn't show up in real time.
 
Last edited:
Awesome but it looks just to be following price action and it looks to have some lag. Do you think this is better than let's say the VIPMagicSupertrend or the AMM?
 
Awesome but it looks just to be following price action and it looks to have some lag. Do you think this is better than let's say the VIPMagicSupertrend or the AMM?

This study, SuperTrends, and the AMM2 are lagging indicators.

The amount of lag in an indicator depends on how far back it looks for data:
Shorter lookback periods: Less lag, but potentially more noise and less clear ranges or trends.
Longer lookback periods: More lag, but often provide a clearer picture of overall trends or ranges.

These indicators are primarily used for:
Identifying trends
Determining trading ranges
They are used for broader market analysis, not for timing entries and exits.
The lag actually helps smooth out short-term price fluctuations, providing a clearer overall picture.
 
This study, SuperTrends, and the AMM2 are lagging indicators.

The amount of lag in an indicator depends on how far back it looks for data:
Shorter lookback periods: Less lag, but potentially more noise and less clear ranges or trends.
Longer lookback periods: More lag, but often provide a clearer picture of overall trends or ranges.

These indicators are primarily used for:
Identifying trends
Determining trading ranges
They are used for broader market analysis, not for timing entries and exits.
The lag actually helps smooth out short-term price fluctuations, providing a clearer overall picture.
THANK YOU
 
That “top 10 indicators” list is the usual beginner menu, and a lot of it is confirmation after the move, not useful signal before the trade.
For swing trading, I’d split indicators into three buckets:
  1. Lagging structure tools: useful for regime and context, bad for early entries.
  2. Timing/trigger tools: useful near a level, bad if used alone.
  3. Risk/positioning tools: not predictive, but very useful for sizing and invalidation.
The mistake is treating all indicators like “buy/sell signals.” Most aren’t. They’re either filters, context, or risk tools.

The issue with the lagging ones
Moving averages, MACD, Parabolic SAR, and sometimes Bollinger Band midline signals are all heavily derivative of price. They smooth the thing you already see.
That means they are usually late by design.

A moving average crossover often confirms that the trend has already changed. MACD does the same thing with extra smoothing. Parabolic SAR is even worse in chop because it flips after price has already moved enough to trigger the formula.

So yes, if we’re building scanners that rely too much on stacked MAs, they can miss the early turn. They’ll find clean trends, but often after the best entry has already happened.
That’s why I’d use MAs as a regime filter, not the core trigger.

How I’d reinterpret that indicator list for swing trading
IndicatorLag levelBest useBad use
Moving AverageHighTrend regime, dynamic support/resistanceEntry trigger by crossover
RSIMediumMomentum regime, divergence, reclaim from weak/strong zonesBlind overbought/oversold fades
MACDHighTrend confirmation, momentum expansionEarly entries
Bollinger BandsMediumVolatility compression/expansion, mean reversion contextBuying/selling just because band touched
VolumeLow to mediumConfirmation of effort, accumulation/distribution, breakout qualityUsing raw volume without price context
StochasticMediumTiming inside rangesTrending-market reversal calls
A/DMediumParticipation/pressure contextStandalone signal
ATRNot directionalStops, target spacing, position sizingDirectional prediction
FibonacciNot predictiveMapping likely reaction zonesPretending levels are magic
Parabolic SARHighTrailing stop in clean trendsEntry signal in chop
I’d keep volume, ATR, RSI regime, price structure, VWAP/reclaim behavior, and relative strength closer to the decision engine. I’d demote stacked MAs to “background regime only.”

Better swing-trader framework
Instead of 15m MA trend + 1H MA trend + 4H MA trend, I’d rather scan for Price structure improving + compression or pullback + relative strength + volume confirmation + not overextended. That catches setups earlier.

The goal isn’t to know the trend has already fully aligned. The goal is to catch the transition from repair to continuation.
For bullish swing setups, I care more about:
  • Prior downtrend stops making lower lows.
  • Price reclaims a key short-term level.
  • Pullbacks get shallower.
  • Volume expands on up days and dries up on dips.
  • RSI shifts from bearish regime to neutral/bullish regime.
  • Price holds above VWAP or anchored VWAP after reclaim.
  • Relative strength versus market/sector is firming.
  • ATR allows a clean stop without stupid position sizing.
That’s much less lagging than waiting for 20/50/100 alignment.

So I’d change the scanner philosophy
The earlier MA-stack scanner is fine for finding already confirmed trends.
But if your goal is earlier swing entries, I’d build three scan-safe scanner types instead:
  1. Early repair scanner
  2. Bullish pullback/reclaim scanner
  3. Bearish lower-high/failure scanner
These are more price-action-first and less lagging.


1781506450269.png

HERE ARE SOME SCANNERS YOU COULD USE:
Code:
# Early Bullish Repair Scanner - Scan Safe
# Use Scan Hacker aggregation: 1H or 4H

input fastLength = 20;
input slowLength = 50;
input rsiLength = 14;
input lowLookbackShort = 10;
input lowLookbackLong = 30;
input maxExtensionPercent = 4.0;
input minVolume = 500000;
input minPrice = 5.0;

def fastMA = Average(close, fastLength);
def slowMA = Average(close, slowLength);

def rsi = RSI(length = rsiLength);

def recentLow = Lowest(low, lowLookbackShort);
def priorLow = Lowest(low[lowLookbackShort], lowLookbackLong);

def higherLowStructure =
    recentLow > priorLow;

def reclaimFast =
    close > fastMA and close[1] <= fastMA[1];

def alreadyAboveFast =
    close > fastMA;

def rsiRepair =
    rsi > 45 and rsi > rsi[3];

def notExtended =
    close <= fastMA * (1 + maxExtensionPercent / 100);

def volumeOK =
    Average(volume, 20) >= minVolume;

def priceOK =
    close >= minPrice;

plot scan =
    higherLowStructure and
    alreadyAboveFast and
    rsiRepair and
    notExtended and
    volumeOK and
    priceOK;

This is better than a full MA-stack scan when you want the early continuation candidate, not the late obvious trend. I’d run this on 4H for swing candidates.

Scan 2: Bullish pullback continuation scanner
This is for established trends, but avoids chasing. It does not need 20/50/100 stacked perfectly. It wants price above the slow trend, dipping/reclaiming near the fast trend, with RSI still constructive.
Code:
# Bullish Pullback Continuation Scanner - Scan Safe
# Trend exists, but entry is pullback/reclaim based

input fastLength = 20;
input slowLength = 50;
input rsiLength = 14;
input maxDistanceFromFastPercent = 3.0;
input minVolume = 500000;
input minPrice = 5.0;

def fastMA = Average(close, fastLength);
def slowMA = Average(close, slowLength);

def rsi = RSI(length = rsiLength);

def trendOK =
    close > slowMA and
    fastMA > slowMA;

def pullbackNearFast =
    low <= fastMA * (1 + maxDistanceFromFastPercent / 100) and
    close >= fastMA * (1 - maxDistanceFromFastPercent / 100);

def reclaimBehavior =
    close > fastMA and
    close > close[1];

def rsiConstructive =
    rsi > 50 and rsi > rsi[2];

def volumeOK =
    Average(volume, 20) >= minVolume;

def priceOK =
    close >= minPrice;

plot scan =
    trendOK and
    pullbackNearFast and
    reclaimBehavior and
    rsiConstructive and
    volumeOK and
    priceOK;

This is closer to how I’d scan if I’m looking for a buyable dip in a working trend.

Scan 3: Volume-confirmed reclaim scanner
This is less laggy because it keys off the actual reclaim candle. It finds names where price was recently below the fast MA, now reclaims it with better volume.
Code:
# Volume Confirmed Reclaim Scanner - Scan Safe
# Looks for fresh reclaim, not late MA alignment

input fastLength = 20;
input slowLength = 50;
input recentBars = 3;
input minVolumeRatio = 1.2;
input minVolume = 500000;
input minPrice = 5.0;

def fastMA = Average(close, fastLength);
def slowMA = Average(close, slowLength);

def avgVol = Average(volume, 20);
def volRatio = volume / avgVol;

def recentBelowFast =
    Lowest(close - fastMA, recentBars) < 0;

def reclaimNow =
    close > fastMA and
    recentBelowFast;

def broaderTrendOK =
    close > slowMA;

def volumeConfirm =
    volRatio >= minVolumeRatio;

def priceOK =
    close >= minPrice;

def liquidityOK =
    avgVol >= minVolume;

plot scan =
    reclaimNow and
    broaderTrendOK and
    volumeConfirm and
    priceOK and
    liquidityOK;

This is probably closer to the logic I’ve been testing with VWAP reclaim/BXtrender: don’t wait for all trend filters to line up. Catch the turn when reclaim behavior actually appears. (SEE B_Xtrender in the VIP forums)

Scan 4: Relative strength repair scanner
This one is useful when the market is choppy. It looks for names outperforming SPY while repairing.

TOS may allow close("SPY") in studies/scans depending on setup, but if it gives you issues, remove the relative strength block and use it as a watchlist column instead.

Code:
# Relative Strength Repair Scanner - Scan Safe-ish
# If TOS rejects close("SPY") in your scan, use this as a watchlist column instead

input fastLength = 20;
input rsLength = 20;
input minVolume = 500000;
input minPrice = 5.0;

def fastMA = Average(close, fastLength);

def spyClose = close("SPY");
def rsLine = close / spyClose;
def rsMA = Average(rsLine, rsLength);

def rsImproving =
    rsLine > rsMA and
    rsLine > rsLine[5];

def priceRepair =
    close > fastMA and
    close > close[3];

def liquidityOK =
    Average(volume, 20) >= minVolume;

def priceOK =
    close >= minPrice;

plot scan =
    rsImproving and
    priceRepair and
    liquidityOK and
    priceOK;

I like this conceptually, but I’d be cautious in Scan Hacker because symbol references can be annoying. As a watchlist column, it’s money.

Bearish version: early failure scanner
For shorts, I agree even more with your lag concern. Waiting for all MAs to stack bearish often means you’re shorting late, into the third push down.

Better bearish scan:
  • Price fails at/near fast MA.
  • Below slow MA.
  • RSI weakens.
  • Bounce volume is not convincing.
  • Structure is still lower-high biased.
Code:
# Early Bearish Failure Scanner - Scan Safe
# Finds rally failures before the full MA stack is obvious

input fastLength = 20;
input slowLength = 50;
input rsiLength = 14;
input highLookbackShort = 10;
input highLookbackLong = 30;
input maxDistanceFromFastPercent = 3.0;
input minVolume = 500000;
input minPrice = 5.0;

def fastMA = Average(close, fastLength);
def slowMA = Average(close, slowLength);

def rsi = RSI(length = rsiLength);

def recentHigh = Highest(high, highLookbackShort);
def priorHigh = Highest(high[highLookbackShort], highLookbackLong);

def lowerHighStructure =
    recentHigh < priorHigh;

def belowSlow =
    close < slowMA;

def rallyIntoFast =
    high >= fastMA * (1 - maxDistanceFromFastPercent / 100) and
    close <= fastMA * (1 + maxDistanceFromFastPercent / 100);

def rejection =
    close < fastMA and
    close < close[1];

def rsiWeak =
    rsi < 55 and
    rsi < rsi[3];

def volumeOK =
    Average(volume, 20) >= minVolume;

def priceOK =
    close >= minPrice;

plot scan =
    lowerHighStructure and
    belowSlow and
    rallyIntoFast and
    rejection and
    rsiWeak and
    volumeOK and
    priceOK;

This catches lower-high failures earlier than a bearish MA-stack scan.


What I’d remove or demote
If we’re optimizing for actionable swing scans, I’d demote these:

MACD
Too smoothed. It can be useful visually, but I don’t want it as a primary scan condition. MACD cross after a reclaim is redundant and late.

Parabolic SAR
Too noisy in ranges, too late in turns. I’d rather use ATR-based invalidation or actual swing highs/lows.

Stochastic
Fine for range timing, but dangerous in trends. It screams overbought during the exact move you want to stay long.

Basic MA crossover
Useful for context, but not trigger. If the scanner waits for a clean crossover, we’re usually late.

What I’d keep
Volume
Volume is not perfect, but it tells you whether the move has sponsorship.

RSI regime
Not “RSI under 30 buy, over 70 sell.” That’s beginner stuff.

Better logic:
  • Bullish repair: RSI crosses back above 45 or 50.
  • Strong trend: RSI holds above 40 on pullbacks.
  • Bearish: RSI fails near 50 to 55.
  • Weak trend: RSI cannot reclaim 50.
ATR
ATR is not entry signal. It’s for position sizing and stop sanity.

If the chart needs a 12% stop and your target is 8%, skip. ATR helps avoid dumb trades.

VWAP / anchored VWAP
For your testing style, this matters more than MACD. Reclaiming VWAP after selling pressure often captures a real behavior change earlier than MA stacks.

If you want one flexible scan-safe script that avoids the worst lag, I’d use this.
Code:
# Swing Repair / Failure Scanner - Scan Safe
# Less laggy alternative to MTF MA alignment
# Use Scan Hacker aggregation: 1H or 4H

input Direction = {default Bullish, Bearish};
input fastLength = 20;
input slowLength = 50;
input rsiLength = 14;
input recentBars = 3;
input maxDistanceFromFastPercent = 4.0;
input minVolume = 500000;
input minPrice = 5.0;
input requireVolumeExpansion = no;
input minVolumeRatio = 1.1;

def fastMA = Average(close, fastLength);
def slowMA = Average(close, slowLength);
def rsi = RSI(length = rsiLength);

def avgVol = Average(volume, 20);
def volRatio = if avgVol != 0 then volume / avgVol else 0;

def recentBelowFast =
    Lowest(close - fastMA, recentBars) < 0;

def recentAboveFast =
    Highest(close - fastMA, recentBars) > 0;

def bullishReclaim =
    close > fastMA and
    recentBelowFast;

def bearishFailure =
    close < fastMA and
    recentAboveFast;

def bullishContext =
    close > slowMA;

def bearishContext =
    close < slowMA;

def bullishRSI =
    rsi > 45 and
    rsi > rsi[3];

def bearishRSI =
    rsi < 55 and
    rsi < rsi[3];

def bullishNotExtended =
    close <= fastMA * (1 + maxDistanceFromFastPercent / 100);

def bearishNotExtended =
    close >= fastMA * (1 - maxDistanceFromFastPercent / 100);

def volumeOK =
    if requireVolumeExpansion then volRatio >= minVolumeRatio else avgVol >= minVolume;

def priceOK =
    close >= minPrice;

def bullishScan =
    bullishContext and
    bullishReclaim and
    bullishRSI and
    bullishNotExtended and
    volumeOK and
    priceOK;

def bearishScan =
    bearishContext and
    bearishFailure and
    bearishRSI and
    bearishNotExtended and
    volumeOK and
    priceOK;

plot scan =
    if Direction == Direction.Bullish
    then bullishScan
    else bearishScan;

This is the cleaner philosophical replacement:
  • Not “trend already aligned everywhere.”
  • More “price is repairing/failing now inside a broader context.”
  • Still scan-safe.
  • Still simple enough to debug.
MA-stack replacements are stable, but they are also laggy.

I’d keep them only for:
  • Market regime
  • Watchlist quality filter
  • Avoiding junk
  • Confirming existing trend
But I would not use them as the main entry scanner.

For any swing trading, I’d rather scan for repair, reclaim, compression, volume behavior, and relative strength, then manually confirm if the broader timeframe is supportive. That gets you earlier, cleaner opportunities without asking TOS to do broken multi-aggregation logic. Good Luck!!!
 
Last edited by a moderator:

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
851 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top