VCP stock screener: the volatility contraction criteria this screen applies
A volatility contraction pattern is a base that tightens: each pullback inside it is smaller than the one before, and volume dries up as the range narrows. QM Screener screens the whole US equity market for that shape after every close as the VCP screen — Volatility Contraction Pattern — using four arithmetic rules over end-of-day bars rather than pattern recognition by eye. This page is those rules, the level each one is set at, what the passing list carries, and how to work through it.
What a volatility contraction is
The pattern is defined by what the bars do after an advance: each pullback is shallower than the one before, the range over a few weeks narrows, and the volume behind the pullbacks falls away. The story told about that shape is supply drying up, and its practical appeal is that a tight range puts the level that would say you were wrong close to the level you would act at.
That is the idea. What a screen can do with it is narrower, because a screen sees bars and not intent. This one measures whether the range is in fact tightening, whether the last week of it is tight in absolute terms, and whether volume has fallen off while that happened. Those are measurable; how many pullbacks there were, and whether the shape is textbook, are not measured here at all.
The VCP screen is an implementation of publicly documented criteria, assembled from public sources. QM Screener is an independent product and is not affiliated with, endorsed by, or sponsored by any trader, author, publisher or firm.
The rules this screen applies
Four rules, all of which a stock has to pass — five comparisons in total, because the first rule is applied twice. Each range figure is the high of a window minus its low, as a percentage of the latest close, and the windows are nested rather than sequential: the 30-day window contains the 15-day window, which contains the 5-day one.
- Progressive contraction, twice. The 30-day range must be at least 1.5 times the 15-day range, and the 15-day range at least 1.5 times the 5-day range. Both comparisons, not either, so a base that narrowed a month ago and has gone sideways since does not clear it.
- A tight final range. The 5-day range must be 8% of price or less. This is the one absolute test in the screen, and it is what stops a very volatile name from passing on the ratios alone while still swinging in a wide band.
- Volume drying up. Average daily volume over the last 5 sessions must be no more than 0.7 times the average over the 25 sessions before them. Volume contracting into a tightening range is the whole thesis; a range that narrows on rising volume is a different chart.
- An uptrend to contract inside. The close must be above the 50-day simple moving average. A tightening range below the 50-day is a stock going quiet in a downtrend, which is not what this screen is looking for.
Before any of that, a stock has to clear a base gate to be scored: enough history for the three ranges and the two volume averages, and a 50-day average dollar volume of at least $5 million. Recent listings fall out here rather than being failed on a rule, and the liquidity floor is the same idea as everywhere else on the site: a pattern you cannot get filled in is not tradable, however tight it looks.
What the screen outputs
The passing list is a table, one row per stock, and the row carries the values that decided it. The two numbers this screen leads with — the ones the compact list on a phone shows beside the ticker — are the 5-day range and the relative-strength percentile, in that order, because the first is the test and the second is the context.
The list is sorted by the 5-day range ascending: tightest first. That is this screen's own default sort, not the dashboard's, and it is the practical difference between this list and a momentum list. Every row has already passed the same four rules, so ranking by strength would say nothing about which of them is the better example of the pattern; ranking by the final range says exactly that.
Relative strength is computed for this screen too — each stock's three-month return ranked against the others this screen scored, reported as a percentile from 0 to 100 — but it is a column and a filter, not a rule. The screen does not gate on it.
There is no near-miss list here. Beside the passing list the run writes a universe file holding every stock it looked at, each with the rules it failed written on it, so a name you expected to see can be looked up and read: which of the two contraction ratios missed, by how much the final range was too wide, or what the volume ratio actually was.
Every row also carries a setup tag — BASE, TIGHT, TRENDING, EXTENDED or PARABOLIC — which is a separate measurement from the rules above: it scores how tightly the 10, 20 and 50-day exponential moving averages are bunched and how far price sits from that band. The two are related questions asked with different numbers, and a row where they disagree is worth looking at. The tags are set out in what the setup tags mean.
The controls on top of the list
The screen declares its own filter bar, and the numbers in it are the screen's rather than the page's:
- Final range — any, ≤ 4%, ≤ 6% (sweet spot), ≤ 8%, ≤ 10%. It opens at 6%, tighter than the 8% the rule itself allows, so the list you first see is already the tight end of what passed.
- RS — a relative-strength floor, or a custom band you type. The full range is live because the screen does not gate on it.
- Setup — the setup-tag presets.
- Sector and Industry — the sector or theme bucket a stock was mapped into from its filing, and a multi-select of industries.
All five, and the ticker search beside them, are cuts a reader applies on top of a list that has already passed the four rules.
How to use this in QM Screener
- Open the dashboard at https://qmscreener.com/ and pick VCP in the screen picker at the top. The list loads tightest first; the screen is chosen in the picker, not in the URL.
- Decide how tight is tight. The final-range control opens at 6% — loosen it toward the 8% rule to see more names, tighten it to see fewer and quieter ones.
- Chart what survives. Every row opens a candlestick chart in place, drawn from the same end-of-day bars the screen used, so the contraction the rules measured can be looked at directly, with volume under it. A chart has its own link,
?view=chart&t=TICKER. - Check the failures too. A name you follow that is not on the list is in the run's universe file with the rules it failed, which is more useful than its absence.
- Take the list with you. Export it as a TradingView watchlist, a CSV, a PNG of the table or share text, or read the same result document over the HTTP API and the MCP server.
A free account — a verified email address, no card — sees the top 5 names of each screen every day and can chart them, and on this screen those are the 5 tightest. The full list, the per-row values and the exports are $10 a month or $84 a year, each starting with a 7-day free trial. Start there, or sign in if you already have an account.
Frequently asked questions
What counts as a contraction in this screen?
A shrinking high-low range measured over three nested windows: the last 30 sessions, the last 15 and the last 5, each expressed as a percentage of the current price. The 30-day range has to be at least 1.5 times the 15-day range, and the 15-day at least 1.5 times the 5-day. That is the whole definition of a contraction here — nested windows tightening by a fixed multiple, not pivot points identified on a chart.
Is this real VCP pattern recognition?
No, and it is not presented as one. It is a published heuristic: four arithmetic rules over end-of-day bars, chosen so the same rules over the same data return the same names every time. A discretionary trader reading the pattern by eye counts the individual pullbacks and weighs their shape and their volume. This screen does not, so it will miss textbook examples the windows do not line up with and surface tight names that are not textbook anything.
Why is the list sorted by the 5-day range instead of relative strength?
Because the pattern is the thesis. A wide-ranging name with a high relative-strength rank is not a contraction, so sorting by strength would put the least relevant rows on top. The list opens tightest first, and the relative-strength percentile travels beside it as the second column for context.
Does the screen require a minimum relative strength?
No. Relative strength is computed and shown, and the dashboard offers it as a cut you can apply, but the screen itself does not gate on it — the whole 0 to 100 range is live in the passing list.
Is there a near-miss list for this screen?
No. The run writes the passing list and a universe file that carries every stock it looked at with the rules that stock failed written on it, so a name that did not pass can be looked up and read rather than guessed at.
Read next
- How to screen for momentum stocks — the five measurements every screen here is built from, and an end-of-day routine.
- The setup tags, one by one — what BASE and TIGHT are measured from, and why they are a different question from this screen's rules.
- Trend template stock screener — the 8-point trend-confirmation checklist, a useful cross-reference for a contraction you want to see inside an established uptrend.
- Compared with a filter builder — the same four conditions can be assembled by hand in a scan builder; what differs is that here they are fixed, published and applied the same way every day.
- All guides — everything published so far.
Educational content, not financial advice. QM Screener lists stocks that passed published filters; it does not recommend trades, size positions or know anything about your circumstances. US equities, end-of-day, refreshed once per trading day after the close.