0DTE SPY Playbook: 3 Setups Using Live Gamma & Dealer Data | FlashAlpha

0DTE SPY Playbook: 3 Setups Using Live Gamma & Dealer Data

SPY 0DTE: gamma profile, Mon/Wed/Fri schedule, 3 intraday setups, SPY vs SPX, risk management, backed by real-time dealer positioning data.

T
Tomasz Dobrowolski Quant Engineer
Mar 25, 2026
36 min read
0DTE SPY Trading GammaExposure PinRisk Options Strategies
LIVE NOW
See SPY 0DTE today — and the index variant
Regime, pin score, expected move and dealer hedging for SPY. Switch tickers to SPXW (daily-listed index 0DTE), QQQ, NVDA, TSLA and more.
Open 0DTE Live →

Why does SPY dominate 0DTE?

SPY isn't just the most liquid ETF - it's the epicenter of 0DTE options flow. On any given Monday, Wednesday, or Friday, SPY 0DTE options account for 40-60% of total SPY options volume. That concentration matters because it means dealer hedging from 0DTE contracts is the primary force driving intraday SPY price action on expiration days.

Several structural features make SPY the default 0DTE vehicle:

  • $1 strike spacing. SPY offers strikes every $1, giving you granular positioning. SPX has $5 strikes (with some $1 weeklies), and most single stocks have $2.50 or $5 spacing. Tighter strikes mean more precise gamma profiles and more reliable wall/flip levels.
  • Massive liquidity. Bid-ask spreads on ATM SPY 0DTE options are typically $0.02-0.05, compared to $0.10-0.30 on SPX. You lose less on entry and exit.
  • Diversified underlying. SPY tracks the S&P 500 - no single earnings report, FDA decision, or CEO tweet blows up your gamma levels. The positioning is structural, not event-driven (with known exceptions like CPI and FOMC).
  • Gamma profile is cleaner. Individual stocks have lumpy OI concentrated around earnings strikes and round numbers. SPY's OI distributes more smoothly across strikes, creating well-defined call walls, put walls, and gamma flips that hold up throughout the session.
SPY's Gamma Advantage - Strike Density $$ \text{GEX resolution} \propto \frac{1}{\Delta K} \quad \Longrightarrow \quad \text{SPY (\$1 strikes)} = 5\times \text{finer than SPX (\$5 strikes)} $$

The practical consequence: when you pull SPY's 0DTE levels from the API, the call wall, put wall, and gamma flip are precise to the dollar. On SPX, the same levels have $5 granularity - which means the "wall" could be anywhere in a $5 range. For intraday trading where $1-2 matters, SPY's resolution is a meaningful edge.

What is SPY's 0DTE schedule?

Unlike SPX (which has daily expirations, Monday through Friday), SPY 0DTE options expire on Monday, Wednesday, and Friday only. This schedule creates a predictable rhythm:

DaySPY 0DTE?Nearest SPY ExpiryImplication
MondayYesSame dayFull 0DTE playbook applies. Gamma accelerates into close.
TuesdayNoWednesday (1DTE)No 0DTE gamma spike. Wednesday expiry behaves like a normal short-dated option.
WednesdayYesSame dayMid-week 0DTE. Often highest volume day - dealers rebalance from Monday.
ThursdayNoFriday (1DTE)No 0DTE. Friday's chain starts attracting flow but gamma is muted.
FridayYesSame dayMonthly/weekly OpEx overlap. Highest OI, strongest pin risk.

On Tuesday and Thursday, the API's 0DTE endpoint returns no_zero_dte: true for SPY. Don't force the playbook on non-0DTE days - the gamma mechanics don't apply when the nearest expiry is 1DTE.

import requests

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

if d.get("no_zero_dte"):
    print("No SPY 0DTE today  -  check if it's Tuesday or Thursday")
    print("Use full-chain GEX levels instead: /v1/exposure/levels/SPY")
else:
    print(f"SPY 0DTE active  -  expiration: {d['expiration']}")
    print(f"Time to close: {d['time_to_close_hours']:.1f} hours")
    print(f"Regime: {d['regime']['label']}")
    print(f"Gamma flip: ${d['regime']['gamma_flip']}")
    print(f"0DTE as % of total GEX: {d['exposures']['pct_of_total_gex']:.0f}%")

Friday OpEx: The Strongest Pin Day

Friday SPY 0DTE deserves special attention. It often coincides with weekly or monthly option expirations, stacking OI from multiple series into the same strikes. This creates the highest pin scores of the week - the pin_risk.pin_score on Friday regularly exceeds 60-70, compared to 40-50 on Monday and Wednesday. If you trade pin plays, Friday is your day.

See SPY's live 0DTE levels right now

Gamma flip, call wall, put wall, pin score, dealer hedging - updated in real-time during market hours.

View SPY Dashboard

The SPY Gamma Profile

SPY's gamma profile has characteristics you won't find in individual stocks or even QQQ:

Round Number OI Concentration

SPY OI clusters heavily at round numbers - $580, $585, $590, $595, $600. The $5 increments typically carry 2-5x more OI than the $1 strikes between them. This creates a "picket fence" gamma profile where the walls almost always land on round numbers.

Why this matters: when SPY is trading at $591.50, the dominant gamma forces are the $590 and $595 strikes. The $591 and $592 strikes contribute, but the round numbers carry the bulk of the positioning. This makes SPY's support and resistance levels more predictable than stocks where OI is distributed randomly.

Gamma Flip Behavior

SPY's gamma flip typically sits within 0.5-1.0% of spot price - roughly $3-6 at current levels. This is tighter than most single stocks (where the flip can be 2-3% away) because SPY's OI is so massive that even small imbalances create significant net GEX. The practical implication: SPY regime changes happen quickly. A $3 move can take you from positive to negative gamma, fundamentally changing how dealers interact with price.

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

price = d["underlying_price"]
flip = d["regime"]["gamma_flip"]
call_wall = d["levels"]["call_wall"]
put_wall = d["levels"]["put_wall"]

# SPY-specific: check round number alignment
flip_round = round(flip)
cw_round = round(call_wall)
pw_round = round(put_wall)

print(f"SPY: ${price:.2f}")
print(f"Gamma flip: ${flip} (nearest round: ${flip_round})")
print(f"Call wall: ${call_wall} (nearest round: ${cw_round})")
print(f"Put wall: ${put_wall} (nearest round: ${pw_round})")
print(f"Flip distance: {abs(price - flip) / price * 100:.2f}% from spot")
print(f"Range: ${put_wall} to ${call_wall} (${call_wall - put_wall:.0f} wide)")

Why SPY Pins More Reliably

Pin risk in SPY is structurally stronger than in other tickers for three reasons:

  1. Massive OI at round strikes. When 200,000+ contracts sit at $590, the hedging force required to keep price near that strike is enormous. Dealers must continuously buy and sell shares to stay delta-neutral - and that activity creates mean reversion around the magnet.
  2. $1 strike spacing reduces "leakage." With $1 strikes, there's always a nearby strike to pin to. With $5 strikes (SPX) or $2.50 (many stocks), price can wander $1-2 between strikes without triggering significant pin mechanics.
  3. No idiosyncratic risk. Individual stocks can gap on news, breaking any pin. SPY absorbs single-stock shocks - Apple could drop 3% and SPY might move $1. The diversification keeps the gamma profile intact.

Reading SPY's Intraday Levels

The Zero-DTE endpoint returns everything you need for the SPY 0DTE playbook in a single API call. Here's how to pull and interpret the key levels specifically for SPY:

import requests
import json

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

price = d["underlying_price"]
regime = d["regime"]
levels = d["levels"]
pin = d["pin_risk"]
em = d["expected_move"]
hedging = d["hedging"]

print("=" * 55)
print(f"  SPY 0DTE Dashboard  -  ${price:.2f}")
print("=" * 55)

# Regime
print(f"\nRegime: {regime['label'].upper()}")
print(f"  Gamma flip: ${regime['gamma_flip']}")
if price > regime["gamma_flip"]:
    print(f"  Spot is ABOVE flip  -  dealers dampen moves (buy dips, sell rallies)")
else:
    print(f"  Spot is BELOW flip  -  dealers amplify moves (sell into drops)")

# Key levels
print(f"\nLevels:")
print(f"  Call wall: ${levels['call_wall']}  -  dealer resistance")
print(f"  Put wall:  ${levels['put_wall']}  -  dealer support")
print(f"  Range:     ${levels['call_wall'] - levels['put_wall']:.0f} wide")

# Pin risk
print(f"\nPin Risk:")
print(f"  Pin score: {pin['pin_score']}/100")
print(f"  Magnet strike: ${pin['magnet_strike']}")
print(f"  Distance to magnet: {pin['distance_to_magnet_pct']:.2f}%")

# Expected move
print(f"\nExpected Move:")
print(f"  Remaining 1SD: +/-${em['remaining_1sd_dollars']:.2f}")
print(f"  Range: ${em['lower_bound']:.2f} to ${em['upper_bound']:.2f}")

# Dealer hedging  -  this tells you the fuel behind SPY moves
print(f"\nDealer Hedging (if SPY moves 1%):")
up = hedging["spot_up_1pct"]
down = hedging["spot_down_1pct"]
print(f"  +1%: dealers {up['direction']} {abs(up['dealer_shares_to_trade']):,} shares (${abs(up['notional_usd']):,.0f})")
print(f"  -1%: dealers {down['direction']} {abs(down['dealer_shares_to_trade']):,} shares (${abs(down['notional_usd']):,.0f})")

The hedging estimates are particularly important for SPY because the notional amounts are so large. When the API shows dealers needing to sell 500,000 shares on a 1% drop, that's $300M+ of mechanical selling - enough to move SPY further and create a feedback loop. These aren't theoretical numbers; they represent the actual hedging flow that market makers execute via their automated systems.

For a deeper dive into how gamma exposure creates these mechanical levels, see the complete GEX explainer.

SPY 0DTE Session Anatomy

SPY's 0DTE session follows a predictable intraday pattern driven by the interaction of gamma, theta, and dealer hedging. Understanding the rhythm helps you time entries and manage risk.

9:30 - 10:00 AM ET: The Opening Range

The first 30 minutes are noisy. Overnight flow sets initial OI, but the opening burst of volume reshuffles positioning. Levels from the API are establishing - the gamma flip, call wall, and put wall are valid but may shift as the first wave of orders settles.

  • Do: Pull the API at 9:35 AM for initial levels. Note the gamma flip and regime.
  • Don't: Trade aggressively. The opening range often sees false breaks that reverse within minutes.
  • Watch for: Where SPY settles relative to the gamma flip. If it opens above and stays above for 15+ minutes, positive gamma dynamics likely hold for the morning session.

10:00 AM - 12:00 PM ET: Levels Solidify - Gamma Fade Window

By 10:00 AM, SPY's 0DTE levels are well-established. Volume has confirmed or adjusted the overnight OI, and the walls are reliable. This is the prime window for gamma fade trades in positive gamma regime - dealers actively buy dips toward the put wall and sell rallies toward the call wall.

  • Best strategy: Fade moves toward walls (if positive gamma). Mean reversion is strongest here because gamma acceleration hasn't kicked in yet.
  • Gamma acceleration: Typically 1.5-2.5x - elevated but manageable.
  • Theta bleed: Slow. Selling premium in this window gives poor risk/reward because you're not getting paid for the gamma risk you carry.

12:00 - 1:00 PM ET: The Lunch Lull

SPY volume drops 30-50% during lunch. Realized volatility compresses. This quiet period has specific implications for 0DTE:

  • Pin mechanics strengthen. Low volume means dealer hedging is the dominant force. If the pin score is already elevated, the lunch hour often pulls price toward the magnet strike as organic flow dries up.
  • Walls hold more reliably. Without large directional orders to challenge them, the call wall and put wall act as firm boundaries.
  • Don't mistake quiet for safe. Negative gamma during lunch means even small moves get amplified. A $0.50 drift through the gamma flip can cascade when there's no opposing flow to absorb it.

1:00 - 3:00 PM ET: Theta Acceleration - Premium Selling Window

This is where 0DTE gets interesting. Theta decay begins its exponential ramp - 2x the morning rate by 1:00 PM, 3.5x by 2:30 PM. For premium sellers, this is the window.

Theta Acceleration on 0DTE $$ \Theta(t) \propto \frac{1}{\sqrt{T - t}} \quad \Longrightarrow \quad \text{last 3 hours: } \Theta \approx 2\text{-}4\times \text{ morning rate} $$
  • Best strategy: Sell iron condors with short strikes at the call wall and put wall (if positive gamma regime). Theta pays you while dealers defend the range.
  • Gamma acceleration: 2.5-5x - significant. Position sizing should reflect this.
  • Key signal: Check decay.gamma_acceleration - when it crosses 2.5x, the theta/gamma tradeoff favors premium sellers if the regime is positive.

Monitor SPY theta decay and gamma acceleration in real-time

The Zero-DTE endpoint updates every field continuously - including theta/hour, gamma acceleration, and regime shifts.

Zero-DTE API Docs

3:00 - 4:00 PM ET: Power Hour - The Danger Zone

The last hour is where 0DTE gamma goes parabolic. Gamma acceleration hits 6-10x or higher. Every $1 SPY move forces dealer hedging flows that dwarf the morning session. This is simultaneously the highest-reward and highest-risk window of the day.

  • Pin risk peaks. If pin score is above 70, the magnet effect is at maximum strength. Price gets pulled toward the magnet strike with increasing force as 4:00 PM approaches.
  • Negative gamma breakouts accelerate. If SPY breaks through the gamma flip in the last hour, the cascading dealer flow can produce $2-4 moves in minutes.
  • Do not enter new iron condors. Gamma risk is too high relative to remaining theta. If you're already in a position, manage it - don't add to it.
  • Close by 3:50 PM. The final 10 minutes are pure gamma noise. Spreads widen, execution quality drops, and pin mechanics can produce violent $0.50 swings. Take profits or cut losses before this window.

3 SPY-Specific Setups

These setups exploit structural features unique to SPY's 0DTE profile. For the general 0DTE strategy framework, see the complete 0DTE trading guide.

Setup 1: The Round Number Pin

When: SPY is within $1 of a round $5 strike ($585, $590, $595, etc.), pin score > 65, positive gamma regime, after 1:00 PM ET.

SPY pins to round $5 numbers with remarkable consistency. The OI concentration at these strikes is typically 3-5x the surrounding strikes, creating a gravitational pull that strengthens as expiration approaches. The trade is simple: sell premium centered on the round number and let the pin mechanics work.

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

price = d["underlying_price"]
pin = d["pin_risk"]
regime = d["regime"]
hours_left = d["time_to_close_hours"]

# Find nearest $5 round number
nearest_5 = round(price / 5) * 5

# Check if conditions favor the round number pin
if (abs(price - nearest_5) < 1.0 and
    pin["pin_score"] > 65 and
    regime["label"] == "positive_gamma" and
    hours_left < 5):

    magnet = pin["magnet_strike"]
    em = d["expected_move"]["remaining_1sd_dollars"]

    print(f"ROUND NUMBER PIN SETUP")
    print(f"  SPY: ${price:.2f}")
    print(f"  Target pin: ${nearest_5} (magnet: ${magnet})")
    print(f"  Pin score: {pin['pin_score']}/100")
    print(f"  Distance: ${abs(price - nearest_5):.2f} from round number")
    print(f"  Expected move: +/-${em:.2f}")
    print(f"")
    print(f"  Trade: Sell ${nearest_5} butterfly")
    print(f"    Buy 1x ${nearest_5 - 3} put")
    print(f"    Sell 2x ${nearest_5} straddle")
    print(f"    Buy 1x ${nearest_5 + 3} call")
    print(f"  Max profit if SPY closes at ${nearest_5}")
else:
    print(f"No round number pin  -  SPY ${price:.2f}, nearest $5: ${nearest_5}")
    print(f"  Distance: ${abs(price - nearest_5):.2f}")
    print(f"  Pin score: {pin['pin_score']}/100")
    print(f"  Regime: {regime['label']}")
When this fails: Round number pins break when large directional flow overwhelms the hedging mechanics. If flow.volume_to_oi_ratio exceeds 1.5 and the put/call ratio is heavily skewed (>1.2 or <0.4), aggressive directional flow is overpowering the pin. Also check the pin risk analysis guide for additional failure modes.

Setup 2: The Lunch Reversal

When: Positive gamma regime, SPY is near the put wall or call wall during the 11:30 AM - 1:00 PM lunch window, and realized vol has compressed.

During lunch, organic flow dries up and dealer hedging becomes the dominant market force. If SPY has drifted toward a wall during the morning session, the lunch period often produces a mean-reversion move back toward center. The low-volume environment makes dealer hedging flows proportionally larger - they don't need as much buying or selling to push price back.

import requests
from datetime import datetime
import pytz

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

price = d["underlying_price"]
regime = d["regime"]
levels = d["levels"]
hours_left = d["time_to_close_hours"]

# Check if we're in the lunch window (roughly 3-5 hours to close)
et = pytz.timezone("US/Eastern")
now_et = datetime.now(et)
is_lunch = 11 <= now_et.hour <= 13

if regime["label"] == "positive_gamma" and is_lunch:
    put_wall = levels["put_wall"]
    call_wall = levels["call_wall"]
    range_width = call_wall - put_wall
    mid = (call_wall + put_wall) / 2

    # How far from center?
    dist_to_put = (price - put_wall) / range_width
    dist_to_call = (call_wall - price) / range_width

    if dist_to_put < 0.25:
        print(f"LUNCH REVERSAL: SPY ${price:.2f} near put wall ${put_wall}")
        print(f"  Dealers buying here  -  low volume amplifies the support")
        print(f"  Entry: Buy SPY or ${int(put_wall)} call")
        print(f"  Target: ${mid:.2f} (midpoint)")
        print(f"  Stop: Close below ${put_wall - 0.50:.2f} (wall broken)")
    elif dist_to_call < 0.25:
        print(f"LUNCH REVERSAL: SPY ${price:.2f} near call wall ${call_wall}")
        print(f"  Dealers selling here  -  low volume amplifies the resistance")
        print(f"  Entry: Short SPY or buy ${int(call_wall)} put")
        print(f"  Target: ${mid:.2f} (midpoint)")
        print(f"  Stop: Close above ${call_wall + 0.50:.2f} (wall broken)")
    else:
        print(f"SPY ${price:.2f} is mid-range  -  no lunch reversal setup")
else:
    print(f"Not in lunch window or not positive gamma  -  skip")

Setup 3: The Power Hour Breakout

When: Negative gamma regime, after 2:30 PM ET, SPY approaching or crossing the gamma flip.

The last 90 minutes of trading in negative gamma is when SPY makes its biggest intraday moves. Gamma acceleration is 4-8x, meaning every dollar move forces massive dealer hedging that pushes price further. If SPY breaks through the gamma flip during power hour, the cascade is often swift and violent.

resp = requests.get(
    "https://lab.flashalpha.com/v1/exposure/zero-dte/SPY",
    headers={"X-Api-Key": "YOUR_API_KEY"}
)
d = resp.json()

price = d["underlying_price"]
regime = d["regime"]
hedging = d["hedging"]
hours_left = d["time_to_close_hours"]
decay = d["decay"]

if regime["label"] == "negative_gamma" and hours_left < 1.5:
    flip = regime["gamma_flip"]
    down_1pct = hedging["spot_down_1pct"]
    up_1pct = hedging["spot_up_1pct"]

    print(f"POWER HOUR BREAKOUT  -  NEGATIVE GAMMA")
    print(f"  SPY: ${price:.2f}")
    print(f"  Gamma flip: ${flip}")
    print(f"  Gamma acceleration: {decay['gamma_acceleration']:.1f}x")
    print(f"  Hours left: {hours_left:.2f}")
    print(f"")
    print(f"  Hedging fuel:")
    print(f"    -1% move: dealers {down_1pct['direction']} {abs(down_1pct['dealer_shares_to_trade']):,} shares")
    print(f"    +1% move: dealers {up_1pct['direction']} {abs(up_1pct['dealer_shares_to_trade']):,} shares")
    print(f"")

    if price < flip:
        print(f"  SPY BELOW flip  -  bearish cascade risk")
        print(f"  Trade: Buy ATM put or put debit spread")
        print(f"  Target: put wall ${d['levels']['put_wall']}")
        print(f"  Stop: SPY reclaims ${flip} (regime change)")
    else:
        print(f"  SPY ABOVE flip  -  bullish breakout potential")
        print(f"  Trade: Buy ATM call or call debit spread")
        print(f"  Target: call wall ${d['levels']['call_wall']}")
        print(f"  Stop: SPY drops below ${flip} (regime change)")
else:
    if regime["label"] != "negative_gamma":
        print(f"Regime is {regime['label']}  -  not a breakout setup")
    if hours_left >= 1.5:
        print(f"{hours_left:.1f} hours left  -  too early for power hour breakout")
Power Hour Risk

The power hour breakout is a high-conviction, high-risk setup. SPY can move $2-4 in the last hour on extreme negative gamma days. Use defined-risk structures (debit spreads, not naked options) and accept that timing matters - entering 5 minutes too early can mean being on the wrong side of a whipsaw before the breakout materializes.

Build your own SPY 0DTE scanner

Use the Zero-DTE endpoint to automate these setups. Try it in the interactive playground - no code required.

Open Playground

SPY vs SPX for 0DTE

SPY and SPX track the same index but differ in ways that matter for 0DTE trading. The right choice depends on your strategy, account size, and tax situation.

FeatureSPYSPX
0DTE scheduleMon / Wed / FriMon / Tue / Wed / Thu / Fri (daily)
Strike spacing$1$5 (some $1 weeklies)
Bid-ask spread (ATM)$0.02 - $0.05$0.10 - $0.30
Exercise styleAmerican (can be assigned early)European (cash-settled at expiry)
SettlementPhysical delivery of sharesCash (no share delivery)
Notional per contract~$59,000 (100 shares x ~$590)~$590,000 (100x ~$5,900 index)
Tax treatment (US)Short-term capital gainsSection 1256: 60% long-term / 40% short-term
Gamma magnitudeHigher per-strike (more OI per $1)Concentrated in $5 increments
Pin reliabilityHigher (tighter strikes, diversified underlying)Lower ($5 gaps allow more price wander)
Early assignment riskYes - ITM 0DTE options can be assignedNone - European exercise

When to Use SPY

  • Pin plays: SPY's $1 strikes and higher pin reliability make it the better vehicle for expiration pinning strategies.
  • Gamma fades: The tighter strike spacing gives you more precise wall levels to fade against.
  • Smaller accounts: SPY options cost roughly 1/10th of SPX options, allowing better position sizing.
  • Intraday scalping: Tighter bid-ask spreads mean less slippage on frequent entries and exits.

When to Use SPX

  • Daily 0DTE: If you want to trade 0DTE on Tuesday and Thursday, SPX is your only choice among S&P 500 products.
  • Tax efficiency: Section 1256 treatment saves significant taxes for profitable traders. On a $10,000 gain, the blended rate (60/40 long/short-term) can save $500-1,500 compared to SPY's pure short-term treatment.
  • No assignment risk: European-style exercise means you never wake up to an unexpected assignment. For spread sellers, this eliminates pin risk on the short leg.
  • Larger accounts: If you're trading 50+ contracts, SPX's higher notional lets you get equivalent exposure with fewer contracts and less commission drag.

Many professional 0DTE traders use both: SPY for Mon/Wed/Fri pin plays and gamma fades (where strike precision matters), SPX for Tue/Thu 0DTE and for all premium-selling strategies (where tax treatment and no-assignment benefit outweigh the wider spreads).

Risk Management for SPY 0DTE

SPY's typical daily range is $2-4 (roughly 0.3-0.7%). On high-vol days (CPI, FOMC, geopolitical shocks), this can expand to $6-10. Your position sizing must account for both scenarios.

Position Sizing Framework

A simple rule: your maximum loss on any single 0DTE trade should not exceed 1-2% of your trading account. For a $50,000 account, that's $500-1,000 max loss per trade. Structure your trades accordingly:

Account SizeMax Loss per Trade (1%)Example Structure
$25,000$2501x $3-wide iron condor on SPY
$50,000$5002x $3-wide butterflies or 1x $5-wide iron condor
$100,000$1,0003-5x $3-wide iron condors or 2x $5-wide butterflies

When SPY 0DTE Doesn't Work

Certain market conditions break the normal 0DTE mechanics. Sit out on these days:

  • CPI / PPI release days. Data drops at 8:30 AM ET, creating a gap that reshuffles all positioning. The pre-open OI is stale, and it takes until 10:00-10:30 AM for new levels to establish. The IV ratio (iv_ratio_0dte_7dte) will typically exceed 1.15 on these days - the market is pricing the event, and your gamma fade or pin play is fighting that pricing.
  • FOMC days. The rate decision at 2:00 PM ET and press conference at 2:30 PM ET inject massive uncertainty into the last 2 hours - exactly when gamma is most extreme. The combination of event vol and gamma acceleration creates moves that no pin score or wall level can contain.
  • Triple witching (quarterly OpEx). When stock options, index options, and futures all expire simultaneously, the cross-asset hedging flows dominate SPY's simple 0DTE mechanics. Levels are less reliable because the positioning is multi-product.
  • VIX above 25. Elevated VIX means realized moves will be larger, making wall levels less reliable as support/resistance. The hedging flows are still real, but they're smaller relative to the directional moves.
# Pre-trade checklist for SPY 0DTE
def spy_0dte_preflight(data):
    issues = []

    if data.get("no_zero_dte"):
        return False, ["No SPY 0DTE today (Tue/Thu)"]

    if data["vol_context"]["iv_ratio_0dte_7dte"] > 1.15:
        issues.append(f"Event premium elevated: IV ratio {data['vol_context']['iv_ratio_0dte_7dte']:.2f}x")

    if data["exposures"]["pct_of_total_gex"] < 30:
        issues.append(f"0DTE only {data['exposures']['pct_of_total_gex']:.0f}% of total GEX  -  full chain dominates")

    if data["regime"]["label"] == "undetermined":
        issues.append("No clear gamma regime  -  positioning is balanced")

    if len(issues) == 0:
        return True, [f"Clear to trade  -  regime: {data['regime']['label']}"]
    return False, issues

ready, notes = spy_0dte_preflight(d)
print(f"SPY 0DTE: {'GO' if ready else 'NO-GO'}")
for note in notes:
    print(f"  {'OK' if ready else 'XX'} {note}")

Max Loss Frameworks

For each of the three setups, define your max loss before entering:

  • Round number pin (butterfly): Max loss is the debit paid. If the butterfly costs $0.80, you can't lose more than $80 per contract. Clean and defined.
  • Lunch reversal (directional): Set a stop at the wall break level (wall price +/- $0.50). On a $1-wide debit spread, max loss is the debit. On a directional stock position, the stop defines your risk.
  • Power hour breakout (debit spread): Max loss is the debit paid. Use $2-3 wide spreads - wider spreads capture more of the cascade but cost more premium.

Cross-reference your risk with the vanna and charm guide to understand how second-order effects might accelerate or dampen your P&L in the final hours.

Know your regime before you trade

Positive gamma = fade. Negative gamma = trend. The regime determines everything - check it in real-time before every SPY 0DTE entry.

Get API Access

Get the Data

Every signal and level in this playbook comes from the Zero-DTE API endpoint - a single call to /v1/exposure/zero-dte/SPY. Available on the Growth plan ($299/mo monthly or $2,868/yr billed annually, 2,500 requests/day) and Alpha plan ($1,499/mo monthly or $14,388/yr billed annually, unlimited requests).

SPY Dashboard Get API Access Zero-DTE API Docs Try in Playground

Related Reading

Live Market Pulse

Get tick-by-tick visibility into market shifts with full-chain analytics streaming in real time.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Execution-Ready

Instantly send structured orders to Interactive Brokers right from your scan results.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!