STRASMORE/EXPLORE 2,358 QUERIES

trigger_levels

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-18, from market-wide-circuit-breakers-explained.

as of table 3×7read in context →
trigger_levels — 3 rows by 7 columns, computed from US exchange, SIP and OPRA data.
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
Rows × columns
3 × 7
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for trigger_levels, derived from the stored result.
ColumnTypeRangeNotes
level text 3 distinct values (Level 1, Level 2, Level 3)
threshold text 3 distinct values
halt_rule text 2 distinct values
reference_close_label text 1 distinct value (September 18)
spy_reference_close number every row is 762.35 US dollars
spy_trigger_level number 609.88 to 708.98
spy_points_to_trigger number 53.36 to 152.47

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

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 your own version of this

The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.

More from this analysismarket-wide-circuit-breakers-explained
march_2020_sessions series 22×6 daily_recalc series 15×5 halt_days series 4×8 The 2s10s spread, every print of the half table 124×2 The 2s10s spread, every print of the half table 124×2 Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print table 100×7 See all 2,358 queries →