Why does my thinkorswim scan return no results?
Updated August 27, 2026
Short answer
Almost always it's one of three things: Scan in is pointed at a small watchlist instead of All Stocks, a study filter is running on the wrong aggregation period, or a price/volume filter you forgot about is knocking out nearly the whole universe. Everything in the All of the following group is ANDed together, so one bad filter kills the scan. Check those first, then strip the scan down to a single filter and add the rest back one at a time.
First: what is Scan in actually pointed at
Top left of the Stock Hacker, above all the filters. It remembers whatever you used last session. If you were poking at a 12 symbol watchlist last Tuesday, that’s still what the scan is running against, and a condition that hits 40 names out of 8,000 will hit zero out of 12.
Set it to All Stocks and re-run. If results appear, you found it.
Two things sit next to it that also silently shrink the universe. Intersect with requires a symbol to be in both lists, and Exclude removes a watchlist. Both survive a scan reset in my experience, so glance at them even if you never deliberately set them.
Scan tab > Stock Hacker, and the dropdowns are: All Stocks, All Indices, All Futures, All OTC Stocks, All Listed Stocks, plus your watchlists, preset scan lists and GICS industry lists.
Second: the aggregation period on each study filter
This is the one that gets everybody. Each study filter row has its own Aggregation Period button, and it does not inherit anything from your chart. You built a daily setup, the filter is sitting on 5 min, and a daily-shaped condition basically never fires on 5 minute bars.
Click the Aggregation Period button on every study filter and read it. Don’t assume.
The useful flip side: because each filter carries its own period, you can fake multi-timeframe scanning by adding two study filters, one set to Day and one set to 1 hour. The scan returns symbols where both are true. That’s the only multi-timeframe route the scanner gives you, because inside a single custom filter thinkorswim flatly refuses a second aggregation. You’ll get an error along the lines of Secondary Aggregation period not allowed: DAY. There’s more on that in the secondary aggregation error page.
Third: your filters are all ANDed
The top group is labelled All of the following, and it means it. Five filters means five simultaneous conditions on the same bar. People stack a study filter, a price range, a volume minimum and a float filter and then wonder why nothing survives.
The other two groups are None of the following (nothing in there may be true) and Any of the following (at least one must be true). If you dropped a filter into the wrong group you can get an empty result that looks nothing like a mistake. Scroll the whole panel. A collapsed filter you forgot about counts.
There’s a hard ceiling of 25 filters in one scan, and only one pattern filter.
Fourth: price and volume filters, which are more brutal than they look
A Volume minimum of 1,000,000 evaluated on a 5 minute bar means one million shares in five minutes. That’s a handful of names on a busy day and zero most of the time. Same filter on Day aggregation is completely reasonable. The number didn’t change, the bar did.
Price range filters do the same thing quietly. Min 20 / max 50 removes most of the market before your interesting condition ever runs.
Fifth: when you’re running it
Run an intraday scan at 8pm with EXT unchecked and the last bar in the scan’s data is the 15:59 bar. Any condition about what price is doing “now” is evaluating a bar that closed hours ago. Check EXT on the Aggregation Period popup (it only appears for intraday periods) and see if that changes anything.
Related and worth knowing: thinkorswim’s own docs say the Start aggregations at market open setting is disabled when the Extended-Hours Trading session is off. That shifts where hourly bars begin, which is a big deal on 60 minute scans. That whole tangle is covered in scan results vs chart.
Sixth: the study filter is pointed at a plot that doesn’t do what you think
Multi-plot studies make you pick which plot to test. Pick the wrong one, or leave a comparison at a default that can never be satisfied, and you get silence. Custom filters have a stricter rule: a script using standard thinkScript syntax must have exactly one plot. Two plots and it won’t behave.
Seventh: not enough history
The scanner’s data depth is fixed by aggregation period. 1 to 30 minute gets 15 calendar days. 1 to 4 hours gets 270 days. 1 to 4 days gets 4 years. Week gets 6 years, Month and Option Expiration get 20.
So a 200 period moving average on Weekly is asking for roughly four years of weeks, which is fine, but a 400 period one is not. When the study can’t compute it returns NaN, NaN is not greater than anything, and the whole scan comes back empty across every symbol. This one is invisible because there’s no error.
Then bisect
Once the obvious stuff is ruled out, stop reasoning and start cutting.
- Delete every filter. Add one stock filter:
Lastgreater than 0. Run it. You should get thousands. If you don’t, the problem is the universe or the platform, not your logic. - Add your single most important filter back. Run. Note the count.
- Add the next one. Run. When the count drops to zero, the filter you just added is either wrong or genuinely rare.
It takes about two minutes and it beats staring at the panel. Almost every time the count collapses at a step you’d have sworn was harmless.
And sometimes zero is correct
A scan for a bullish engulfing on the daily, above the 200 day average, with relative volume over 3, on a quiet Wednesday, honestly might return nothing. That’s not a bug. Loosen one number, usually the tightest threshold, and see if you get two or three. If loosening it by 10% takes you from 0 to 40, your original number was the problem. If it takes you from 0 to 1, the setup is just rare.
If you’ve done all of this and a scan that worked last month returns nothing now with identical settings, save the query, close thinkorswim completely, reopen and load it. Scan state gets stuck often enough that it’s worth ruling out before you rewrite anything.