Browse docs
Docs / Option Scanner

Option Scanner

Open More → Option Scanner in the top navigation bar. It's a read-only research tool — scans and shows you the option chain, never places an order.

Everything on the page — instruments, spot, option LTPs, and open interest — comes from whichever Broker you pick in the scan form (Kite, Breeze, or Dhan), switchable per scan with no restart. There's no requirement that it be the same broker your strategies trade through.


Scan Modes

Three radio buttons at the top of the form switch the whole page between modes — the controls below them change to match.

Specific Underlying

Type an index (NIFTY, BANKNIFTY, FINNIFTY, MIDCPNIFTY, SENSEX — offered in the autocomplete) or an F&O stock symbol, pick an expiry, and scan its full option chain.

Top F&O Stocks

Scans the market's most active F&O stocks instead of one you name — rank by Value (₹ turnover) or Volume (shares), pick Top 10/20/50, and an Expiry Mode of Nearest or Monthly.

Flow (OI Analysis)

Per-strike open-interest buildup for one underlying's expiry — see Flow mode below. The common filters below (Option Type, LTP %) don't apply here — everything on the expiry is shown.


Common Controls (Specific / Top modes)

  • Option Type — Both, CE only, or PE only.
  • LTP > x% of Spot — only show strikes where the option's last price is at least this percentage of the underlying's spot price. Default 0.5.

Results Columns (Specific / Top modes)

Column Meaning
Spot Underlying's spot price at scan time — shown in Top mode only; in Specific mode it's in the summary line (see below)
Strike Strike price
Type CE (call) or PE (put)
LTP Last traded price
Bid / Ask Best bid/offer, top of book — — when the broker's depth data wasn't available for that strike
Premium % LTP ÷ spot price × 100
IV % Implied volatility (annualized), solved from LTP
Delta Rate of change in LTP per ₹1 move in the underlying
Gamma Rate of change of Delta per ₹1 move in the underlying
Theta Time decay — LTP change per calendar day
Vega LTP change per 1 percentage point of IV
OI Open interest (outstanding contracts)

IV/Delta/Gamma/Theta/Vega are all solved from LTP via Black-Scholes — no broker exposes native IV/Greeks, so these are model estimates, not broker-reported values. Any of them can show — when the LTP falls outside the range implied_vol can solve (illiquid/mispriced quote).

In Specific mode, Spot (and the scan's underlying and expiry) is the same on every row, so it's not shown as a column — it's already in the summary line above the table. It's still included in Export CSV and Ask AI, which add hidden Underlying, Expiry and Spot columns so the data is self-contained once it leaves the page.

Top F&O Stocks mode shows Underlying, Expiry and Spot as real columns since results span multiple stocks — Spot then reflects each row's own stock, not one shared value. Click any column header to sort; Export CSV saves the current table (spot/bid/ask/Greeks included).

Flow Mode Columns

Column Meaning
Spot Hidden on screen (same on every row — shown in the summary line instead); still included in Export CSV and Ask AI
Strike / Type Same as above
LTP Last traded price
Bid / Ask Best bid/offer, top of book — same caveat as above
Spread % (Ask − Bid) ÷ midpoint. — when either side is missing. Above 5% the row's Flag is capped at NOTABLE; above 10% it gets no Flag (the Score still shows). A ⚠ marks anything over 5%
IV % / Delta / Gamma / Theta / Vega Same Black-Scholes estimates as Specific/Top mode above
OI Open interest
OI Δ (today) Change in OI vs. the previous trading day's close
Volume Contracts traded today
Vol/OI Volume ÷ OI — higher means more fresh activity relative to what's already open
Net Chg Change in LTP (₹) vs. previous close
Buildup Price % + OI % move combined, by strength — see below
Score Unusual Activity score, 0-100 — see below
Flag EXTREME/HIGH/NOTABLE from the score, plus unusual when today's volume has reached 50% of open interest

How the Unusual Activity score works

The goal: separate a strike where positioning genuinely looks abnormal from the normal background noise of a chain where every strike moves a little every day. Four signals are scored independently, added together into one 0-100 number, and the number is translated into a flag.

A strike needs a minimum open interest (100 contracts) before any of this runs at all — below that, Buildup shows Weak / Mixed and Score/Flag stay blank. Below that floor there's too little OI for the ratios to mean anything, and an illiquid or untradeable contract (an ltp of 0, e.g. a broker returning zero for a contract "not enabled for trading") would otherwise read as a fabricated ~100% price crash.

1. Volume Turnover — how much of today's open interest just traded

Volume ÷ Current OI. A ratio of 15 means today's volume alone is 1.5× the entire open interest — most of that OI has changed hands today, not a quiet day of odd-lot trading.

Vol ÷ OI < 3 3-5 5-10 10-20 ≥ 20
Points 0 5 15 25 40

2. Fresh OI Positioning — how much of the open interest is brand new today

ABS(today's OI change) ÷ ABS(yesterday's closing OI), as a percentage. A big swing here means real new contracts are being opened or closed, not existing positions just being marked around.

Fresh OI % < 10% 10-25% 25-50% 50-100% ≥ 100%
Points 0 5 10 20 30

If yesterday's OI was ~0 (a strike that just opened), this percentage is meaningless (division by nothing) — the score is capped at 30 and the strike is marked new_position instead of computing a ratio.

3. Buildup Confirmation — does price agree with OI?

Combines the strike's price % move with its OI % move — the classic "buildup" read: price and OI rising together means new money is confidently opening the same side; price and OI moving opposite ways means positions are being closed, not opened.

Price move OI up ≥ 20% OI down ≥ 20%
≥ 1% Strong Long/Short Buildup — 15 pts Short Covering / Long Unwinding — 10 pts
0.5-1% Moderate Long/Short Buildup — 10 pts —
below both thresholds Weak / Mixed — 0-5 pts Weak / Mixed — 0-5 pts

("Long" if price rose, "Short" if it fell.) A brand-new strike (new_position above) always reads as a fresh, high-conviction build here regardless of its price move — there's no prior OI to compare against, so the direction is taken as given.

4. ATM Proximity — how close the strike is to the current spot price

ABS(Strike - Spot) ÷ Spot, as a percentage. Activity right at the money matters more than the same activity in a deep-OTM strike nobody trades — this component rewards strikes near spot and lets far-OTM strikes score low here even if the other three are high.

Distance from spot ≤ 0.5% 0.5-1.0% 1.0-2.0% 2.0-3.0% > 3.0%
Points 15 12 8 4 0

Adding it up: Score = Volume Turnover + Fresh OI + Buildup + ATM Proximity, out of a possible 100. The score sorts into a flag:

Score Flag Meaning
70-100 🔴 EXTREME Exceptional — worth immediate attention
50-69 🟠 HIGH Clearly abnormal positioning
30-49 🟡 NOTABLE Worth keeping an eye on
< 30 — Normal, no flag

The percentile filter — the last check before a flag shows. A score crossing one of the bands above isn't enough on its own: the strike must also rank near the top of that same expiry's own chain today (top ~3% for EXTREME, next ~5% for HIGH, next ~10% for NOTABLE). This matters most on expiry day or a gap-up/gap-down morning, when the whole chain moves together — without this check, an absolute score threshold would flag nearly every strike, which defeats the point of "unusual." A strike can show a score in the 30s-50s with no badge at all if the rest of the chain scored even higher today.

Worked example: NIFTY 25000 CE, spot at 25010 (0.04% away — 15 ATM pts), OI 1,20,000 → 1,45,000 (Fresh OI 20.8% → 5 pts), volume 6,00,000 against that 1,45,000 OI (Vol/OI 4.1 → 5 pts), price up 1.4% (Strong Long Buildup → 15 pts). Score = 15+5+5+15 = 40 → NOTABLE, if it also ranks in the top ~10% of that expiry's chain today.

The chain-wide PCR (OI) (put OI ÷ call OI) shows in the summary line above the table.

Chain summary tiles (the row of small cards under the summary line, also included in Ask AI). All of it comes from the same scan (plus one small extra quote request for IV term and one for the next-month futures) and any figure that can't be computed (no spot, no Greeks) shows —:

Item Meaning
Futures The nearest-expiry futures contract: price, basis (futures − spot, also as % of spot), OI and today's OI change, and a buildup label from price × OI: Long Buildup (price ↑, OI ↑), Short Buildup (price ↓, OI ↑), Short Covering (price ↑, OI ↓), Long Unwinding (price ↓, OI ↓), or Flat / Mixed for tiny moves (price under 0.05% or OI under 0.5%). Use it to cross-check the option flow — e.g. put writing under a futures long buildup reads differently from put writing under a short buildup. Shows — on Breeze (its integration has no futures contracts) or if the futures quote fails; the option scan is never blocked by it
Next futures The next-month futures contract's price, OI and OI change, plus the combined near + next OI change. When the two OI changes are roughly equal and opposite (residual under 30% of the larger one) it says Roll — positions moving to next month, so the near-month "Long Unwinding" / "Short Covering" label above is not a real exit. Most useful in roll week. Hidden when there's no next-month contract (Breeze)
IV term ATM IV and 1σ move for the next 4 expiries, from a quote of the 7 strikes around the money in each. A front expiry with higher IV than the next one is flagged inverted — event risk. Note the 1σ move of the selected expiry near expiry day shrinks toward zero; the later expiries show the wider cone
ATM IV Implied vol at the strike nearest spot (average of its CE and PE)
1σ move Spot × ATM IV × √(time to expiry) — the volatility-implied range to expiry, with its lower–upper bounds
25Δ skew Put IV at the strike nearest −25 delta minus call IV nearest +25 delta. Positive = downside protection is priced richer. — if no strike is within 0.1 delta of ±25
PCR near-ATM / delta-weighted PCR using only strikes within ±5% of spot; and PCR weighting each strike's OI by |delta| so deep-OTM OI counts for less
Put / Call OI walls The 3 strikes with the most put OI (support candidates) and call OI (resistance candidates)
Top-5 OI share Share of each side's total OI held by its 5 biggest strikes — higher means more concentrated
Max pain The expiry price at which option buyers' total payout is smallest. Context only, not a signal on its own

Auto-refresh (Flow mode only) polls on an interval you pick, approximating a live ticker without you re-triggering the scan by hand. It runs server-side, so it keeps going if you navigate away; click Stop to end it.

Scans run in the background. Leaving the page doesn't kill a scan in progress — the last result, and the whole form (mode, underlying, expiry, filters), are restored when you come back. A badge in the top bar shows the scanner's state on every page (running / ready / auto-refresh / recording), and Stop — on the page or the badge — cancels a running scan and ends auto-refresh.

Record history (Flow mode only, off by default) is the always-on counterpart: with the switch on, ThetaPrime saves a snapshot of the selected underlying's option chain every 5 minutes during market hours (Mon–Fri 09:15–15:30 IST, skipping holidays), even with this page closed. Each snapshot covers the next 4 expiries: the nearest two keep the 31 strikes around the money, the other two keep 7 (LTP, bid/ask, OI, volume, IV, delta). It also keeps the near- and next-month futures price and OI, and, for the nearest expiry only, the whole-chain summary above (PCR, max pain, OI walls) — those are never mixed across expiries; later expiries store just their ATM IV and 1σ move. Later expiries can't be reconstructed afterwards, which is why they're recorded from day one. OI, price and IV history builds up for later analysis. Snapshots older than 90 days are deleted automatically.

  • Turn the switch on per underlying (NIFTY, BANKNIFTY, …); the status line shows what's being recorded, the last snapshot time and the total kept.
  • One broker records for all underlyings — the one selected in the Broker box when you last switched an underlying on.
  • It takes effect on the next 5-minute tick, no restart needed. It only runs while ThetaPrime itself is running.
  • Snapshots are stored in flow_snapshots.sqlite in your data folder. It is market data only, so unlike your trades it is not encrypted and is not included in scheduled backups.
  • Each snapshot is one batched quote request for the nearest chain plus the small later-expiry slices and the two futures. If the broker's token has expired the recorder just skips that tick and logs one error event (not one per tick).
  • Don't turn this on in a dev/source install pointed at the same live Dhan or Breeze token as your installed app — the two would each pace themselves against one shared broker rate limit.

Previous-close OI baseline: confirmed accurate for Kite and Breeze. For Dhan it's forwarded to the API but not yet confirmed against a live response — if it doesn't carry OI the way expected, Flow silently falls back to today's first scan as the baseline instead of erroring. A note appears next to the summary line whenever this could apply. See Dhan Known Limitations.

Bid/Ask reliability: Kite and Dhan surface best bid/ask from their native market-depth response — confirmed present in both APIs' documented shape. Breeze's fields (best_bid_price/best_offer_price) are carried over from breeze_connect's tick-stream naming and haven't been confirmed against a live REST response for the option-chain endpoint specifically — if they're absent or misnamed, Bid/Ask just shows — rather than erroring.


Scans run in the background

A scan keeps running on the server when you leave the page. While it runs (and after it finishes, until you open the scanner again) a ⏳ Scan running / ✓ Scan ready badge shows in the top bar of every other page — click it to return to the results. Coming back to the scanner restores the last result; Clear discards it. Press Stop (next to Scan, or ✕ Stop on the top-bar badge from any page) to cancel a running scan and turn off auto-refresh — it shows whenever a scan is running or auto-refresh is on — it halts at the next stage, so a broker call already in flight still finishes. Only one scan runs at a time, and a scan in progress is lost if ThetaPrime restarts. Flow auto-refresh and Record history also keep running when you leave the page (the badge shows ⟳ Auto-refresh / ● Recording); the ● Recording tag only shows during market hours, even if the switch is left on outside them. Stop ends auto-refresh, and the scanner page restores all your selections when you return. Auto-refresh stops if ThetaPrime restarts.

Ask AI

Both result tables have an ✨ Ask AI button — pick ChatGPT, Claude, Perplexity, Gemini, or Copilot and it builds a prompt from the current scan (as CSV), copies it to your clipboard, and — once you confirm the popup — opens that AI's site so you can paste it in for a second read on notable strikes, mispricings, or unusual activity. No API key stored, no call made from ThetaPrime itself — same bring-your-own-AI pattern as the Strategy Composer's payoff diagram.

From Flow mode, the prompt is different: it includes the summary line and the chain summary tiles (futures, expected move, skew, PCRs, OI walls, max pain) alongside the table, and it tells the AI how to read Buildup, Score/Flag and Spread % — including that flags on wide-spread strikes are unreliable and that there is no trade tape. It asks for where OI is concentrated versus the expected move, whether the option flow agrees with the futures buildup, which strikes deserve a closer look, and what data is still missing.

Applies to ThetaPrime v0.46.7 · Page last updated 2026-09-26