Do Support and Resistance Levels Actually Work?

10 min readQuantParadox research

Support and resistance is the first thing most traders learn and the last thing most traders test. The gap between those two facts is where a lot of money goes.

The short answer

Support and resistance levels can be tested, but only once the rule for drawing them is mechanical and fixed in advance, because a level chosen by eye on a chart whose outcome is already visible will appear to work almost every time.

What makes a support or resistance level real?

A level is real to the extent that a large number of participants can see it and would act at it, which in practice means it has to be derivable by a simple rule rather than by judgement.

That is a stricter standard than it sounds. A trend line drawn through two points has infinite alternatives; a horizontal level at a swing high has one. The horizontal level is testable and the trend line is an argument, which is why almost all rigorous work on levels uses horizontals.

The rule also has to be causal. A swing high identified using bars that came after it is not available at the time those earlier bars were being traded, so a backtest that uses it is quietly using the future. The fix is to require confirmation — a swing high is only a level once N bars have closed below it — and to accept that this delays every level by N bars, including in the test.

Finally, the rule should say when a level dies. Levels that never expire accumulate until the chart is a grid and every price is near one, at which point the concept has stopped distinguishing anything.

How do you backtest support and resistance without hindsight?

Generate the levels programmatically as the test walks forward, so that at every bar the set of active levels contains only what was derivable from bars already closed.

This is the single most important structural decision in level testing, and it is the one most spreadsheet-based analyses get wrong. Computing all swing points across the whole dataset first and then walking through it is convenient and invalid, because the level list at bar 500 will contain levels that were not identifiable until bar 900.

With the walk-forward generation in place, the measurement is simple. For each level, record every time price came within a defined proximity, and grade what happened next over a fixed horizon: rejected, broken, or neither within the window. The three-way grade matters — a two-way grade that quietly drops inconclusive cases will report a much cleaner result than reality supports.

Then compare against a null. Run the same measurement against levels drawn at random prices in the same range. If a randomly placed line rejects price about as often as a swing high does, the structure was not contributing anything, and the apparent effect was a property of how often price turns around in general.

Does a level get stronger or weaker with each touch?

The conventional claim is that levels strengthen with each successful test, and the opposing claim is that each test consumes the orders that made the level meaningful. Both are stated confidently in trading education, and they cannot both be right, which is a good sign that the question deserves measurement rather than assertion.

The measurable version of the question is straightforward. Bucket every approach by how many prior touches the level had, and compare rejection rates across buckets while holding everything else constant. The comparison has to control for how much time has passed as well, because an old level with five touches differs from a fresh one in two ways at once.

In our own testing of level behaviour, the more consistent pattern was about freshness rather than touch count — recent structure behaved differently from structure that had been sitting on the chart for a long time. We treat that as a working finding rather than a law, and it is one of several reasons the platform grades levels by age and by what has happened to them since they formed.

The practical takeaway is not to adopt either slogan. It is to stop treating 'the level has held three times' as evidence of anything until you have measured whether the third hold behaved differently from the first.

How close is close enough to a level?

Proximity has to be defined as a fraction of current volatility rather than a fixed pip distance, because a twenty-pip approach means something entirely different on a quiet day than during a volatile session.

The usual approach is to express the zone in ATR: price is considered to be interacting with the level when it comes within some multiple of the average true range. This makes the definition portable across instruments, which matters if you intend to apply the same rule to EUR/USD and to gold.

The width of the zone is itself a parameter, and a consequential one. Too narrow and you miss most genuine interactions; too wide and the zone swallows so much price action that everything is near a level. Because it is a parameter, it has to be counted as one — testing five widths and reporting the best is a search.

A useful discipline is to fix the width using one part of the history and never adjust it again. The temptation to widen the zone slightly because it improves the numbers is exactly the mechanism by which a level study becomes a curve fit.

Should you trade the bounce or the break?

Both are testable strategies with different characteristics, and the honest answer is that the choice should follow the measurement on your instrument and timeframe rather than a general preference.

Trading the bounce means entering as price rejects the level, with the stop beyond it. These trades tend to have a higher hit rate and a smaller average win, and they suffer badly when a level finally gives way — which every level eventually does.

Trading the break means entering as price closes through the level, with the stop back inside. These tend to have a lower hit rate and larger wins, and they suffer from false breaks, which are common enough that a naive break strategy usually needs a filter to be viable at all.

The reason to test rather than argue is that the two are not symmetrical across market conditions. Bounce trades do better in ranges; break trades do better in trends; and a strategy tested only in one regime has never met the other. Any comparison that does not span both is describing a period rather than a method.

Questions people actually ask

Are round numbers real support and resistance?

Round numbers do attract resting orders, but they attract both limit orders and stop orders, which push price in opposite directions. That makes their behaviour messier than structural levels derived from swing points. The most defensible use is as a secondary factor — a swing level that happens to coincide with a whole figure is more interesting than either on its own.

How many touches make a level significant?

There is no touch count that reliably confers significance, and the two most common claims in trading education contradict each other: one says each hold strengthens a level, the other says each test consumes the orders behind it. Rather than adopt either, bucket your own approaches by prior touch count and measure whether the buckets actually behave differently.

Do support and resistance levels work on all timeframes?

Levels derived from higher timeframes are visible to more participants, which is the mechanism that makes them matter, so they tend to produce cleaner interactions than levels derived from very low timeframes. The practical approach is to derive levels from a higher timeframe than the one you execute on, and to measure rather than assume how much of the effect survives on your specific instrument.

The only backtest that settles it is yours.

Build a strategy from a sentence, paste your own Python, or import your live trade history and have it graded. Five full backtests free, no card, and we'll tell you plainly when the result is indistinguishable from luck.

We publish research and tooling, not trading advice, and we make no claim about future returns. Everything above describes how to test an idea — not a reason to trade one.