Do Support and Resistance Lines Work? 5,184 Backtests
A horizontal line is drawn where price has already turned. Whether the number of turns matters, measured on USD/JPY against a placebo line and a reshuffled series.
A horizontal line at a price that has already turned is the first thing a discretionary trader draws and the one thing no oscillator describes. The reason it is supposed to work is plain: price stopped there before.
Put that in a form that can be measured and two questions fall out. One is a dose: if "it held three times" is the reason to trust the line, a line that held five times should hold better than one that held twice. The other is a control: what happens at a line drawn where nothing ever stopped?
Three results first.
One. The touch count did not matter. Splitting the bounce signals by how many times the line had already held gives 50.13% for three touches, 49.24% for four and 50.10% for five or more on the 15-minute long side.
Two. Price sits inside a line's tolerance on 41.40% to 65.75% of bars. Roughly one bar in two, which makes being at a level ordinary rather than special.
Three. Of the four settings that decide what counts as a line, the touch count moved the annual result least at 357.9 pips, against 1,000.9 for the tolerance band.
And one more thing turned up before any of that. The engine's horizontal-line condition had never taken a single trade. Two separate faults did it, and either alone was enough.
The condition had never taken a trade
The first sweep for this article returned zero trades on all 2,592 runs. Two reasons.
The first was a missing ATR. The tolerance is set as a multiple of ATR rather than in pips, because two touches "at the same price" mean different things on gold and on EUR/USD. The engine keeps a list of which conditions need the 14-bar range computed, and the horizontal line was not on it. So the range handed to the level builder was empty, the tolerance band came out as zero, every swing was discarded before it could join a cluster, and the trading test sits behind a check that the band is above zero.
The second was a comparison that can never be true. Resistance is by construction the nearest line above the current close. The break reading asked whether the current close was above resistance. Support is by construction at or below the close, and the short side asked whether the close was below support. A break is a close through the line price was under a bar ago, so that is what it reads now.
Both faults present as a property of the market rather than of the code: the condition appears in the editor, the backtest runs, and the report says no trades. This is the fourth fault of that shape this series has found, after the session filter, the fair-value-gap drawing and the GMMA exit.
Every figure below is from after the fix.
What the line is built from
Four steps.
- Find the swings. A bar is a swing high if its high is the highest for the given number of bars on each side. Because the right-hand side is needed, a swing is only confirmed that many bars later.
- Cluster nearby prices. Two swings closer than the ATR tolerance are the same line, and the line's price moves to the average of what has touched it.
- Count the touches. How many swings joined the cluster.
- Offer only the lines that reach the minimum. The nearest one below the close is support, the nearest above is resistance.
Waiting for confirmation is the part that matters. A swing is not a swing until the bars to its right exist, so reading a level before then draws support from a low the tester has not seen. It is the most flattering bug a backtest can have.
Lines that fall outside the lookback are dropped, and not only for speed. "This line held three times" means three times inside the lookback. A price brushed once ten thousand bars ago no longer counts.
Support and resistance settings, and how they are read
This condition draws nothing on the chart. It exists inside the backtester, so what follows is about numbers rather than about lines on a screen.
| Setting | Default | What it does |
|---|---|---|
| Reading | Bounce | Bounce (held at the line) or break (closed through it) |
| Minimum touches | 3 | How many clustered swings before the line is offered. Two is the floor |
| Tolerance | 0.5 | How close two swings must be to count as one line, in ATRs |
| Swing strength | 3 | Bars on each side that make a swing |
| Lookback | 200 | How far back a line may be drawn from |
The two readings
Bounce buys when the bar's low reaches inside support's tolerance and the close finishes above support. It closes at the next line up. The sell side mirrors it at resistance.
Break buys when the close finishes above the resistance of the previous bar, and closes on the mirror break down through support.
Both open either side, so entry and exit share one rule set.
How this was measured
| Item | Value |
|---|---|
| Instrument | USD/JPY |
| Timeframes | 15-minute, 1-hour, 4-hour |
| Period | 1 January 2024 to 31 December 2025, with 2025 also split in halves |
| Readings | Bounce and break |
| Lookback | 100, 200, 400 |
| Swing strength | 2, 3, 5, 8 |
| Tolerance | 0.25, 0.5, 1.0 ATR |
| Minimum touches | 2, 3, 4 |
| Controls | Prices 1.5, 2 and 3 ATRs off the line, and a reshuffled close series |
| Runs | 2 readings x 3 x 4 x 3 x 3 = 216, x 3 timeframes x 4 windows x 2 spreads = 5,184 |
| Spread | 0.3 pips and 0 |
| Lot size | 0.1 |
| Fill | Close of the signal bar |
Everything runs at a zero spread as well. The bounce reading trades more than a thousand times a year on the hourly chart, so a losing year has to be separable into "the line did not work" and "the round trips did it".
Price sits at a line on half the bars
Before judging the line, count how many exist and how often price reaches one. At the defaults: lookback 200, swing 3, tolerance 0.5 ATR, three touches.
| Timeframe | Year | Bars | Support exists | Price inside the band | Median touches | Max |
|---|---|---|---|---|---|---|
| 15-minute | 2025 | 24,893 | 81.28% | 59.90% | 4 | 38 |
| 15-minute | 2024 | 24,999 | 86.72% | 58.20% | 4 | 24 |
| Hourly | 2025 | 6,216 | 85.52% | 65.75% | 5 | 23 |
| Hourly | 2024 | 6,250 | 84.24% | 52.64% | 4 | 15 |
| 4-hour | 2025 | 1,600 | 85.50% | 61.63% | 5 | 15 |
| 4-hour | 2024 | 1,616 | 84.90% | 41.40% | 3 | 8 |
Price is inside a line's tolerance on 41.40% to 65.75% of bars. "It reached a level" happens on roughly one bar in two.
The median touch count runs 3 to 5 and the maximum reaches 38 on the 15-minute chart in 2025. Lines are not scarce.
Does a line that held more times hold better
The dose. Bounce signals, split by how many times that line had already held, measured to the close ten bars later. The count is the engine's own, so nothing new is defined here. 2025:
| Timeframe | Side | Touches | Signals | Hit rate | Mean over 10 bars |
|---|---|---|---|---|---|
| 15-minute | Long | 3 | 2,759 | 50.13% | -0.16 pips |
| 15-minute | Long | 4 | 1,911 | 49.24% | -0.55 pips |
| 15-minute | Long | 5 or more | 4,996 | 50.10% | -0.71 pips |
| 15-minute | Short | 3 | 2,640 | 50.23% | +1.19 pips |
| 15-minute | Short | 4 | 1,825 | 50.25% | -0.89 pips |
| 15-minute | Short | 5 or more | 5,390 | 50.20% | +1.17 pips |
| Hourly | Long | 3 | 640 | 50.63% | -0.01 pips |
| Hourly | Long | 4 | 402 | 54.48% | +3.18 pips |
| Hourly | Long | 5 or more | 1,809 | 51.96% | +0.72 pips |
| Hourly | Short | 3 | 711 | 52.04% | +3.12 pips |
| Hourly | Short | 4 | 446 | 49.33% | -1.22 pips |
| Hourly | Short | 5 or more | 1,607 | 45.24% | -3.77 pips |
All six 15-minute buckets land between 49.24% and 50.25%, which a coin also does. The hourly long side runs 50.63%, 54.48% and 51.96%, in no order. The short side runs 52.04%, 49.33% and 45.24%: falling as the count rises.
If "it stopped there before, so it will stop again" is the reason, the number of times it stopped should show up. It did not.
The same lines appear in a reshuffled series
Two controls.
The first is a line moved off the real one. The same test at prices 1.5, 2 and 3 ATRs above support, far enough that the tolerance bands cannot overlap. 2025:
| Timeframe | Line | Signals | Hit rate | Close was this many ATRs above the line |
|---|---|---|---|---|
| 15-minute | Drawn | 9,666 | 49.94% | 0.49 |
| 15-minute | +1.5 ATR | 2,748 | 47.49% | 0.46 |
| 15-minute | +2 ATR | 1,695 | 47.67% | 0.49 |
| Hourly | Drawn | 2,851 | 52.02% | 0.48 |
| Hourly | +1.5 ATR | 624 | 50.48% | 0.46 |
| Hourly | +2 ATR | 415 | 47.95% | 0.48 |
| 4-hour | Drawn | 679 | 53.31% | 0.51 |
| 4-hour | +1.5 ATR | 172 | 54.07% | 0.52 |
| 4-hour | +2 ATR | 122 | 45.08% | 0.51 |
The drawn line beat the offset line on hit rate in 13 of 18 comparisons. The distance at the moment of the signal does match: across the nine 2025 rows the close finished 0.48 to 0.51 ATRs above the drawn line and 0.46 to 0.54 above the offset ones.
What does not match is the count. The offset lines fire on 7.8% to 41.6% as many bars as the drawn one. Support is by construction the nearest line below the close, so price reaches it constantly; a line 1.5 ATRs higher is only reached on bars that travelled that far. The two sets are not the same size, so this control is not enough on its own.
The second is a reshuffled series. Every close-to-close change is kept exactly once and only the order is destroyed, so the drift, the volatility and the fat tails belong to the market. What does not survive is where price turned. A reshuffled bar has no wick, so both series are read on the close alone (the engine's bounce reads the low; these figures compare two series rather than report a traded rule).
| Timeframe | Year | Series | Signals | Hit rate | Mean over 10 bars |
|---|---|---|---|---|---|
| 15-minute | 2025 | Real | 5,568 | 49.69% | -0.45 pips |
| 15-minute | 2025 | Reshuffled | 2,720 | 50.04% | -1.83 pips |
| Hourly | 2025 | Real | 1,637 | 51.13% | -0.51 pips |
| Hourly | 2025 | Reshuffled | 542 | 47.23% | -0.15 pips |
| 4-hour | 2025 | Real | 376 | 55.59% | +7.53 pips |
| 4-hour | 2025 | Reshuffled | 172 | 52.91% | +3.58 pips |
| 15-minute | 2024 | Real | 5,553 | 53.97% | +0.80 pips |
| 15-minute | 2024 | Reshuffled | 2,328 | 49.44% | -1.00 pips |
| Hourly | 2024 | Real | 1,179 | 59.20% | +5.17 pips |
| Hourly | 2024 | Reshuffled | 642 | 52.80% | +1.24 pips |
| 4-hour | 2024 | Real | 249 | 64.26% | +26.49 pips |
| 4-hour | 2024 | Reshuffled | 114 | 36.84% | -24.74 pips |
The real series beat the reshuffled one on hit rate in 5 of 6 cells. Only the 15-minute chart in 2025 went the other way, at 49.69% against 50.04%.
So the order of the closes carries something. The real series' own hit rate still runs from 49.69% to 64.26%, though, and beating a reshuffle is not the same as surviving as a trade.
Trading both readings
108 settings, traded. Settings that ended the year with positive pips:
| Reading | Window | 15-minute | Hourly | 4-hour |
|---|---|---|---|---|
| Bounce | 2025 | 12 | 21 | 57 |
| Bounce | 2024 | 49 | 79 | 91 |
| Break | 2025 | 32 | 61 | 30 |
| Break | 2024 | 49 | 95 | 92 |
In 2024 the bounce reached 91 of 108 and the break 92 on the 4-hour chart. In 2025 the same cells are 57 and 30.
Requiring both years, and then all four windows including the two halves of 2025:
| Reading | Timeframe | Both years | All four windows |
|---|---|---|---|
| Bounce | 15-minute | 11 | 5 |
| Bounce | Hourly | 19 | 7 |
| Bounce | 4-hour | 50 | 21 |
| Break | 15-minute | 23 | 10 |
| Break | Hourly | 58 | 32 |
| Break | 4-hour | 23 | 11 |
The strongest cell is the hourly break at 58 of 108, and 32 across all four windows. The bounce's best is the 4-hour chart at 50 and 21.
Win rates and trade sizes at the defaults:
| Reading | Timeframe | Year | Trades | Win rate | Mean win | Mean loss | Annual pips | Bars held |
|---|---|---|---|---|---|---|---|---|
| Bounce | 15-minute | 2025 | 6,372 | 40.68% | +11.11 | -8.56 | -3,544.0 | 5.0 |
| Bounce | Hourly | 2025 | 1,799 | 44.41% | +19.66 | -15.86 | -151.3 | 4.2 |
| Bounce | 4-hour | 2024 | 261 | 45.59% | +63.49 | -33.52 | +2,794.6 | 7.9 |
| Break | 15-minute | 2025 | 3,407 | 28.29% | +22.42 | -9.95 | -2,682.4 | 10.3 |
| Break | Hourly | 2025 | 938 | 30.38% | +43.26 | -18.05 | +542.8 | 9.3 |
| Break | 4-hour | 2024 | 131 | 38.93% | +121.24 | -46.84 | +2,436.1 | 16.7 |
The break wins 25.45% to 31.08% of its trades and makes more than twice as much on a winner as it loses on a loser. The bounce wins 38.26% to 42.80% at a ratio of 1.3 to 1.9.
The bounce leans long
Between 66.06% and 67.73% of the bounce's trades are buys. For the break it is 50.01% to 50.19%.
The engine checks the long side first when a bar satisfies both. A bounce off support and a bounce off resistance can both be true on one bar, and the buy takes it every time. A rule that is symmetric by description trades long by construction. The inside-bar article found the same long bias for the same reason.
The setting that defines a line matters least
Each setting moved one at a time, with the median annual pips of every setting group containing that value. Hourly chart, 2025, median in brackets:
| Reading | Setting | Profitable count and median per value |
|---|---|---|
| Bounce | Lookback | 100: 2/36 (-1,291.5) 200: 7/36 (-1,131.0) 400: 12/36 (-384.6) |
| Bounce | Swing strength | 2: 7/27 (-658.7) 3: 7/27 (-1,002.9) 5: 5/27 (-977.5) 8: 2/27 (-1,393.9) |
| Bounce | Tolerance | 0.25: 15/36 (-315.4) 0.5: 3/36 (-1,316.3) 1.0: 3/36 (-1,049.7) |
| Bounce | Minimum touches | 2: 4/36 (-1,020.5) 3: 9/36 (-1,183.6) 4: 8/36 (-825.7) |
| Break | Lookback | 100: 13/36 (-521.9) 200: 20/36 (+97.2) 400: 28/36 (+1,002.4) |
| Break | Swing strength | 2: 24/27 (+1,148.5) 3: 21/27 (+542.8) 5: 13/27 (-30.6) 8: 3/27 (-822.2) |
| Break | Tolerance | 0.25: 20/36 (+261.3) 0.5: 18/36 (-36.0) 1.0: 23/36 (+286.1) |
| Break | Minimum touches | 2: 23/36 (+441.4) 3: 22/36 (+423.7) 4: 16/36 (-128.3) |
How far each setting moves that median from end to end:
| Reading | Lookback | Swing strength | Tolerance | Minimum touches |
|---|---|---|---|---|
| Bounce | 906.9 | 735.2 | 1,000.9 | 357.9 |
| Break | 1,524.3 | 1,970.7 | 322.1 | 569.7 |
For the bounce the touch count moves it least, at 357.9 pips. For the break it is second smallest at 569.7, behind the tolerance at 322.1.
The two that move it most are the break's swing strength (1,970.7) and lookback (1,524.3), and both improve in the direction that produces more lines. A swing strength of 2 makes almost every high and low a swing; a lookback of 400 keeps old lines alive.
This measurement cannot separate the lines working from the trade count rising. What it does show is that the settings which make a line more line-like, how many times it held and how close two touches must be, moved the result less than the settings that make more of them.
Last year's winner, this year
The setting with the highest annual pips in one year, run in the other, with its rank among the 216 (two readings by 108 definitions):
| Timeframe | Picked in | Setting | Pips that year | Pips the other year | Rank | Median that year |
|---|---|---|---|---|---|---|
| 15-minute | 2024 | Break, 100/2/0.5/3 | +3,513.9 | +488.6 | 26th | -1,531.7 |
| 15-minute | 2025 | Bounce, 100/5/0.5/4 | +2,194.7 | +2,983.4 | 4th | -113.8 |
| Hourly | 2024 | Break, 200/2/1.0/2 | +3,247.4 | +339.8 | 67th | -394.6 |
| Hourly | 2025 | Break, 400/2/0.25/4 | +2,323.4 | +377.2 | 148th | +1,033.2 |
| 4-hour | 2024 | Break, 200/8/1.0/3 | +3,237.1 | -1,205.0 | 170th | -314.8 |
| 4-hour | 2025 | Bounce, 400/8/1.0/4 | +2,569.7 | +1,463.4 | 77th | +962.1 |
Four of the six beat the other year's median. The 15-minute chart held up in both directions, at 26th and 4th; the 4-hour 2024 pick fell to 170th.
The default setting moves just as far. The 4-hour bounce ranked 6th of 216 in 2024 with +2,794.6 pips and 72nd in 2025 with +278.8. The 4-hour break ranked 204th in 2025 at -1,883.7 and 15th in 2024 at +2,436.1. One setting, one timeframe, 6th and 72nd, 204th and 15th.
What the spread takes
A losing year can be the line failing or the round trips costing too much. Profitable counts at a zero spread first, then at 0.3 pips:
| Reading | Timeframe | Year | Profitable | Median | Median trades |
|---|---|---|---|---|---|
| Bounce | 15-minute | 2024 | 94 → 49 | +1,339.7 → -99.1 | 4,738.5 |
| Bounce | Hourly | 2025 | 39 → 21 | -545.6 → -987.7 | 1,428.0 |
| Bounce | 4-hour | 2025 | 61 → 57 | +224.9 → +154.8 | 364.5 |
| Bounce | 4-hour | 2024 | 93 → 91 | +912.5 → +845.2 | 196.0 |
| Break | 15-minute | 2025 | 57 → 32 | +172.7 → -760.3 | 2,739.5 |
| Break | Hourly | 2025 | 66 → 61 | +472.9 → +230.4 | 751.5 |
The 15-minute bounce falls from 94 profitable settings to 49 on the spread alone in 2024, with the median going from +1,339.7 pips to -99.1. At a median 4,738.5 trades, the spread costs 1,421.5 pips.
On the 4-hour chart it falls from 93 to 91, because the median is 196 trades. Cost is trade count times spread, which this series finds every time.
Related reading
- Do Fair Value Gaps Really Fill? 2 Years of USD/JPY Tested: the same "price remembers this level" claim, measured against a control
- Does Fibonacci 61.8% Really Hold? 2 Years of USD/JPY Tested: whether a level has an effect of its own, tested by mixing in non-Fibonacci numbers
- Do Double Tops and Bottoms Reverse? 2 Years of USD/JPY Tested: the same swings read as a shape instead of a line
- Do Indicator Settings Transfer Between Pairs? 3,024 Tests: these settings were chosen on USD/JPY too
Notes on scope
- USD/JPY only, 2024 and 2025, on the 15-minute, 1-hour and 4-hour charts
- Fills at the close, spreads of 0.3 pips and 0, 0.1 lots, no slippage
- The condition draws nothing on the chart; these are lines computed inside the backtester
- The offset control matches the signal-time distance but not the number of signals, and the reshuffled control reads both series on the close alone
Questions people ask
- Does a line that has held more times hold better?
- Not here. Splitting the bounce signals by the line's touch count gives 50.13% for three, 49.24% for four and 50.10% for five or more on the 15-minute long side; the short side stays between 50.20% and 50.25%. Of the four settings that define a line, the touch count moved the median year least.
- Is it better to trade the bounce or the break?
- By settings profitable in both years the break wins on the hourly chart, 58 of 108 against the bounce's 19. On the 4-hour chart it reverses: bounce 50, break 23. Win rates are 25.45% to 31.08% for the break and 38.26% to 42.80% for the bounce, so neither clears 50%.
- Is price at a level a special state?
- Not really. Price sits inside a line's tolerance band, half an ATR by default, on 41.40% to 65.75% of bars depending on the timeframe and the year. Roughly one bar in two.
- How should the lookback and the swing strength be set?
- For the break reading, a longer lookback and a smaller swing strength did better. On the hourly chart in 2025, a lookback of 100 left 13 of 36 settings profitable with a median of -521.9 pips; 400 left 28 and +1,002.4. A swing strength of 2 left 24 of 27 at +1,148.5 pips, and 8 left 3 at -822.2. Both changes make more lines, so this measurement cannot separate the lines working from the trade count rising.
- Can I test horizontal lines in Formiq?
- Yes. Enable the horizontal-line condition in the condition list and it takes the reading, lookback, swing strength, tolerance and minimum touch count. All 5,184 runs here were built that way. The chart has no way to draw these lines yet.
Formiq is a free browser-based FX terminal with replay practice and no-code backtesting. Open the chart or see what the free plan includes.