Strasmore Research
Learn Matt ConnorBy Matt Connor · data as of September 18, 2026 · refreshed weekly

Market-Wide Circuit Breakers Explained

Market-wide circuit breakers halt all US stock trading at 7%, 13% and 20% S&P 500 drops. See today's SPY trigger levels and the four March 2020 halts.

Market-wide circuit breakers are the rules that pause trading in every US-listed stock when the S&P 500 falls 7%, 13% or 20% below its previous close. A 7% drop (Level 1) or a 13% drop (Level 2) halts all trading for 15 minutes if it happens before 3:25 p.m. ET and does nothing at or after 3:25; a 20% drop (Level 3) halts trading for the rest of the day, whatever the time. The three lines are recalculated every morning from the prior close, and the current version of the rule, in force since April 2013, has tripped exactly four times, all in March 2020.

What are the market-wide circuit breaker levels today?

The exchange publishes the day's three S&P 500 index levels each morning, rounded to the nearest index point. Most people watch the market through SPY, the exchange-traded fund built to track the index, and the same three percentages translate into SPY dollars: take the last close, subtract 7%, 13% and 20%. The panel below does exactly that from the most recent SPY close on record, and it refreshes with each session.

QuerySPY-equivalent circuit breaker levels for the next session
levelthresholdhalt_rulereference_close_labelspy_reference_closespy_trigger_levelspy_points_to_trigger
Level 17% below the prior close15-minute halt if crossed before 3:25 p.m. ETSeptember 18762.35708.9853.36
Level 213% below the prior close15-minute halt if crossed before 3:25 p.m. ETSeptember 18762.35663.2499.11
Level 320% below the prior closeHalt for the rest of the day, at any timeSeptember 18762.35609.88152.47
The exact SQL behind every number
SELECT
    concat('Level ', toString(multiIf(lv.decline_pct = 7, 1, lv.decline_pct = 13, 2, 3))) AS level,
    concat(toString(lv.decline_pct), '% below the prior close')                           AS threshold,
    if(lv.decline_pct = 20,
       'Halt for the rest of the day, at any time',
       '15-minute halt if crossed before 3:25 p.m. ET')                                   AS halt_rule,
    concat(monthName(ref.d), ' ', toString(toDayOfMonth(ref.d)))                          AS reference_close_label,
    round(ref.c, 2)                                                                       AS spy_reference_close,
    round(ref.c * (100 - lv.decline_pct) / 100, 2)                                        AS spy_trigger_level,
    round(ref.c * lv.decline_pct / 100, 2)                                                AS spy_points_to_trigger
FROM
(
    SELECT arrayJoin([7, 13, 20]) AS decline_pct
) AS lv
CROSS JOIN
(
    SELECT
        date                     AS d,
        toFloat64(max(close))    AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= today() - 14
    GROUP BY date
    ORDER BY date DESC
    LIMIT 1
) AS ref
ORDER BY lv.decline_pct
Run this yourself

As of the September 18 close of $762.35, the Level 1 line for the next session sits at $708.98 on SPY, $53.36 below the close. Level 2 sits at $663.24 and Level 3 at $609.88. Two details matter when reading them. The official trigger is the S&P 500 index itself, not the fund, and SPY can trade a few cents through its equivalent line while the index has not crossed, or the reverse; treat the panel as a close proxy for the exchange's published number. And the lines are measured from the previous regular-session close, not from the current day's open, which means a large opening gap uses up most of the distance before a single minute of trading has elapsed.

How are the thresholds recalculated each day?

Every close resets the three lines. A higher close lifts them and a lower close drops them, one recalculation per session, with no memory of where the market stood a week earlier. During March 2020 the lines slid lower session after session alongside the closes; they were never anchored to the February high. The series below shows the last few weeks of SPY closes next to the Level 1, 2 and 3 lines each close set for the following session.

QueryHow the three lines move with each SPY close
session_datespy_closelevel_1_next_sessionlevel_2_next_sessionlevel_3_next_session
2026-08-28769.35715.5669.33615.48
2026-08-31767.05713.36667.33613.64
2026-09-01761.78708.46662.75609.42
2026-09-02765.16711.6665.69612.13
2026-09-03773.17719.05672.66618.54
2026-09-04770.19716.28670.07616.15
2026-09-08765.96712.34666.39612.77
2026-09-09762.4709.03663.29609.92
2026-09-10757.83704.78659.31606.26
2026-09-11764.29710.79664.93611.43
2026-09-14760.88707.62661.97608.7
2026-09-15759.91706.72661.12607.93
2026-09-16758.34705.25659.75606.67
2026-09-17762.6709.22663.46610.08
2026-09-18762.35708.98663.24609.88
The exact SQL behind every number
SELECT
    toString(date)                                 AS session_date,
    round(toFloat64(max(close)), 2)                AS spy_close,
    round(toFloat64(max(close)) * 93 / 100, 2)     AS level_1_next_session,
    round(toFloat64(max(close)) * 87 / 100, 2)     AS level_2_next_session,
    round(toFloat64(max(close)) * 80 / 100, 2)     AS level_3_next_session
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
  AND date >= today() - 21
GROUP BY date
ORDER BY date
Run this yourself

Across the 15 sessions shown, the three lines move in lockstep with the close, a fixed 7%, 13% and 20% beneath it. The latest close of $762.35 puts the next Level 1 line at $708.98, the same figure the first panel reports. The percentages never change; only the dollar levels do.

What happened when the circuit breakers tripped in March 2020?

For the first seven years of the current rules nobody saw one fire. Then March 2020 delivered four Level 1 halts in eight trading days: March 9, March 12, March 16 and March 18. The exchange's halt record puts three of the four within minutes of the 9:30 a.m. open and the fourth, March 18, shortly before 1:00 p.m. ET. Level 2 and Level 3 were never reached. Daily SPY prices are enough to reconstruct each one: compare every session's low with the prior close, and a session whose low sits 7% or more below that close is one where the index, give or take the tracking gap, crossed its Level 1 line. Our March 2020 crash retrospective covers the whole drawdown; this trace stays on the breaker mechanics.

QueryMarch 2020 session by session: open, low and close versus the prior close
22 rows (showing 20)
session_datesession_labelopen_vs_prior_close_pctlow_vs_prior_close_pctclose_vs_prior_close_pctbreaker_line
2020-03-02March 20.66-0.614.33
2020-03-03March 30.13-3.73-2.86
2020-03-04March 41.961.034.2
2020-03-05March 5-2.52-4.11-3.32
2020-03-06March 6-3.08-4.04-1.65
2020-03-09March 9-7.45-8.07-7.81Level 1 line crossed
2020-03-10March 103.8-0.275.17
2020-03-11March 11-2.68-6.08-4.87
2020-03-12March 12-6.69-9.72-9.57Level 1 line crossed
2020-03-13March 136.040.598.55
2020-03-16March 16-10.45-11.87-10.94Level 1 line crossed
2020-03-17March 172.16-1.165.4
2020-03-18March 18-6.55-9.8-5.06Level 1 line crossed
2020-03-19March 19-0.31-3.240.21
2020-03-20March 200.84-4.99-4.87
2020-03-23March 23-0.27-4.61-2.56
2020-03-24March 245.144.879.06
2020-03-25March 250.71-1.41.5
2020-03-26March 261.110.925.84
2020-03-27March 27-3.04-3.89-2.98
The exact SQL behind every number
SELECT
    toString(d)                                            AS session_date,
    concat(monthName(d), ' ', toString(toDayOfMonth(d)))   AS session_label,
    round((open_px / prev_close_px - 1) * 100, 2)          AS open_vs_prior_close_pct,
    round((low_px / prev_close_px - 1) * 100, 2)           AS low_vs_prior_close_pct,
    round((close_px / prev_close_px - 1) * 100, 2)         AS close_vs_prior_close_pct,
    multiIf((1 - low_px / prev_close_px) * 100 >= 20, 'Level 3 line crossed',
            (1 - low_px / prev_close_px) * 100 >= 13, 'Level 2 line crossed',
            (1 - low_px / prev_close_px) * 100 >= 7,  'Level 1 line crossed',
            '')                                            AS breaker_line
FROM
(
    SELECT
        d,
        open_px,
        low_px,
        close_px,
        lagInFrame(close_px, 1) OVER (ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close_px
    FROM
    (
        SELECT
            date                        AS d,
            toFloat64(max(open))        AS open_px,
            toFloat64(min(low))         AS low_px,
            toFloat64(max(close))       AS close_px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND date BETWEEN toDate('2020-02-24') AND toDate('2020-03-31')
        GROUP BY date
    )
)
WHERE d >= toDate('2020-03-02')
ORDER BY d
Run this yourself

Across the 22 sessions of March 2020, the low-versus-prior-close series dips past 7% on exactly four days, and the breaker_line column names them. Notice what the trace does not contain: an upside halt. Several of the month's largest single-day gains sit between the halt days, and no rule pauses a rally. Notice too how often the close finishes well above the low, the halt days included. A Level 1 halt records where the decline stood at one moment, not where the day ended.

QueryThe four Level 1 halt sessions of March 2020
session_datesession_labelprior_closelevel_1_linesession_lowopen_drop_pctlow_drop_pctclose_drop_pct
2020-03-09March 9297.46276.64273.457.458.077.81
2020-03-12March 12274.36255.15247.686.699.729.57
2020-03-16March 16269.32250.47237.3610.4511.8710.94
2020-03-18March 18252.8235.1228.026.559.85.06
The exact SQL behind every number
SELECT
    toString(d)                                            AS session_date,
    concat(monthName(d), ' ', toString(toDayOfMonth(d)))   AS session_label,
    round(prev_close_px, 2)                                AS prior_close,
    round(prev_close_px * 93 / 100, 2)                     AS level_1_line,
    round(low_px, 2)                                       AS session_low,
    round((1 - open_px / prev_close_px) * 100, 2)          AS open_drop_pct,
    round((1 - low_px / prev_close_px) * 100, 2)           AS low_drop_pct,
    round((1 - close_px / prev_close_px) * 100, 2)         AS close_drop_pct
FROM
(
    SELECT
        d,
        open_px,
        low_px,
        close_px,
        lagInFrame(close_px, 1) OVER (ORDER BY d ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close_px
    FROM
    (
        SELECT
            date                        AS d,
            toFloat64(max(open))        AS open_px,
            toFloat64(min(low))         AS low_px,
            toFloat64(max(close))       AS close_px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'SPY'
          AND date BETWEEN toDate('2020-02-24') AND toDate('2020-03-31')
        GROUP BY date
    )
)
WHERE d >= toDate('2020-03-02')
  AND (1 - low_px / prev_close_px) * 100 >= 7
ORDER BY d
Run this yourself

The four halt sessions side by side. On March 16, the prior close of $269.32 put the Level 1 line at $250.47. SPY's opening print was already 10.45% under that close, past the line before the first minute of trading had elapsed, and the halt came at 9:30 a.m. The low that day, $237.36, sat 11.87% below the prior close, the deepest of the four and still short of the 13% Level 2 line. March 18 was the odd one out: the open was only 6.55% below the prior close, the 7% line was crossed in the early afternoon, and the session closed 5.06% down, back above the line that had halted it.

How do market-wide breakers differ from single-stock halts and futures limits?

Three different mechanisms share the word "halt", and they are easy to conflate.

  • Market-wide circuit breakers watch one number, the S&P 500, and stop everything at once: every stock in the national market system (in practice, every US-listed stock) on every exchange and off-exchange venue, plus the listed options on them. They measure declines only.
  • Limit Up-Limit Down (LULD) is a per-stock rule. Each stock carries a price band around a rolling five-minute reference price, 5%, 10% or 20% wide depending on its tier and price, and a stock that cannot trade back inside its band within 15 seconds is halted for five minutes on its own while the rest of the market keeps trading. Our guide to why individual stocks halt under limit up-limit down walks through the bands and the reopening.
  • Futures price limits belong to the futures exchange. E-mini S&P 500 futures trade almost around the clock, and overnight they carry a limit in both directions. During the March 2020 stretch that overnight limit was 5%, and the futures sat at "limit down" for hours before several of those opens, while the cash-market breaker, which only runs during the regular session and never in premarket or after-hours trading, had not yet had a chance to fire. During regular hours the futures' downside limits line up with the 7%, 13% and 20% cash levels.

What happens during a market-wide halt?

A Level 1 or Level 2 halt runs 15 minutes. No stock trades anywhere in that window, and resting orders stay where they are. When the clock runs out, each stock reopens through its primary listing exchange's reopening auction, the same single-price matching mechanism as the closing auction: buy and sell orders accumulate during the pause, and one reopening price clears them. The session then continues under the remaining lines. Level 1 can halt the market only once per day, and the same is true of Level 2. A Level 3 halt ends the trading day. From 3:25 p.m. ET onward, Level 1 and Level 2 no longer halt anything, which leaves the final 35 minutes and the close free to run on schedule; only Level 3 applies in that window.

Where did the 7%, 13% and 20% rules come from?

Circuit breakers arrived in October 1988, a year after the October 1987 crash, keyed to the Dow Jones Industrial Average in points. That first design tripped once, on October 27, 1997, when the Dow crossed both of the regime's point thresholds in the same afternoon and the market closed early. In 1998 the thresholds became percentages of the Dow, 10%, 20% and 30%, reset each quarter, and in the fifteen years that followed they never fired, including on May 6, 2010, when the flash crash took the Dow down and back within minutes without reaching the 10% first line. The April 2013 redesign moved the reference to the S&P 500, tightened the first line to 7%, set the 3:25 p.m. cutoff and made the recalculation daily. The single-stock LULD rules followed the 2010 episode as well; that is the mechanism under which one stock halts on its own today while every market-wide line stays untouched.

FAQ

What are the three market-wide circuit breaker levels?

Level 1 is a 7% decline in the S&P 500 from the prior day's close, Level 2 is 13% and Level 3 is 20%. Levels 1 and 2 halt all US stock trading for 15 minutes if crossed before 3:25 p.m. ET and do nothing afterward; Level 3 halts trading for the rest of the day at any time.

Are the circuit breaker levels the same every day?

No. The percentages are fixed, but the index levels they map to are recalculated every morning from the previous session's S&P 500 close, and the exchange publishes them before the open. A higher close raises the levels and a lower close lowers them.

How many times have market-wide circuit breakers been triggered?

Four times under the current S&P 500 rules, all Level 1 halts in March 2020: March 9, 12, 16 and 18. The earlier Dow-based rules tripped once, on October 27, 1997. No Level 2 or Level 3 halt has ever occurred.

Does a market-wide circuit breaker stop trading in every stock?

Yes. A market-wide halt applies to every US-listed stock on every exchange and off-exchange venue, plus listed options. A single-stock LULD halt, by contrast, pauses only the one stock that has moved outside its price band.

Do circuit breakers apply when the market is rising?

No. Market-wide circuit breakers measure declines only. LULD bands and futures price limits do apply on the upside, but there is no market-wide pause for a rally.


Every panel above carries its exact SQL; expand one to see how today's levels and the March 2020 reconstruction were computed, or run the same questions against any date on the Strasmore terminal.