Methodology

What a check actually does.

You bring a name. LevelCheck runs four sequential checks and tells you which check stopped it — or hands you the whole structure when nothing did.

What it checks

  1. History

    Whether there are enough daily bars to judge the name at all.

  2. Direction

    Whether the stock is actually trending, up or down.

  3. Tradeable

    Whether there is a strike you can get into and out of.

  4. Price

    Whether any strike is priced better than the target justifies.

They run in that order and the first one that fails ends the check, so a stopped result names exactly one check and the reason is never a blend.

Why those four

Technical methodology

The four checks, in order

Every number below is the engine’s own constant. When one changes, this page changes in the same commit.

  1. 01

    History

    At least 60 daily bars. Fewer and the check stops: there is not enough price history to say anything about trend or volatility.

    Internal identifier: DATA · stop code: INSUFFICIENT_HISTORY

  2. 02

    Direction

    The 21-day exponential moving average sits at least 0.1% above the 50-day, and the last close is above the 21-day: that is up. Mirror it for down. Anything else is sideways, and sideways stops the check. A long option needs a direction to pay for its premium.

    Internal identifier: TREND · stop code: NO_TREND

  3. 03

    Tradeable

    The expiration wanted is at least 30 days out, padded 21 days past the target's expected travel time; the nearest listed one at or past that is used. Those are bounds on what is WANTED, not on what is served: when no listed expiration reaches it, the furthest available is served carrying a short-expiration warning, and when the nearest eligible one sits past 120 days it is served anyway. Every strike on it is tested for liquidity first: a mid of at least $0.05, open interest of at least 100 and a bid-ask spread no wider than 10% of the mid. Then the survivors must fall in the 0.20 to 0.75 delta band. A chain with nothing liquid, or nothing in the band, stops on that chain; when it is a weekly, the standard monthly at or beyond it (third Friday, within the 120-day ceiling) is tested once, and served if it passes. A name that stops on both is stopped. The nearest expiration is served whenever it is liquid; the monthly is never tried for a chain that was liquid but had no positive expected value.

    Internal identifier: CHAIN · stop code: ILLIQUID_CHAIN / NO_DELTA_BAND

  4. 04

    Price

    For every strike still standing, the option is priced at the price target and blended against what it would simply be worth at spot — its intrinsic value there, with no time value — by how much support or resistance stands in the way, and the mid is subtracted. If no strike comes out positive, the check stops. If one does, the strike with the highest expected value is the plan.

    Internal identifier: EV · stop code: NO_POSITIVE_EV

Two more states are not checks but stop a result all the same: a name with no listed options (NO_OPTIONS), and a quote still inside the data embargo (DATA_WARMING). Both say so in plain words.

The expected-value model

The price target. When an analyst consensus exists, it is scaled to the chosen expiration: spot plus the consensus move, times the days to expiration over 365. Without a consensus the target is a two-ATR projection in the trend’s direction. The expiration itself is chosen from how many average daily ranges (ATR, 14 days) the move needs.

The formula. For a strike K with spot S, target M and a support-or-resistance factor sr between 0 and 1:

EV = sr × BlackScholes(M, K) + (1 − sr) × intrinsic(S, K) − mid

Read it as: with probability sr the stock reaches the target and the option is worth its model price there; otherwise the level holds, the stock stalls at spot, and the option is worth only what it is worth right now at expiration. The mid is what you pay. A strike with EV above zero is a candidate; none above zero stops the check. This replaced a version that valued a blocked move at zero, which priced some strikes below the cash already in them.

Support and resistance. Levels come from pivots, prior period highs and lows, and volume nodes on the daily bars, merged into one level whenever they sit within 1% of spot of each other — one window the width of the whole ladder, not 1% of each price. A level between spot and the target lowers sr; the more of them, and the stronger, the lower.

Probability. The probability of finishing in the money is N(d2) from Black-Scholes at the quote’s own implied volatility, not the option’s delta. Delta is the hedge ratio and overstates a call’s odds by about five points on this universe; we measured that on the 140 call quotes in the frozen 09-02-2026 census before switching.

The score. A plan also carries a 0 to 100 quality score: 50 base, 20 for trend alignment, up to 30 on a probability ramp, minus 5 for each warning except RISK_BUDGET_TOO_SMALL, which stopped costing points at scale v7 on 09-15-2026. It decides nothing — no result changes because of it; the signed-in board ranks by it and prints it with its scale. It exists so a locked plan records what the evidence looked like that day, under a version number, and is not comparable across versions.

Every warning the score charges is a fact about the name, the data or the quote. One used not to be: if a single contract would risk more than the budget in the request at the 50% premium stop, the plan carries a RISK_BUDGET_TOO_SMALL warning, and until 09-15-2026 that cost 5 points. Because the nightly census that wrote those scores runs at a fixed $500 budget, and a check here started at $500 until 09-24-2026 (it now starts at $25,000 until you change it), a name whose option costs more than about $10 a share was marked down for its price rather than its evidence. Scale v7 stops charging for it. The warning still fires and still prints on the card, and one contract that exceeds your budget is still blocked - only the score stopped encoding a budget that is not yours. Scores from v6 and v7 are not comparable for any plan that carried that warning.

The exit plan

Written before you enter, the same for every plan, and what the journal grades you against.

Underlying stop

1.0 ATR from the entry trigger, against the trade. The daily ATR is 14 periods.

Premium stop

Close if the option loses 50% of what you paid.

Profit target

Close, or roll by your own rule, at +100% on the premium.

Time stop

Close with 21 days to expiration left, whatever the price. Theta is not your friend past that.

Sizing: contracts are the floor of your budget over the dollar risk per contract at the 50% premium stop, which is the premium times 100 times 0.5 — not the premium itself. If that is zero, the card says zero and lets you change the budget without re-running.

The plan also carries an underlying stop, and the option is often worth more there than this rule assumes. Sizing deliberately does not use that, because a gap can pass through a price level and invalidate any value estimated there, while the 50% premium stop is a fixed number that does not depend on where a gap lands.

The data, and how old it is

Three different things, kept apart on every page. The hold:quotes and chains come from a brokerage data feed, and LevelCheck holds every quote back 15 minutes before using it, so nothing on this site is live. The quote time: each result says when the oldest quote behind it was taken (the check’s time minus that quote’s age, which the engine reports rounded up to the minute). The quote’s age: how long ago that was, counted from now wherever both times are known. A result whose quote is older than 60 minutes is labelled stale and muted, carries a stale-data warning, and cannot be locked into the journal, because by then the entry, the stop and the levels are fiction. Daily bars and the analyst consensus come from a second vendor and are refreshed each session day.

All 685 names we cover are checked after each session close and every result is kept, stopped ones included. The shape of each run is published in aggregate — how many cleared and which check stopped the rest — and the names themselves are not.

What it will not do

Run a check to see all of this on a real name.