What is this system?
This is a real-time options market intelligence tool built specifically for trading SPY intraday. It combines two data streams that most retail traders watch separately:
Most tools give you one or the other. The edge here is cross-referencing them: when options flow says bearish AND price confirms it on the chart, that's a much higher-conviction trade than either signal alone.
How the data flows
Understanding the data pipeline helps you know how fresh each number is:
| Step | What happens | Frequency |
|---|---|---|
| 1. Poller runs | Python script on your PC queries a private options-flow API for all SPY options trades | Every 5 min |
| 2. GEX computed | Gamma × size × 100 aggregated per strike per expiry (0DTE through 6DTE) | Every poll |
| 3. Outliers detected | Strikes where |GEX| > 2× the local median of ±5 neighbours are flagged | Every poll |
| 4. Files uploaded | history.json, gex_heatmap.json, markers.json, accuracy.json pushed to your server via FTP | Every poll |
| 5. Pages self-update | Each page checks every 30 seconds if the data timestamp changed — re-renders instantly when a new poll lands | 30s check |
| 6. Live price tick | Yahoo Finance quote endpoint polled every second for the current SPY price, flashes green/red on change | Every 1s |
| 7. Chart bars | Yahoo Finance OHLCV bars fetched on timeframe switch or page load (5m, 15m, 30m, 1h) | On demand |
Your trading workflow
Here's how to use the pages in sequence during a trading session:
Flow Dashboard
The most important numbers from the options flow, updated every poll. Think of this as your market sentiment gauge.
The 6 KPI numbers
| Metric | What it means | Bearish signal | Bullish signal |
|---|---|---|---|
| Net Gamma | Sum of (gamma × contracts × 100) for all calls minus puts. Shows MM hedging direction. | Negative — MMs amplify, moves can trend hard | Positive — MMs dampen, price pins to strikes |
| C/P Ratio | Number of put trades ÷ call trades. Rising ratio = more put buying = hedging/fear. | >1.2 — heavy put activity | <0.8 — call heavy, risk-on |
| Avg IV | Volume-weighted implied volatility across all trades. Rising IV = fear/hedging building. | Rising IV + bearish flow = real fear | Falling IV = complacency, range-bound |
| Call Premium | Total dollar value of call options traded this session. | Call premium collapsing vs prior polls | Call premium growing, buyers aggressive |
| Put Premium | Total dollar value of put options traded this session. | Put premium spiking — large hedges placed | Put premium low relative to calls |
| Data Quality | % of institutional trades this poll where NBBO data was usable for direction classification. Drives confidence in the institutional bias. | Green ≥ 95% (healthy) · Amber 80–95% (caution) · Red < 80% (institutional read unreliable, ignore it) | |
If Data Quality goes red, treat the institutional bias as missing for that poll and rely on the passive (C/P) read alone. The dashboard auto-degrades the combined bias to half-strength in that case.
Bias pill in the navbar — four states
The big bias pill at the top of every page is the combined bias — passive C/P skew AND institutional flow, fused into one verdict. It has four possible states:
| Pill | Meaning | What to do |
|---|---|---|
| BULLISH | Both passive C/P AND institutional flow point up. High conviction. | Bullish setups have flow tailwind. Look for entries. |
| BEARISH | Both passive AND institutional point down. High conviction. | Bearish setups have flow tailwind. Look for entries. |
| MIXED | Passive and institutional disagree. Smart money is fading the broader chain. | Stand down. Transitional regime. Wait for the two signals to align. |
| NEUTRAL | Neither signal is strongly directional. Quiet tape. | No edge from flow. Don't force a trade. |
Hover over the bias pill to see both underlying signals in the tooltip — e.g. "Passive (C/P): BULLISH | Institutional: BEARISH" tells you exactly why the combined pill shows MIXED.
Flow Bias Streak
The coloured dots show the last 7 polls of combined bias. Green = BULLISH, red = BEARISH, amber = MIXED, muted = NEUTRAL. When the same colour appears 3+ times in a row, the bias has been sustained for 15+ minutes — that's meaningful. A streak only counts when BULLISH or BEARISH; the streak counter does not count MIXED or NEUTRAL polls, because those aren't directional reads.
Signal Confluence panel
The confluence panel now shows the full picture in seven rows:
| Row | What it shows |
|---|---|
| Regime | TREND DAY (7d net GEX < −$5M, MMs amplify), RANGE DAY (> +$5M, MMs dampen), or TRANSITION (within ±$5M). White, neutral border — it's regime info, not directional bias. This is the broad 7-day read; the Magnets/Flow Map regime is a separate per-poll structural read. |
| Net γ | Whether MMs are net long or short gamma. Local read from the current poll's flow. |
| C/P | Put/call trade-count ratio with put-heavy/call-heavy/neutral label. |
| IV | Whether implied volatility is rising, falling, or stable poll-to-poll. |
| Inst flow | Institutional bias signal — BLOCK/SPLIT trades plus SWEEPs over $25K premium, classified by NBBO-midpoint. Also shows strength and trade count (n=148). |
| Passive | Passive bias signal — call-vs-put premium ratio across all trades. |
| Combined | The verdict. BULLISH/BEARISH when Inst and Passive agree, MIXED when they disagree, NEUTRAL when neither is directional. The streak counter is shown here. |
Border colour: green = bullish, red = bearish, amber = MIXED/NEUTRAL. When Inst and Passive both show the same colour border, conviction is high. When one is amber and the other green/red, that's the moment to be cautious — the system itself is undecided.
Flow Map
A dedicated observation surface for watching options flow concentrate and migrate across the session. Time runs left → right (one column per 5-min poll), strike runs top → bottom, and each cell is coloured by that strike's flow at that poll. It answers one question: where is flow building, and is that band moving toward or away from price?
Hero — the Build Map
The heatmap grid. A white line traces spot through it; a blue line marks the cursor's poll. Brighter cell = more concentrated flow at that strike. Cells flagged as peaks get an amber outline. The toggle (top-right) switches what the colour means:
| Toggle | What the colour shows |
|---|---|
| Net flow | The strike's cumulative flow-GEX. Teal = call-side, rose = put-side. Shows where flow lives and how the concentration migrates over the day. |
| Building Δ | The per-poll change in flow-GEX. Shows only what is moving this window — the freshest read, where a shift appears before the cumulative totals catch up. |
Companion — Building Now
Below the map, for the cursor's poll: one horizontal bar per strike showing the flow change (Δ) this 5-min window — gaining to the right/teal, bleeding to the left/rose. The spot strike row is highlighted and flagged peaks are marked. This is the de-diluted "what's accumulating right now" read — the antidote to the cumulative bias drifting to neutral.
Scrub & live
The page defaults to live — the cursor is pinned to the latest poll and a new column appears at the right each cycle. Drag the slider (or click the map) to scrub back through the session; the Building-Now panel follows the cursor. The ● live button re-pins to the latest poll. Hover any cell for strike, flow, Δ, share % and momentum.
Read flow in regime context: the per-poll regime label tells you whether "building" means a likely pin (RANGE) or fuel for a move (TREND). The same bright band means different things on a TREND day vs a RANGE day.
GEX Heatmap
This is the structural map of the options market. It shows where market makers have the most hedging pressure concentrated, across 7 expiry dates and every relevant strike.
Reading the colours
The Δ (delta) column
The column next to each GEX value shows the change since the last poll. ▲ +2.1B means $2.1 billion of additional put GEX built at that strike in the last 5 minutes. This is the velocity signal — not where the wall is, but how fast it's growing. A strike that goes from -$500M to -$2.5B in 10 minutes is a major positioning event.
The purple outlier highlight
Cells with a purple border contain GEX values more than 2× the local median of the 5 nearest strikes. These are the statistically significant levels — where positioning is unusually concentrated. These are also the strikes that appear as arrows on the Chart page.
Controls
- Strikes ± slider: Default ±10 around spot. Widen to ±25 to see the full structure, narrow to ±5 to focus on the immediate range.
- Min |GEX| filter: Use $5M+ to cut noise, $50M+ to see only the dominant walls.
- Outlier threshold: 2× is the default. Set to 1.5× to catch more, 3× to see only the truly dominant levels.
Chart + Signal Panel
Timeframe buttons (5m / 15m / 30m / 1h)
Switching timeframes reloads all indicators and rescores the signal panel. The power is in multi-timeframe confluence:
GEX markers on the chart
The ▼ red arrows mark moments when a put-heavy outlier strike was detected. The ▲ green arrows mark call-heavy outliers. When price is approaching a red arrow level and a new red arrow fires just below — that's the put wall asserting itself in real time. Watch for price to bounce or find support there.
Indicator reference
| Indicator | Pane | Key signals |
|---|---|---|
| EMA 9 (yellow) | Price | Fast momentum. Price below = short-term bearish. Cross below EMA 21 = trend change. |
| EMA 21 (blue) | Price | Medium trend. The most important EMA for intraday SPY. Acts as dynamic support/resistance. |
| EMA 50 (purple) | Price | Structural trend. Price below on 15m+ = sellers in structural control. |
| VWAP (orange) | Price | Institutional reference. Retest of VWAP from below = bearish. From above = bullish. Most powerful on 5m and 15m. |
| Bollinger Bands (blue dashed) | Price | Price touching upper band = extended. Lower band = oversold. Squeeze (bands narrowing) = big move coming. |
| MACD 12/26/9 | Pane 2 | Histogram turning negative = bearish momentum. Crossover = trend change. Use as confirmation, not entry signal alone. |
| OBV (orange line) | Pane 3 | Rising price + falling OBV = bearish divergence (buyers not supporting the move). Most useful for spotting distribution. |
| Vol Ratio (orange bars) | Pane 3 | Bright orange = 2.5× average volume bar. A GEX marker firing on a 2.5× volume bar = high conviction move. |
| MFI 14 (purple) | Pane 4 | Above 80 = overbought, below 20 = oversold. Better than RSI for SPY because it requires volume agreement. Divergence from price = coming reversal. |
Magnets & Signals
This page has three tabs — Magnets, Signals, and Log. Magnets are structural GEX levels that update every poll. Signals are triggered events with a full lifecycle. The log is your permanent weekly audit trail stored in browser localStorage.
Two scenario columns
The page now displays only directional scenarios (Bearish and Bullish). The third Gamma Neutral / Pin column was removed after backtest data showed neutral signals hit only 27% vs 69%+ for directional setups — pin theory simply does not predict 5-60 minute moves reliably in this market structure.
| Column | What it shows | How to use it |
|---|---|---|
| Bearish case | Put walls below spot — targets if price drops | Downside targets. Top strike = session target for bearish thesis. |
| Bullish case | Call walls above spot — targets if price rises | Upside targets. Top call wall = ceiling or target depending on bias. |
On range-bound days (a range regime badge here, or RANGE DAY on the dashboard), don't disable the system — read both columns and expect price to oscillate between the top bearish and bullish strikes. The pinning behavior is now visible on the chart rather than as a separate signal column.
Each strike box shows
- Strike + spot distance — how many points from current spot
- GEX + delta —
▲ building $120M= new positioning added.▼ unwinding= positioning leaving. - Momentum dot — building (strong), unwinding (weakening), stable
- Role badge — TARGET, FLOOR, CEILING, or PIN
Signal lifecycle
Signals are directional only (bearish or bullish). Neutral/pin scenarios were removed after the 2026-05-19 backtest showed only 27% hit rate vs 69%+ for directional. The lifecycle is:
| Status | Meaning | Action |
|---|---|---|
| ACTIVE | Conviction ≥ 50% (fire threshold). Distance to target ≥ 1.3pt for directional signals. Not fired before 9:35 ET (open gate). | Signal live. Check Chart entry gate. |
| STRENGTHENING | Conviction +8% this poll | Consider sizing up. |
| WEAKENING | Conviction −8% but still ≥ 40% (collapse threshold) | Tighten stop. |
| RESOLVED HIT | Price touched target ±$0.50 within 30-min watch window. A signal can still be upgraded to HIT after expiring/collapsing if price reaches target inside the watch window. | Take profit. |
| RESOLVED EXPIRED | Signal aged out (hit its max-age) while conviction was still healthy (≥ 60%). The thesis was intact — the clock just ran out. Excluded from hit-rate. | Re-evaluate. The thesis may still be valid; the signal can re-fire after the 15-min cooldown. |
| RESOLVED COLLAPSED | Conviction dropped below 40%, OR aged out with weak conviction (< 60%). The thesis broke. | Exit if in trade. |
Hysteresis: A signal fires at 50% but only collapses below 40%. This prevents churn when a borderline signal oscillates around the threshold.
Dynamic max-age: A signal's lifespan scales with target distance and regime, rather than a flat cap. Base 90 min + 45 min per point of distance, multiplied ×1.3 on a RANGE day (moves are slow) or ×0.8 on a TREND day (moves are fast), capped at 240 min. So a 1.7pt target on a RANGE day gets ~190 min, while a 0.5pt target on a TREND day gets ~108 min. This fixed two real cases (2026-05-20 $742 and 2026-05-21 $745) where correct signals with 1.4–1.7pt targets aged out at the old flat 120-min cap and were mislabeled as failures — even though price reached target shortly after.
EXPIRED vs COLLAPSED: These look similar but mean opposite things. EXPIRED = "thesis was still good, we just stopped watching" (conviction ≥ 60% at age-out). COLLAPSED = "thesis broke" (conviction fell below 40%, or aged out weak). Only COLLAPSED counts against your accuracy stats. EXPIRED is excluded entirely — it's neither a win nor a loss. On the Accuracy page, expired signals show an amber ⏱ EXPIRED badge and are removed from the hit-rate denominator.
Refire cooldown: After any resolution (HIT, EXPIRED, or COLLAPSED), the same (scenario, target) pair is locked out for 15 minutes. This prevents the duplicate-firing bug seen on 2026-05-19 where bearish $733 fired three times in the same 5-minute move because the resolved signal was deleted between polls. Different scenarios or different targets are unaffected — only the exact same setup is suppressed.
Open gate: No signal fires before 9:35 ET. The first few minutes after the 9:30 open, the upstream price feed can still serve the prior session's close, which would compute spot/distance/VWAP against a stale number and fire a bogus signal (observed 2026-05-21). The gate suppresses fires until the feed settles.
Signal accordion — expanded view
Click any signal card to expand and see the full reasoning:
- Why it fired — each factor scored individually: flow bias streak, C/P ratio, net gamma, IV level, GEX momentum, VWAP position.
▼= bearish,▲= bullish,·= neutral. - GEX context — the specific wall, distance from spot, momentum at fire, VWAP at the moment it fired
- Conviction history — mini chart showing conviction evolution across the last 8 polls
Log tab — weekly storage
Stored in browser localStorage keyed by ISO week: spy_log_week_2026-W20. On Monday morning the poller detects your IP, writes an export trigger, and the browser automatically POSTs the previous week's log to the local bridge server — saved to F: radingiles\logs\spy_log_YYYY-WNN.json.
| Event | When it fires |
|---|---|
| MAGNET_APPEARED | New strike moves to top of a scenario column |
| MAGNET_UPDATED | Same strike, GEX changed >10% vs last poll |
| SIGNAL_FIRED | Conviction crossed 50% |
| SIGNAL_UPDATED | Conviction changed ≥5% |
| SIGNAL_RESOLVED | Price hit target OR conviction collapsed below 30% |
Accuracy
The scoreboard. It takes every signal the Magnets page fired (from your browser log) and checks, against Yahoo 1-minute bars, whether price actually reached the target — within 5, 15, 30, and 60 minutes. This is where you find out whether the signals are worth trading.
What counts, and what doesn't
- HIT — price touched the target (±$0.50) inside the window. Counts as a win.
- MISS — the window expired without a touch. Counts as a loss.
- EXPIRED — the signal aged out while conviction was still healthy. Thesis intact, clock ran out. Excluded from the hit-rate denominator entirely — neither win nor loss.
- pending — the windows haven't all elapsed yet. Doesn't affect the numbers until it resolves.
Only fully-resolved signals are scored. This page is the empirical proof behind the entry rules — MIXED-bias and low-conviction setups should show a visibly lower hit rate here, which is exactly what justifies skipping them.
How the page is broken down
| Section | What it shows |
|---|---|
| Headline stats | Overall hit rate (any window), direction-correct rate (did price move the predicted way over 30m), and signal totals. |
| By scenario | Bearish vs Bullish hit rates (and legacy Neutral, for old logs), split into conviction buckets — <50% / 50–70% / 70%+ — so you can see whether higher conviction actually hits more. |
| By time window | How many signals hit within 5m / 15m / 30m / 60m, and the directional accuracy at each. |
| By momentum | Hit rate split by GEX momentum at fire time — building / unwinding / stable. |
| Signal table | Every signal: fire time, scenario, target, conviction %, momentum, entry spot, the four window result chips, the direction result, and the overall outcome badge. |
Use the Date dropdown to load a prior log week. ↓ Export all logs downloads the raw signal log as JSON.
Login & Legal
Every new browser session redirects to the login page before any content is accessible. Three mandatory checkboxes must be ticked:
- Terms of Use — informational only, not financial advice, sole responsibility for trading decisions
- Privacy Policy — no personal data collected server-side; localStorage used only for signal log
- Risk disclosure — options trading carries substantial risk; past signal performance does not guarantee future results
Agreement uses sessionStorage — resets when the browser tab is closed. Every new trading session requires fresh agreement. This is intentional.
Gamma Exposure — deep dive
GEX is the most important concept in this system. Here's the full picture:
What gamma means
Every option has a delta — how much the option moves per $1 move in SPY. Gamma is how fast that delta changes. When SPY moves, delta shifts, and dealers who sold those options must buy or sell SPY to stay delta-neutral. That forced hedging is mechanical, predictable, and large enough to move price. GEX measures the size and direction of that pressure across the whole chain.
GEX formula
GEX per strike = γ (gamma) × contracts × 100 × sign
sign = +1 for calls, −1 for puts
Net GEX = sum of all strikes
What the sign tells you
The sign of net GEX tells you how price will behave today — not which direction it will go, but whether moves will trend or chop. This is the single most important regime read in the system.
• Price up → dealers must buy SPY → adds fuel to the rally
• Price down → dealers must sell SPY → adds fuel to the selloff
This is why negative gamma days trend. Once a direction is established with conviction, dealer hedging compounds it. Pullbacks are shallower, breakouts extend further. Squeezes and flush days happen here.
• Price up → dealers must sell SPY → caps the rally
• Price down → dealers must buy SPY → cushions the drop
This is the pin effect. Price gets magnetized to large-gamma strikes and chops in a range. Signals resolve as partials. Breakouts fail. Mean-reversion wins until a news catalyst overrides the hedging.
• Bearish flow + negative GEX → trend day setup, size up, give more room
• Bearish flow + positive GEX → expect chop around magnets, smaller targets, faster exits
• No directional signal + negative GEX → wait, but be ready — the next direction that establishes will run
• No directional signal + positive GEX → range-trade the magnets, fade extremes
Gamma walls in practice
Individual strikes with large GEX values act as magnets. A strike with -$4.4B GEX (like $738 in your data) means that $4.4 billion in MM hedging pressure is anchored at that strike. When price approaches, the mechanical hedging creates a gravitational pull. Price doesn't always reach the wall — but the probability is higher than random.
The interaction between regime and walls is what makes this useful:
- In positive GEX regimes, walls act as pins — price oscillates around them and gets stuck. Trade fades and mean-reversion into the wall.
- In negative GEX regimes, walls act as acceleration points — once price breaches a wall, dealer rehedging cascades and the move extends. Trade the breakout, not the fade.
- The largest opposite-sign wall above/below spot is your most likely magnet for the session. Map it before the open and treat it as your primary target.
Options Flow — what it tells you
Call premium vs put premium
The raw dollar value of options traded matters more than the number of contracts. A single $50M put sweep tells you more than 500 small call trades. Watch for premium imbalances — when put premium exceeds call premium by 2× or more, large players are paying up for downside protection.
C/P ratio interpretation
| C/P Ratio | Market reading |
|---|---|
| > 1.5 | Heavy put activity — fear or directional bearish bets. Often precedes or accompanies a move down. |
| 1.2 – 1.5 | Elevated put activity — hedging building, market cautious. |
| 0.8 – 1.2 | Neutral. Normal market conditions. |
| < 0.8 | Call heavy — risk-on, bullish positioning, or short-covering in puts. |
IV (Implied Volatility) trend
Rising IV means options buyers are paying more — they're scared or positioning for a big move. Falling IV means complacency. The most powerful setup is rising IV alongside rising put premium alongside bearish flow bias — all three together mean real institutional hedging, not noise.
Two-signal Bias Model
The bias displayed across the system (the navbar pill, the confluence panel, the magnets signals) is not one indicator — it's a combination of two independent readings. Understanding what each one measures, and what their agreement or disagreement means, is the most important concept in this system.
Why two signals instead of one
Earlier versions of this tool used a single bias derived from the call-vs-put premium ratio. That worked, but it produced false confidence: the C/P ratio drifts slowly (it was 0.93 ± 0.01 for an entire 65-minute session on 2026-05-19) and the system would call that "BULLISH × 13 polls" — confident, persistent, and not actually reflecting anything new happening in the tape.
The new model adds a second, independent signal that watches what institutions are actually doing right now, not what the chain looks like in aggregate. When the two signals agree, that's real conviction. When they disagree, the system flags it as MIXED — and that's the most useful new information, because it tells you when not to trade.
Signal 1 — Passive premium skew (flow_bias_premium)
Just the ratio of put premium to call premium across all trades in the last 5-minute poll. This is the "broader chain" view — every trade counts, retail and institutional, hedges and directional, mid-fills and aggressive sweeps. It changes slowly and reflects the overall state of the option chain.
| cp_ratio (pp / cp) | Passive bias |
|---|---|
| ≤ 0.95 | BULLISH |
| 0.95 – 1.10 | NEUTRAL |
| ≥ 1.10 | BEARISH |
The bearish threshold is asymmetric (1.10 vs 0.95) because put protection is structurally bid at all times — institutional hedges are continuously bought even on quiet rallies. It takes a stronger put skew to indicate genuine bearish demand.
Signal 2 — Institutional aggression (flow_bias_institutional)
This is the new signal that reflects what large players are doing right now. It works in two steps:
Step A — filter to institutional trades. Each flow record has an orderType field from the data provider:
| orderType | Classification | Why |
|---|---|---|
BLOCK | Always institutional | Negotiated single-venue fills, minimum size too large for retail. |
SPLIT | Always institutional | Single intent broken into pieces — execution algos. |
SWEEP ≥ $25K premium | Institutional | Aggressive multi-exchange fills with meaningful size. |
SWEEP < $25K premium | Excluded as retail noise | Small urgent fills, mostly retail momentum chasers. |
Step B — Lee-Ready NBBO classification. For each institutional trade, compare the executed price to the NBBO midpoint:
- Price above midpoint (+ 5% spread tolerance) → buyer-initiated (paid up to be filled)
- Price below midpoint (− 5%) → seller-initiated (gave size, wanted out)
- Price within tolerance → mid-fill, not classifiable as either side
Then map to underlying direction:
| Trade | Direction |
|---|---|
| Call bought aggressively (above mid) | Bullish |
| Put sold aggressively (below mid) | Bullish (someone wanted out of puts cheap) |
| Put bought aggressively (above mid) | Bearish |
| Call sold aggressively (below mid) | Bearish (or hedged write) |
If fewer than 5 institutional trades qualify in a poll (slow market, lunchtime), the institutional bias is reported as NO_DATA rather than guessing from a tiny sample. The combined bias falls back to passive-only at reduced strength.
The agreement matrix
The combined bias (flow_bias_combined, aliased as net_flow_bias) is computed by comparing the two signals:
| Passive | Institutional | Combined | Strength |
|---|---|---|---|
| BULLISH | BULLISH | BULLISH | Full (average of both) |
| BEARISH | BEARISH | BEARISH | Full |
| NEUTRAL | BULLISH/BEARISH | Institutional wins | ×0.7 |
| BULLISH/BEARISH | NEUTRAL | Passive wins | ×0.7 |
| BULLISH | BEARISH (or vice versa) | MIXED | ×0.3 (heavily reduced) |
| Anything | NO_DATA | Falls back to passive | ×0.5 |
Reading the MIXED state — what it actually means
MIXED is the system telling you: "Smart money is doing something different from what the broader chain looks like." A few common patterns:
- Passive BULLISH, Inst BEARISH — the chain skews call-heavy (often because of retail call buying or covered-call writing), but institutions are aggressively buying puts. Classic distribution / institutional hedging on a rally. Don't chase the upside.
- Passive BEARISH, Inst BULLISH — put premium is elevated (broad hedging), but institutions are aggressively selling those puts to retail and buying calls. Could be a bottom forming, or smart money fading a fear spike. Don't short.
- Either MIXED state during a fast move — typically transitional. The "winner" of the disagreement usually leads the next direction. Watch the institutional bias closely; it tends to lead.
The simple rule: do not enter new trades when the combined bias is MIXED. Wait for the two signals to align. Existing positions can stay but treat MIXED as a tightening-stops signal, not a "load up" signal.
The "buyer interpretation" caveat
Lee-Ready classifies based on who paid up. A call buyer is classified as bullish — but the other side of every trade is someone selling that call. Are they bearish? Not necessarily. Market makers sell calls to delta-hedge with stock; that's mechanically neutral on the underlying. So the institutional signal really measures aggressive intent on contracts, not pure long/short conviction. For most setups this is the signal you want, but be aware: a session with heavy MM call-writing (and corresponding stock buying for hedge) can read BEARISH on institutional flow while stock grinds up. That's actually a useful signal — it tells you "MMs are absorbing this rally."
Regime — TREND DAY vs RANGE DAY
The Regime label sits at the top of the Signal Confluence panel and answers one question: "Will dealers absorb moves today, or amplify them?"
The system reads regime two ways — don't confuse them
"Regime" appears in two places, computed differently. Both answer "will dealers absorb moves or amplify them?", but one is a broad daily posture and the other is a live, structural read around spot.
| Where you see it | What it measures | How it's computed |
|---|---|---|
| Flow Dashboard → Signal Confluence "Regime" row | Broad dealer posture for the day. | 7-day net GEX — the sum of GEX across all strikes and all expiries in the heatmap. A ±$5M dead-band reads as TRANSITION so a microscopic reading doesn't flicker into a full TREND/RANGE stamp. |
| Magnets & Flow Map "regime" (range / trend / transition) | Where spot sits in the live gamma structure right now. | Per-poll structural classifier over the ±5-strike window (see below). Not a 7-day figure. |
1 · Dashboard regime — 7-day net GEX
Broader and steadier than the per-poll net_gamma in the Net Gamma KPI box (which only reflects what just traded).
| 7-day net GEX | Regime | What dealers do | Implication |
|---|---|---|---|
| > +$5M | RANGE DAY | Dealers are net long gamma. They sell strength, buy weakness to delta-hedge. | Moves get dampened. Price tends to pin to high-GEX strikes. Range-bound, mean-reverting. |
| < −$5M | TREND DAY | Dealers are net short gamma. They buy strength, sell weakness, amplifying moves. | Moves accelerate once started. Trends sustain longer. Breakouts have follow-through. |
| within ±$5M | TRANSITION | No decisive posture either way. | Undecided. Don't lean on regime; wait for it to resolve. |
2 · Magnets & Flow Map regime — per-poll structural classifier
Computed each poll from the ±5-strike GEX ladder (OI-GEX when fresh, otherwise flow-GEX). It asks two questions about where spot sits in the gamma structure, not what the broad daily total is:
- Is GEX at the spot strike positive or negative? Positive = dealers long gamma at spot (damping). Negative = a short-gamma "pit" (amplifying).
- Is spot above or at/below the zero-gamma flip? The flip is the highest strike where the cumulative stack turns net-negative. Above it = damping territory; at/below = amplifying territory.
| Structural read | Regime | Meaning |
|---|---|---|
| Long-gamma at spot and above the flip | range | Dealers damp moves here — range/pin logic is trusted. |
| Short-gamma at spot and at/below the flip | trend | Dealers amplify — breaches accelerate. |
| Mixed (one condition each way) | transition | Ambiguous — range logic is not trusted this poll. |
This is why a day can read RANGE DAY on the dashboard (positive 7-day posture) while a given poll shows trend on the Magnets page — spot has dropped into a local short-gamma pit even though the broad book is long gamma. They answer different questions.
Why the label is white, not red/green
Regime is not directional. A TREND DAY can trend up or down; a RANGE DAY can pin above or below your position. Colouring it green/red would conflate regime with bias. The label is intentionally white so it reads as context, alongside the directional bias which has its own colours.
How to use regime in decisions
- TREND DAY + clear bias — best setup for directional trades. Use wider targets, let winners run, expect follow-through.
- RANGE DAY + clear bias — fade extensions toward the bias. Tight targets at GEX walls. Don't expect breakouts to stick.
- TREND DAY + MIXED bias — high risk. The market can move violently, but the system can't tell you which way. Stay out.
- RANGE DAY + MIXED bias — chop. Expect range-bound noise. Easy day to overtrade and bleed.
Chart Indicators — how they interact
EMA stack hierarchy
The three EMAs form a stack. When EMA 9 > EMA 21 > EMA 50, price is in a bullish alignment. Reverse stack = bearish. The crossovers (EMA 9 crossing EMA 21) are the trigger signals — but only act on them when the larger context (flow, GEX) agrees.
OBV divergence — the key volume signal
On-Balance Volume is the cumulative flow of money in and out of SPY. It rises on up-volume bars, falls on down-volume bars. The signal that matters most:
MFI vs RSI
MFI (Money Flow Index) is RSI weighted by volume. The key difference: RSI can signal overbought even if the move was on massive volume (which is sustainable). MFI won't signal overbought unless the volume confirms the overextension. For SPY — a heavily traded instrument — MFI gives fewer false signals.
Volume Ratio spikes
When a bar prints at 2.5× average volume, something significant happened. Combined with a GEX marker firing at the same time, you know: (1) a major level was being tested, and (2) it happened with real conviction. A 2.5× volume bar at a put wall bounce = high probability support holding.
Signal Scoring — how the panel works
The signal panel scores a three-bucket model. Each bucket is independently normalised to [−1, +1], then blended into a final score. Confidence = abs(final score) × 100%. Direction is NEUTRAL if confidence < 25%.
Final = stateScore × TBD + momentumScore × TBD + flowScore × TBD
| Bucket | Factor | Weight in bucket | How it scores |
|---|---|---|---|
| State ×TBD | EMA stack | TBD | Full stack ±1.0, short-bias ±0.4, mixed 0 |
| Price vs VWAP | TBD | Continuous tanh(diff%) — 0.5% above → +0.46, 1% → +0.76 | |
| Net gamma | TBD | ±0.5 (positive = dampening = bullish for pins) | |
| Flow bias streak | TBD | tanh(streak / 5) × sign — saturates at 1 after ~10 polls | |
| Momentum ×TBD | MACD histogram | TBD | Cross ±1.0, building ±0.7, fading positive −0.3 (key: shrinking histogram = slightly bearish) |
| MFI | TBD | Continuous (MFI − 50) / 50; OB (≥80) → −1.0 override, OS (≤20) → +1.0 | |
| OBV slope | TBD | 5-bar slope normalised by avg volume via tanh — continuous, not 3-bar discrete | |
| Volume spike | TBD | Only fires when ≥1.5× avg AND aligned with price direction | |
| Flow ×TBD | Flow bias streak | TBD | Same tanh(streak/5) × sign (bias appears in both state and flow — by design) |
| C/P ratio | TBD | Continuous −tanh((cp − 1) × 2); cp=0.88 → +0.24, cp=1.5 → −0.83 | |
| IV trend | TBD | ±0.5 (rising >0.5% = fear = −0.5) |
Multi-timeframe overlay
After computing the base score, the panel reads the Ice Cold Read (ICR) panel's 15m / 30m / 1h per-timeframe bias and adjusts confidence:
| MTF agreement with current score | Confidence multiplier |
|---|---|
| All three higher TFs agree | ×1.15 (capped at 100%) |
| Mixed (some agree, some don't) | ×0.85 |
| All three higher TFs disagree | ×0.60 — major downgrade |
On-screen terms — glossary
Every label, badge, abbreviation and status word that appears on the live pages, grouped by page. If you spot a term on screen and want the one-line meaning, it's here.
▲ bullish / up / building · ▼ bearish / down / unwinding · · neutral / flat · γ gamma · Δ change since last poll · ↺ refresh (with countdown to next) · STALE = data older than the freshness limit · — = no data yet. Money is abbreviated K thousand · M million · B billion. The big bias pill (BULLISH / BEARISH / MIXED / NEUTRAL) is the same on every page — see the Two-signal Bias Model.
Glossary · Flow Dashboard
| Term | Meaning |
|---|---|
| Net Gamma | Sum of (gamma × contracts × 100), calls minus puts, this poll. Green positive / red negative. Sublabel shows the Δ vs last poll. |
| C/P Ratio | Put-trade ÷ call-trade premium ratio. Labelled call-heavy (≤0.95), neutral, or put-heavy ⚠ (≥1.10). |
| Avg IV | Volume-weighted implied volatility. ▲ rising / ▼ falling with the % change. |
| Call Prem / Put Prem | Total dollar premium of calls / puts traded this session, with the trade count. |
| Data Quality | % of institutional trades this poll where NBBO was usable to classify direction. Green ≥95% · amber 80–95% · red <80% (institutional read unreliable). |
| Bias streak | Coloured dots for recent polls — green BULLISH, red BEARISH, amber MIXED, grey NEUTRAL. Text reads e.g. "BULLISH for 4 polls = 20min". |
| Regime | TREND DAY / RANGE DAY / TRANSITION from 7-day net GEX. White = context, not direction. Broad daily posture — distinct from the per-poll structural regime on Magnets/Flow Map. |
| Net γ | POSITIVE — MMs absorbing, or NEGATIVE — MMs amplifying (local, this poll). |
| Inst flow | Institutional-only bias (BLOCK/SPLIT + SWEEP ≥ $25K, NBBO-classified). Shows strength (str) and sample size (n=148). |
| Passive | The C/P premium-skew bias across all trades, with its strength. |
| Combined | The fused verdict and its streak — e.g. "BULLISH × 4 polls". BULLISH/BEARISH when Inst and Passive agree, MIXED when they disagree. |
| NO_DATA | Fewer than 5 qualifying institutional trades this poll — the institutional read is withheld rather than guessed. |
| Premium balance | Per-poll stacked bars, call% (green) vs put% (red), with a ▲/▼/· bias arrow per row. |
Glossary · Flow Map
| Term | Meaning |
|---|---|
| Net flow | Map toggle — colour each cell by cumulative flow-GEX (where flow lives). |
| Building Δ | Map toggle — colour each cell by the per-poll change in flow-GEX (what's moving now). |
| call-side / building | Teal cells — call-side flow, growing. The legend's teal swatch. |
| put-side / fading | Rose cells — put-side flow, or flow bleeding off. The legend's rose swatch. |
| peak (flagged magnet) | Amber outline / ◆ — a strike the magnet detector flagged as a local |GEX| peak or support-band member. |
| spot | The white line tracing SPY price across the polls. |
| brighter = more concentrated | Cell opacity scales with |flow| vs the session max — brighter means more flow piled at that strike. |
| BUILDING NOW | The companion panel — per-strike Δ bars for the cursor's poll (gaining right/teal, bleeding left/rose). |
| ● live | Cursor pinned to the latest poll. Click to re-pin after scrubbing back. |
| share % | (tooltip) this strike's share of the detection window's total |flow|. |
| building / unwinding / stable | (tooltip) momentum — flow growing in the same direction / shrinking / unchanged poll-to-poll. |
Glossary · GEX Heatmap
| Term | Meaning |
|---|---|
| Put wall (deep red) | Large negative GEX below spot — acts as a floor / support. Deeper red = stronger pull. |
| Call wall (deep green) | Large positive GEX above spot — acts as a ceiling / resistance. Deeper green = harder to break. |
| put-heavy / call-heavy | The two ends of the colour gradient legend (negative ↔ positive GEX). |
| Δ column | Change since last poll. ▲ +2.1B = GEX building, ▼ = unwinding, · = change under $500K. |
| Outlier (purple border) | |GEX| more than 2× the local median of the 5 nearest strikes — a statistically concentrated level. These also drive the Chart arrows. |
| Strikes ± | Slider — how many strikes around spot to display (default ±10). |
| Min |GEX| | Filter — hide strikes below a $ threshold (All / $1M+ / $5M+ / $10M+). |
| Outlier threshold | Sensitivity for the purple highlight — Off / 1.5× / 2× / 3× median. |
| DTE column colours | Expiry coding: blue 0DTE · amber 1DTE · green 2DTE · grey 3–7DTE. |
| Net 7-day GEX | Aggregate GEX across all strikes and expiries — drives the dashboard's 7-day Regime label. |
| Highlighted row | The strike nearest current spot. |
Glossary · Chart + Signals
| Term | Meaning |
|---|---|
| 5m / 15m / 30m / 1h | Bar timeframe. Switching reloads indicators and rescores the panel. |
| Line / Candles / Bars | Price chart style toggle. |
| EMA 9 / 21 / 50 | Exponential moving averages — gold / blue / purple. Stack order = trend alignment. |
| VWAP | Volume-weighted average price (orange) — the institutional reference level. |
| BB | Bollinger Bands — extension / squeeze. |
| MACD 12/26/9 | Momentum pane — histogram sign and crossovers. |
| OBV · Vol Ratio | On-Balance Volume (accumulation/distribution) with volume-spike bars (bright ≥2.5×). |
| MFI 14 · OB / OS | Money Flow Index; OB = overbought ≥80, OS = oversold ≤20. |
| ▲ / ▼ chart markers | Green ▲ = call-heavy GEX outlier detected; red ▼ = put-heavy outlier. |
| Signal markers | On-bar: ▲/▼ signal fired · ✓ hit target · ✗ expired/missed · ↻ updated. |
| % conf | Signal confidence 0–100% beside the BULLISH/BEARISH/NEUTRAL badge. |
| EMA stack / vs VWAP / MACD / MFI / OBV / Vol spike | The per-factor rows of the Chart-signals bucket, each with a plain-English state (e.g. "Bullish stack", "Crossed ↓ bearish", "OB ⚠", "Rising (accumulation)", "× conviction buy"). |
| Ice Cold Read (ICR) | Higher-timeframe panel: ✓/✗ agreement vs the dashboard signal, a 0–10 conviction pip scale, a TL;DR, per-TF cards (15m/30m/1h), key levels (R resistance / S support), a ↻ "what would flip it" line, and a Risks / caveats toggle. STALE if >10 min old. |
| Signal Events — Today | Bottom log: FIRED / RESOLVED / HIT rows with Time, Event, Scenario, Target, Conv%, Spot. |
| live · 1s / 30s | Price tick rate — 1s during market hours, 30s when closed. |
Glossary · Magnets & Signals
Signal lifecycle states (ACTIVE, STRENGTHENING, WEAKENING, RESOLVED HIT/EXPIRED/COLLAPSED) are covered in full in the Magnets page section above.
| Term | Meaning |
|---|---|
| 🧲 Magnets / 📋 Log | The two tabs — live magnet ladder vs the event log. |
| Bearish Case / Bullish Case | The two scenario columns — "where price goes if it drops / rises". |
| Npt above / below · spot $ | Distance of the strike from current spot. |
| ↓/↑ TARGET | Role badge — a directional target magnet below / above spot. |
| 🛡 SUPPORT / ⛔ RESISTANCE | Role badge — a floor / ceiling level. |
| ● AT SPOT | Role badge — magnet sitting at the current price. |
| ⚡ ACCEL / AMPLIFIES ABOVE / BELOW | Role badge on a TREND-regime level where dealer hedging accelerates a breach. |
| OI / flow / OI+flow | Source badge — which layer detected the magnet (open interest, live flow, or both agreeing). |
| ▲ building / ▼ unwinding / · flat | Flow-GEX momentum vs last poll, with the Δ amount. |
| ▲ peak / support band | Marker — the strike is a detected |GEX| peak / sits in the support band. |
| ⚡ divergence | Flow and OI point opposite ways at this strike. |
| N% of window | This strike's share of the detection window's total GEX. |
| ~N% touch | Empirical touch probability for flagged magnets (reference class only). |
| full / stale · range / trend · flip $ | Context badges — data confidence, the per-poll structural regime (range/trend/transition, not 7-day), and the zero-gamma flip strike. |
| Copy GEX levels to TradingView | Exports the levels as Pine Script (PUT WALL / CALL WALL lines). |
| MAGNET_APPEARED / _RESOLVED | Log event types — magnet first detected / final outcome recorded. |
| ✓ HIT / ≈ CAME CLOSE / ✗ no reach | Log outcome — price reached (≤0.50pt) / near-miss (0.50–1.00pt) / never approached (>1.00pt). |
| max toward / max away | Closest favourable run / worst adverse run while the magnet was tracked. |
Glossary · Accuracy
| Term | Meaning |
|---|---|
| Overall hit rate | % of resolved signals that touched target in any window. |
| Direction correct | % where price moved the predicted way over 30m (regardless of touching the exact target). |
| any window | Hit measured across all four timeframes (5/15/30/60m). |
| ✓ HIT / ✗ MISS | Target touched within ±$0.50 / window expired without a touch. |
| ⏱ EXPIRED | Aged out with conviction still healthy — excluded from the hit-rate denominator. |
| pending / … | Windows not all elapsed yet — not scored. |
| Conviction buckets | <50% / 50–70% / 70%+ — hit rate split by conviction at fire time. |
| By time window | 5m / 15m / 30m / 60m — hits and directional accuracy at each horizon. |
| By momentum | building / unwinding / stable — hit rate split by GEX momentum at fire. |
| Table columns | Fired · Scenario · Target · Conv% · Momentum · Entry $ · 5m/15m/30m/60m chips · Dir (point move) · Result. |
| Hit tolerance ±$0.50 | How close price must come to the target to count as a hit. |
| Date · ↓ Export all logs | Pick a prior log week / download the raw signal log as JSON. |
How to read the Magnets page in a trade
The page has three tabs. Here's the read sequence every time you open it:
Trading Example — Bearish Setup
Based on the May 15, 2025 data — SPY near $738 with dominant put positioning building over 5 polls.
Trading Example — Bullish Setup (partial conviction)
Trading Example — Conflicted Setup (stay flat)
Entry Rules — the checklist
Apply this in order before every trade. Stop as soon as one required condition fails.
Required (all must be true)
- Combined bias is NOT MIXED. When passive and institutional flow disagree, the system itself is undecided — wait for them to align before risking capital.
- Data Quality ≥ 80% (the box on the dashboard signal strip). Below 80%, the institutional bias is unreliable and you're effectively trading on one signal.
- Chart signal confidence ≥ 50%. Below 50% or NEUTRAL = structural ambiguity, no trade.
- Session row confirms the thesis. If session denies, the day's structure is against you — stop here.
- At least 2 of 3 middle timeframes (1h / 30m / 15m) confirm. Momentum must be building in your direction.
- A clear TARGET or SESSION TARGET exists within $5 of spot. No target = no trade.
- 5m Entry Gate confirms. Wait for it even if everything else is green. The gate controls timing.
- You have a defined stop. VWAP breach, EMA reclaim, or FLOOR/CEILING break — one of these must be your stop.
Size by timeframe agreement
| TFs confirming | Size | Note |
|---|---|---|
| Session + 1h + 30m + 15m + 5m | Full size | Maximum conviction — all five agree |
| Session + 1h + 30m + 5m | Normal size | 4/5 — strong, 15m may be lagging |
| Session + 30m + 5m | Half size | 3/5 — decent, watch for 1h to confirm |
| Session + 5m only | Quarter size | Mean-reversion only, tight stop |
| 5m only / Session denies | No trade | Trading against the structure |
Size up further (add to full size)
- Chart signal confidence ≥ 75%
- GEX outlier marker just fired at or near the target strike
- Volume Ratio >2× on the entry bar in the direction of the trade
- MTF overlay confirms (all 3 higher TFs agree → ×1.15 confidence multiplier)
Stay flat (any of these = no trade regardless of signals)
- Combined bias is MIXED. Passive and institutional disagree — wait for alignment.
- Data Quality < 80% (red box). NBBO data is broken or thin; the institutional read can't be trusted.
- Within 30 minutes of a major release (FOMC, CPI, NFP, earnings)
- IV spiked >2% in one poll (unknown catalyst — options are pricing in something you don't know)
- Flow bias flipped direction in the last poll (unstable — wait for a new streak to form)
- Session row denies the thesis
- No clear FLOOR or CEILING to define your stop