GEX · Methodology
I compute the ES and NQ gamma levels from the listed option chains on the index-tracking ETFs — SPY for the S&P 500, QQQ for the Nasdaq-100 — using per-contract Black-Scholes gamma weighted by open interest, aggregated across the nearest eight expirations within 60 days, and scaled onto the futures contracts by the live futures-to-cash ratio. The whole surface recomputes about every 60 seconds through the session.
This page describes the computation as it actually runs — the data it starts from, the assumptions baked in, and the things a scaled proxy genuinely cannot tell you. I build and trade with these levels myself, so I would rather you understand their limits than trust them blindly.
The inputs are a licensed options-chain feed — strikes, expiries, open interest, bid/ask quotes, and per-contract implied volatility — for the two deepest index-tracking ETF option books, plus the live ES and NQ futures prices from my market-data pipeline. I use the ETF chains rather than the index options because they are among the most continuously and tightly quoted options books that exist; the price of that choice is a proxy step I describe honestly below.
One timing fact matters more than any other: posted open interest is an exchange-published figure that updates on a daily cycle, while implied volatility and quotes move all session. So the intraday movement you see in the levels comes from the live volatility surface and spot — not from fresh open interest.
Every cycle — roughly every 60 seconds — the calculator runs the same pipeline for each market:
1 · Select expirations
Take the nearest eight expirations within 60 days: same-day 0DTE, the weeklies, the monthlies, and the next quarterly. Far-dated LEAPS are excluded on purpose — their deep-strike open interest is large but contaminates near-the-money gamma without saying anything about today's hedging.
2 · Filter strikes
Keep strikes within ±30% of spot. A strike 40% away is noise, not a level. Implied volatility is clamped to a 5%–200% band to reject the occasional garbage print from the feed; a contract with zero posted open interest but a live two-sided quote counts at a minimum weight of one so weekend structure isn't lost.
3 · Compute per-contract Greeks
For every surviving contract, compute Black-Scholes gamma (plus vanna and charm) at its own quoted implied volatility and time to expiry, then weight by open interest and the contract multiplier.
4 · Apply the dealer-positioning convention
Call open interest contributes positive dealer gamma; put open interest contributes negative dealer gamma — the standard assumption that dealers are net short both legs of customer flow. This is an assumption, not an observation; see the limits section below.
5 · Aggregate and identify levels
Sum the contributions per strike into a net dealer-gamma profile, then identify the named levels from that profile (next section).
6 · Scale to the futures and publish
Multiply every level by the live futures-to-cash ratio, snap it to the futures tick grid, and publish — but only if the cycle passes a quality gate (at least one named level or non-zero gamma). A failed cycle publishes nothing rather than something stale.
The same fail-closed rule extends to the website: the live caption on /levels renders nothing at all if the freshest computation is more than a few minutes old. No level is always better than a stale level stamped with today's date.
Call wall
The strike carrying the largest positive net dealer gamma at or above spot, within 10% of spot. If no qualifying strike exists, no call wall is published — a "wall" 20% away is noise, and I'd rather omit the level than stretch the definition.
Put wall
The mirror: the strike with the most negative net dealer gamma at or below spot, within 10%. Same rule — no qualifying strike, no level.
Zero-gamma flip
Solved, not looked up. The flip is the hypothetical spot price at which total net dealer gamma would cross zero, found by binary search within ±15% of spot, recomputing every contract's Black-Scholes gamma at each candidate price. If net gamma doesn't change sign anywhere in that window — a book uniformly long or short gamma — no flip is published. I don't fabricate a number.
Max pain
The strike that minimizes total option-holder payout, computed from open interest across the aggregated chain. Published only when it lands within ±10% of spot.
Expected move
The at-the-money straddle: the mid price of the nearest-expiry ATM call plus the ATM put, projected above and below spot.
High-gamma zones, vanna, charm
The next-largest strikes by absolute net gamma become the numbered GEX levels and high-gamma zones (capped around 20 levels total so the chart stays readable), plus the top two strikes each by absolute vanna and charm.
0DTE share and regime
The 0DTE percentage is the same-day expiry's share of total absolute gamma. The regime flag (positive/negative) compares spot to the flip, falling back to the sign of total net gamma when no flip exists.
Every level starts life in ETF dollars and has to land on an ES or NQ chart. The scaling factor is dynamic: the live futures price divided by the live ETF spot, recomputed every cycle. That ratio automatically absorbs the cash-futures basis — carry, dividends, roll — instead of assuming a fixed multiplier. If no live futures print is available (a cold start outside trading hours), the calculator falls back to the long-run default ratio until one arrives.
After scaling, each level is snapped to the futures contract's tick grid, so what you see on the chart is a tradeable price, not a fraction that no order could ever rest at.
I want to be precise about the limits, because every gamma-levels product on the market shares most of them and few say so.
Dealer positioning is an assumption, not an observation.
No public feed reports who is long or short each strike. The convention here — dealers net short customer flow on both legs — is the standard one, and I sanity-check the aggregate sign against market behavior, but a day where dealers are positioned unusually will move the true walls away from the computed ones. Treat the levels as a well-informed map of hedging pressure, not a measurement of it.
Open interest is a daily number.
A large 0DTE position opened at 10am won't appear in posted open interest until the next day. Its footprint shows up indirectly — through implied volatility and price — which the ~60-second recompute does capture, but the OI weights themselves refresh on the exchange's cycle. On the heaviest 0DTE days, that is the biggest single source of drift between any OI-based model and reality.
The levels are mapped, not native.
An ES "call wall" here is an ETF strike scaled by the live ratio — not a strike where ES options open interest actually sits. The hedging pressure still transmits to the futures, because index-arbitrage ties the ETF, the cash index, and the futures together, but the mapped price inherits the proxy's strike grid and any residual basis drift between recomputes.
Magnitude matters.
A thin options book produces weak walls. The gamma concentrations behind each level differ by orders of magnitude day to day, which is why the terminal draws the levels with their gamma context instead of presenting every wall as equally important. These are context for reading order flow at a price — not signals, and not advice.
These are the levels drawn on the chart in the Sharpnel desktop terminal, summarized each morning in the free daily /ES + /NQ read, and defined term-by-term in the glossary.
See the levels on a chart