Strasmore Research
Learn am Matt ConnorBy Matt Connor

Support and Resistance: How Dem Work On Chart

Support and resistance na zone, no be thin line. We count how often SPY, AAPL, MSFT and NVDA close above one old swing high inside five sessions.

Support and resistance na di price zone where buyers and sellers already fight before, and you can see dem on any plain daily chart without one single indicator. Resistance na di area up there where price climb reach, sellers overpower di buyers, and price turn back down. Support na di area below where price fall reach, buyers step in, and price turn up. Plenty people draw dis zone as thin line with ruler. Di data no gree with dat one, and di count below go show you why.

Support and resistance: wetin dem actually be?

Every candle on one daily chart na receipt. E dey tell you di price where somebody gree sell and somebody gree buy for dat session. When price climb reach one area and sellers finish di buyers two, three time, dat area don become resistance. When price fall reach one area and buyers mop up everything wey dey for sale, dat area na support.

Nothing magic dey inside am. Di zone dey work as memory: traders wey miss di last top dey park order around di same place, and traders wey buy up there dey wait make price come back so dem go exit flat. Dat pile of order na wetin make di area behave different from ordinary price.

Two thing you must sabi before we enter di numbers. First, one level na area, no be one exact price. Second, price go visit di area plenty time, and di visit alone no mean anything. Wetin mean something na where price close.

Wetin be swing high, and why e matter

One swing high na di highest price wey one stock reach inside a stretch of session before e turn down. For dis post we fix am at three month: di highest high wey print inside di last 63 trading day, and e no include di session wey we dey testing. Anytime price climb back near dat number, e dey testing resistance. Swing low na di mirror, di lowest low inside di same stretch, and price wey drop near am dey testing support.

Breakout na when price close on di other side of di zone. Hold di word close well well. E go come back plenty time inside dis post.

How many time price really break di resistance?

We take four US names wey dey trade heavy every single day: SPY, AAPL, MSFT and NVDA. For each one, any session wey close inside half a percent under di three-month swing high, we mark am as one test of di level. Then we watch di next five session. If any of dem close above di old high, we call am break. If none close above, price turn back.

QueryHow often a close near di three-month swing high go on to close above am inside five sessions
tickertestsclosed_above_afterbreak_pct
NVDA413482.9
AAPL786279.5
MSFT1068277.4
SPY30121671.8
The exact SQL behind every number
WITH bars AS
(
    SELECT
        ticker,
        date,
        toFloat64(close) AS close_px,
        toFloat64(high)  AS high_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA')
      AND date >= '2019-01-01'
      AND date <  '2026-09-20'
),
levels AS
(
    SELECT
        ticker,
        date,
        close_px,
        max(high_px)  OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 63 PRECEDING AND 1 PRECEDING) AS swing_high,
        max(close_px) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING)  AS best_close_next5
    FROM bars
)
SELECT
    ticker,
    count()                                                         AS tests,
    countIf(best_close_next5 > swing_high)                          AS closed_above_after,
    round(100 * countIf(best_close_next5 > swing_high) / count(), 1) AS break_pct
FROM levels
WHERE date >= '2019-04-01'
  AND date <  '2026-09-01'
  AND close_px <= swing_high
  AND close_px >= swing_high * 0.995
GROUP BY ticker
ORDER BY break_pct DESC
Run am yourself

NVDA carry di highest break rate inside di four: 82.9 percent out of 41 test. SPY carry di lowest at 71.8 percent. Look di four bar well. Dem no near 100, and dem no near zero.

Dat middle ground na di correct way to hold resistance inside your head. Resistance no be wall wey price no go pass, and e no be door wey dey open every time. E na area where di next five session get real chance to go either side, and di chance no be 50-50 coin either. Anybody wey tell you say a level must hold, or must break, dey selling story.

Di level na band, no be one thin line

If di level na one exact price, then di closer price come to am, di answer suppose stay di same. E no stay di same. Here we widen di net: every session wey close between 4 percent under di level and di level itself, grouped into band by how far di close land from di old high.

QueryBreak rate by how far di close land under di old swing high
distance_bandtestsbreak_pct
0.00 to 0.25% below25681.2
0.25 to 0.50% below26768.5
0.50 to 1.00% below45864.4
1.00 to 2.00% below76649
2.00 to 4.00% below105426
The exact SQL behind every number
WITH bars AS
(
    SELECT
        ticker,
        date,
        toFloat64(close) AS close_px,
        toFloat64(high)  AS high_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA')
      AND date >= '2019-01-01'
      AND date <  '2026-09-20'
),
levels AS
(
    SELECT
        ticker,
        date,
        close_px,
        max(high_px)  OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 63 PRECEDING AND 1 PRECEDING) AS swing_high,
        max(close_px) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING)  AS best_close_next5
    FROM bars
),
tagged AS
(
    SELECT
        100 * (swing_high - close_px) / swing_high AS gap_pct,
        best_close_next5 > swing_high              AS broke
    FROM levels
    WHERE date >= '2019-04-01'
      AND date <  '2026-09-01'
      AND close_px <  swing_high
      AND close_px >= swing_high * 0.96
)
SELECT
    multiIf(gap_pct < 0.25, '0.00 to 0.25% below',
            gap_pct < 0.50, '0.25 to 0.50% below',
            gap_pct < 1.00, '0.50 to 1.00% below',
            gap_pct < 2.00, '1.00 to 2.00% below',
                            '2.00 to 4.00% below') AS distance_band,
    count()                                        AS tests,
    round(100 * countIf(broke) / count(), 1)       AS break_pct
FROM tagged
GROUP BY distance_band
ORDER BY distance_band
Run am yourself

Di band wey sit closest to di level, 0.00 to 0.25% below, show 81.2 percent on 256 test. Di farthest band, 2.00 to 4.00% below, show 26 percent on 1054 test. Di curve no jump from one value to another; e dey slope softly.

Dat slope na di reason to draw your level as band. Say di old swing high na $50.00 on one US name wey you dey follow inside your app. Half a percent na 25 cent, so anything from $49.75 to $50.00 dey inside di same zone, and price dey behave similar anywhere inside dat 25 cent. On one small account of 200,000 naira, dat 25 cent na small money. But e na di whole difference between 'price test di level' and 'price never test di level', and dat one go change how you read di chart.

Only di close count, no be di wick

Now make we settle di close question with count. For di same four names and di same stretch, we separate two kind session: di ones where di high push above di old swing high but di close land back under am, and di ones where di close itself finish above.

QuerySessions wey poke above di old swing high intraday, against sessions wey close above am
tickerpoked_then_closed_underclosed_clean_above
AAPL111148
MSFT112147
NVDA97145
SPY157213
The exact SQL behind every number
WITH bars AS
(
    SELECT
        ticker,
        date,
        toFloat64(close) AS close_px,
        toFloat64(high)  AS high_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA')
      AND date >= '2019-01-01'
      AND date <  '2026-09-20'
),
levels AS
(
    SELECT
        ticker,
        date,
        close_px,
        high_px,
        max(high_px) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 63 PRECEDING AND 1 PRECEDING) AS swing_high
    FROM bars
)
SELECT
    ticker,
    countIf(high_px > swing_high AND close_px <= swing_high) AS poked_then_closed_under,
    countIf(close_px > swing_high)                           AS closed_clean_above
FROM levels
WHERE date >= '2019-04-01'
  AND date <  '2026-09-01'
GROUP BY ticker
ORDER BY ticker
Run am yourself

For AAPL, 111 session push above di level intraday and still close under am, against 148 session wey close clean above. Di poke dem no be small pile. If your rule na 'when price touch di level', all dat pile go enter your count as break, and most of dem no be break at all.

One more case dey where price no even test di zone: e gap over am overnight and open on di other side, so no session ever trade inside di band. Dat kind jump get im own record, and we measure am for wen price gap jump ova di level.

One real chart: SPY for April go June 2026

Average na average. To see di shape, pin one real stretch of chart. Dis one na di SPY daily close from April to June 2026, with di rolling three-month swing high sitting beside am.

QuerySPY daily close against di rolling three-month swing high, April to June 2026
62 rows (showing 20)
dateclose_priceswing_high_levelgap_pct
2026-04-01655.24697.84-6.1
2026-04-02655.83697.84-6.02
2026-04-06658.93697.84-5.58
2026-04-07659.22697.84-5.53
2026-04-08676.01697.84-3.13
2026-04-09679.91697.84-2.57
2026-04-10679.46697.84-2.63
2026-04-13686.1697.84-1.68
2026-04-14694.46697.84-0.48
2026-04-15699.94697.840.3
2026-04-16701.66700.280.2
2026-04-17710.14702.781.05
2026-04-20708.72712.39-0.52
2026-04-21704.08712.39-1.17
2026-04-22711.21712.39-0.17
2026-04-23708.45712.39-0.55
2026-04-24713.94712.390.22
2026-04-27715.17714.470.1
2026-04-28711.69715.63-0.55
2026-04-29711.58715.63-0.57
The exact SQL behind every number
WITH bars AS
(
    SELECT
        date,
        toFloat64(close) AS close_px,
        toFloat64(high)  AS high_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2025-11-01'
      AND date <  '2026-07-01'
),
levelled AS
(
    SELECT
        date,
        close_px,
        max(high_px) OVER (ORDER BY date ASC ROWS BETWEEN 63 PRECEDING AND 1 PRECEDING) AS swing_high
    FROM bars
)
SELECT
    toString(date)                              AS date,
    round(close_px, 2)                          AS close_price,
    round(swing_high, 2)                        AS swing_high_level,
    round(100 * (close_px / swing_high - 1), 2) AS gap_pct
FROM levelled
WHERE date >= '2026-04-01'
ORDER BY date
Run am yourself

Di window carry 62 session. Di close enter di window at -6.1 percent from di level and leave am at -1.79 percent. Watch di level line well: e dey flat for long stretch, then e step up one time. Di level only move when a fresh high print, so resistance dey climb like staircase, no be like ramp.

Dat staircase na why di same zone dey serve as support after price close above am. Di old top no disappear; e just find itself under price now. When di zone wey price meet na di highest for one whole year, di crowd wey dey watch am plenty pass, and we cover dat case for 52-week high and low. Some traders no use old high at all. Dem anchor di level to one event and follow di average price from dat day, wey anchored VWAP explain.

How you go find di levels with your eye

You no need indicator pack for dis work. Inside any plain daily chart app, di steps small:

  1. Put di chart on daily and show six month to one year of price. Nothing else on top.
  2. Find di two or three area where price turn round more than once. Dem dey show as flat shelf.
  3. Mark di area as band, from di candle body to di wick tip, no be hairline.
  4. Wait for di close. Tick by tick movement inside di band na noise. Di close na di receipt.

FAQ

Support or resistance, which one strong pass?

Neither one strong by nature. Wetin dey change di reading na how many time price already turn round for dat area, and how much volume print dere. Di counts on top show say di same zone dey hold sometimes and dey break sometimes, on di same name.

How many time price suppose touch one level before e count?

Two touch give you one level you can draw. Three or more make am clearer for di eye. One single touch na just di old high, and di panels here treat every three-month swing high as testable, whether price visit am once or five time.

If price break support, di support go turn resistance?

Dat na how traders talk am, and di mechanic dey plain: di order wey pile up around di old area no vanish when price cross am, e just sit on di other side now. Watch di swing high line inside di SPY panel after di close cross above am.

Which timeframe be di best for support and resistance?

Everything inside dis post na daily bar, and daily na where di zone dey easiest to see with bare eye. Di same idea dey work on weekly and on five-minute chart, but di zone dey wide on higher timeframe and di noise dey plenty on lower one.

Method notes
  • Di swing high na di highest high inside di 63 trading day before di session under test, and di session itself no enter di calculation.
  • Di test window run from April 2019 go August 2026, so every session get full lookback and full five-session follow-up.
  • Break mean one daily close above di level inside di next five session. Intraday poke no count as break anywhere inside dis post.
  • Di four names dey among di heaviest traded on di US market, so di counts no full of thin, one-sided session.

Every panel here carry di exact SQL under am. Open any one and you go see how di number was counted. If you wan run di same count on di name wey you dey watch, ask di question in plain English on di Strasmore terminal.

#technical analysis#support and resistance#price levels#chart reading#beginner