Skip to content

SSR + LULD Enforcement

// ssr · luld · rejection_codes · limits

SSR (Reg SHO Rule 201) and LULD (Limit Up / Limit Down) are two of the most common regulatory events a US-equity trader encounters live. Almost no retail paper-trading platform enforces them. Tapeboard enforces both server-side.

Two regs the sim enforces that almost no retail paper platform models

SSR (Reg SHO Rule 201, the "uptick rule") and LULD (Limit Up / Limit Down volatility halts) are two of the most common regulatory events a US-equity trader encounters live. Almost no retail paper-trading platform enforces them. Tapeboard's simulator enforces both server-side so paper behavior transfers to live without surprise.

SSR (Reg SHO Rule 201)

SSR triggers when a stock drops ≥10% from prior session close intraday. Once triggered, short sales must fill at a price ABOVE the last consolidated print (the "uptick" requirement). The restriction stays in effect for the remainder of the current trading day plus the next full trading day.

How Tapeboard enforces it

The simulator tracks dayLow and prevClose per symbol from the same Level 1 quote stream that feeds the chart. On every price observation, observePrice (in useOrderBookStore.ts) checks whether newDayLow / prevClose - 1 ≤ -0.10 and flips ssrActive once the threshold is crossed.

if (!ssrActive && prevClose > 0) {
  if (newDayLow / prevClose - 1 <= -0.10) {
    ssrActive = true
  }
}

Once ssrActive is true, short sell orders are rejected unless they fill above the last print. Limit shorts that satisfy the uptick price-condition pass through; market shorts get filled at a price strictly above the last seen print, or are rejected with a Reg-SHO error code matching the live broker response.

LULD (Limit Up / Limit Down)

LULD bands are computed from a 5-minute rolling VWAP of the security's consolidated trades. The band width is set per tier: Tier 1 securities (S&P 500, Russell 1000, select large-cap ETFs) get tighter bands; Tier 2 (everything else) gets wider bands. A trade outside the band triggers a 5-minute trading halt; the security resumes after 5 minutes and the band recomputes from a fresh 5-min VWAP window.

How Tapeboard enforces it

The simulator maintains a rolling buffer of recentPrints per symbol and computes luldBand as the 5-min VWAP times the tier's percent threshold. When observePrice detects a price outside the band, it sets luldHaltedUntil = now + LULD_HALT_MS (where LULD_HALT_MS is the 5-minute halt duration in ms). While luldHaltedUntil is in the future, fills are refused; once the halt expires it clears to null and trading resumes.

Resting limit orders survive the halt — they stay on the book and become eligible again when the halt clears.

Rejection codes match live broker responses

Orders that violate either reg are rejected with the same error pattern a live broker returns. SSR violations carry a SHORT_SALE_RESTRICTED code; LULD halts carry a TRADING_HALTED code with the expected resume timestamp. The intent is that a paper trader who learns to handle these rejections in sim will not be surprised by the same rejections in their live broker account.

What this model doesn't do

No intermarket LULD coordination. Live LULD halts coordinate across exchanges via the Limit Up/Limit Down plan SROs. Tapeboard models a single consolidated band; cross-venue halt timing nuances are not in the model.

US equities only. LULD applies only to US-listed equities and ETFs. Options-market trading halts, futures circuit breakers, and crypto halts are not simulated; these are not US-equity LULD events.

Exact 5-minute halts. Real LULD halts are 5 minutes plus a randomized re-auction delay (typically 0-30 seconds). Tapeboard's halts are exactly 5 minutes — close enough for behavior parity but not bit-exact.

Source: frontend/src/stores/useOrderBookStore.ts (observePrice, luldHaltedUntil, ssrActive). See also: /methodology (full methodology index), /methodology/sim-fills (fill engine), and /paper-trading-simulator (feature page). Last reviewed 2026-05-11.