TRACE is a strike × time heatmap of dealer gamma notional — instead of one bar per
strike (like GEX), it sweeps a range of hypothetical
"days-to-expiry" values and colors the whole grid by how much gamma exposure would be sitting at each
strike/day combination. It's a positioning map, not a single-moment snapshot.
Experimental — OA-tier mechanics live-tested. The OA tier's subscription mechanics (contract
resolution, per-expiry strike-window sizing, budget/exclusion diagnostics) have been run live against real IB
data (SPX, 2026-09-14) through several rounds of fixes. See Limitations.
Free Trial, Premium, and WhiteLabel editions only (or Developer mode) — same gate as
GEX/VEX, since both read the same kind of dealer-positioning data. See the
Licensing & Editions guide.
GEX and VEX answer "how much gamma/vanna is sitting at each strike, right now, at today's actual time to
expiry." TRACE asks a different question: "if I pretend a fixed amount of time were left to expiry — 1 day,
3 days, 7 days, whatever — how much gamma would this same open interest imply, at each strike, given its own
real strike, IV, and open interest?" Sweeping that hypothetical across a range of day-counts and stacking the
results strike-by-strike produces a 2-D surface (strike on one axis, days-to-expiry on the other) colored by
gamma notional, rather than a single bar chart.
The reason this is useful: gamma at a strike isn't constant — it grows sharply as an option approaches
expiry and sits near the money (that's why 0DTE gamma effects are so much larger than the same open interest a
month out). A single GEX bar chart only shows you today's snapshot of that. TRACE's heatmap shows you how the
same positioning would express itself as expiry approaches, which is the same idea market practitioners mean
when they talk about gamma "building" into an expiration — you can see the shape of that build-up across the
strike axis before it happens, assuming positioning doesn't change between now and then.
Each cell in the heatmap isn't just one contract's isolated gamma — it's smoothed across nearby strikes (a
small Gaussian spread around each real contract's own strike), so the surface reads as a continuous
positioning field rather than a scatter of spikes at whatever strikes happen to have open interest. This
mirrors how the underlying concept is usually described qualitatively (a "wall" of gamma spanning a strike
neighbourhood, not one exact strike) and is a deliberate modeling choice, not just cosmetic smoothing.
Same caveats as GEX/VEX apply at the conceptual level: this assumes dealers are positioned the way open
interest and the standard convention suggest (see
GEX/VEX's Attractor vs. repellor section for
the underlying logic) — TRACE is a different lens on the same kind of inferred, not observed, positioning.
Reading the three panels
TRACE draws three heatmaps side by side:
Calls and Puts — unsigned gamma magnitude for that side only, sharing
one color scale so the two can be compared directly against each other.
Combined (Net) — calls minus puts, using the same sign convention as GEX
(positive/call-heavy vs. negative/put-heavy), on its own zero-centered, diverging color scale. This is the
panel that answers "where does the net positioning flip sign" and is the one saved when you export a chart
image.
In every panel: the Y-axis is strike, the X-axis is a hypothetical days-to-expiry horizon (nearer expiry on
one end), and a white marker line shows the current underlying price. Color intensity is gamma notional in $
billions, scaled so the brightest cells across all three panels are comparable.
Opening TRACE
Inside an OA window on an eligible symbol (see Availability), click the
TRACE toolstrip button (next to the Hedging Flow button). No expiry tab needs to be
selected, or even loaded — unlike GEX/VEX, TRACE is not tied to the currently-displayed grid tab at all.
TRACE has its own strike-window and expiry-count controls (see Controls below)
— it no longer shares GEX/VEX's strike-range setting. Only the strike spacing (interval) is still
read from GEX/VEX Filters.
Two tiers: OA vs. CDN snapshot
TRACE exists in two forms: a live multi-expiry sweep inside the OA, and a downloaded CBOE snapshot covering
every expiry in the chain at once, but only for the current moment.
OA tier — inside an open OA, using SOAP2's live IB feed. Genuinely multi-expiry: it
enumerates every expiry within Max DTE (up to Max expiries) and subscribes its own off-grid strikes for
each of them, independent of which grid tab (if any) happens to be open. Each expiry gets its own strike
window, sized off that expiry's own expected price move (see Controls) — this is
no longer the same strike set GEX/VEX subscribes.
CDN tier — a standalone window ("TRACE (Gamma Heatmap)" on the Data Chart menu) that
fetches one delayed snapshot of CBOE's full options chain and sweeps every real expiry in it at once, using
a flat Min/Max DTE/Slices/Range% set of controls (unaffected by the OA tier's own controls below) — closer
to how the original standalone script this was ported from was normally used.
Controls
The two tiers have separate, independent controls — a change on one has no effect on the other.
OA tier — Trace Filters (ddTrace dropdown, next to the TRACE button)
Max DTE — maximum trading days to expiry (weekends/holidays excluded), in
whole days (1/2/3/5 presets). Expiries beyond this are excluded from the heatmap entirely, not just the
sweep axis — this is what selects which of the symbol's expiries are included at all.
Max expiries — a direct cap on how many included expiries (nearest first) TRACE ever
subscribes, independent of Max DTE. Use this to cut off-grid market-data line usage further without
narrowing the time window.
Strike range (±σ) — each included expiry gets its own strike window, ± this many
standard deviations of that expiry's own expected price move (ATM IV × spot × √T) — capped at 2σ.
This naturally narrows for near-dated expiries and widens for longer-dated ones, unlike a flat % of spot,
and directly shrinks how many off-grid lines get requested. The IV driving this sizing is TRACE's own
observed near-ATM IV (derived from whatever it has already subscribed near spot), not anything read off a
loaded grid tab — it self-corrects to real data within a couple of 5-second ticks after TRACE is opened.
Saved per symbol, so it's remembered next time you open TRACE on the same symbol.
Smoothing / Heat scale — the Gaussian kernel width (strike points) and the color-scale
divisor; both default to Auto, which derives a sensible value from spot/strike spacing and the 85th
percentile of the surface respectively.
Stop Data / Start Data — releases every off-grid market-data subscription (keeping the
last-drawn heatmap on screen) or resumes them. Independent of leaving/re-entering TRACE mode, which always
tears everything down and restarts fresh.
The X-axis ("days to expiry" swept) is not user-adjustable: it always starts at the nearest included
expiry's own real DTE and steps forward one calendar day at a time, up to the furthest included expiry's
DTE — so it always reads as "today's actual position, then +1d, +2d, ...", anchored to real expiries rather
than an arbitrary range.
CDN tier — its own toolstrip (single-snapshot form)
Range ±% — a flat % of spot, the same window for every expiry in the snapshot.
Min DTE / Max DTE / Slices — the hypothetical days-to-expiry range swept and how many
steps across it. Max DTE is capped at the expiry's real days-to-expiry (sweeping further doesn't change
anything, since a contract can't have negative days remaining).
Dividend yield — defaults to 0%; the OA tier already has each strike's own live
dividend yield from the chain, so it has no equivalent control.
Save (both tiers) — exports the Combined panel as an image, same as the other chart tabs.
Availability
The OA tier shares GEX/VEX's own eligibility (currently SPX/RUT) — both read the same kind of
dealer-positioning data, even though TRACE's strike subscriptions are now independent of GEX/VEX's own.
The CDN tier is SPX-only for now.
Limitations
CDN tier remains untested live. The OA tier's subscription mechanics have been
live-tested against real IB data (SPX, 2026-09-14) and fixed through several rounds of debugging; the
CDN tier has not been exercised the same way.
Smoothing width is an approximation, not a fitted parameter. How far each contract's
gamma is spread across neighbouring strikes is derived from the strike spacing and a fixed percentage of the
underlying price — a reasonable default carried over (and generalized) from the original script, not a value
calibrated against real dealer behavior.
The two tiers use slightly different day-count conventions (OA: calendar/360, matching
the rest of SOAP2's own Greeks; CDN: calendar/365, matching the CBOE-snapshot GEX/VEX form) — close enough
(~1.4% apart) that gamma differs by well under 1% between them, but the two are not bit-for-bit identical if
you compare the same expiry across both tiers.
The OA tier's expected-move IV is a single blended estimate, not per-strike. Every
expiry's strike window is sized off one observed near-ATM IV value (or the Auto fallback before any data has
streamed in), not that expiry's own individual term-structure point — a reasonable approximation for sizing
a window, but not a precise per-expiry IV read.
CDN tier inherits the CBOE delayed-quotes feed's field staleness — Open Interest on that
feed is confirmed static for the whole trading day, so a CDN-tier heatmap reflects that day's opening
positioning, not intraday changes to it. The OA tier reads Open Interest live from IB and isn't affected by
this.
A more advanced "ridge path" overlay (tracing the peak of the gamma surface as a line across the day
axis) exists in the original script this was ported from but was deliberately left out of this first version
— it was the least-tested, most complex part of the source, and may be added later.
As with GEX/VEX, this is a model estimate inferred from open interest and standard positioning
assumptions, not an observation of actual dealer books.