Skip to content
investiDocs

Discover

The Discover screen: new entrants from four sources, the 52-week-low screen, candidate states and verdicts, filters and saved screens.

On this page

Exclude holdings and open orders is checked by default and removes owned names and names on working orders from both tables. Include seen and dismissed independently restores historical candidates; it does not bypass the holdings/order exclusion. Every data column sorts from its heading; click again to reverse, or Shift-click to add a second key.

New names and analyses older than seven days enter a durable background refresh queue. The schedule runs every five minutes, processes a bounded batch, and retries failed names without blocking others. It uses the existing research engine and public-data caches, with no paid model calls. The queue status appears below the candidates; completed work refreshes the open page.

Discover runs the 52-week-low screen across US stocks and scores each candidate against your own strategy rules. It is where you find names worth researching. Nothing here places or suggests an order.

Open it from the nav or press g then d. The command palette (Cmd+K) also has "Run 52-week-low screen", which opens /discover?run=1.

Filters#

One filter panel sits above both tables and applies to both: New entrants and the 52-week-low screen.

  • Ticker or name: text that the ticker or the company name contains. Press / anywhere on the page to focus it.
  • Green, Yellow, Red: verdict colors. Each button toggles that color. With none selected, every verdict shows, including flagged, dormant and not yet analyzed. With one or more selected, a row shows only when its verdict is one of those colors. A name with no verdict is hidden while any color is selected.
  • Within N% of 52W low: Any (the default), 2, 5, 8, 10, 15 or 25 percent. Names without a 52-week low are left out only while a distance is chosen.
  • All sectors: limit to one sector.
  • Liquidity: Any liquidity, $5M+/day, $20M+/day, $100M+/day (30-day average dollar volume).

These combine with the source buttons on New entrants and with every column filter in either table: a row shows only when it passes all of them. Clear resets the panel and the source button. The whole view lives in the address bar: the panel (q, within, sector, liq, color as GREEN, YELLOW and RED), the source (src), Include seen and dismissed (seen=1), the holdings/order exclusion (includeCommitted=1 turns it off), and each table's sort, column filters, hidden columns, order and grouping (discover_entrants.*, discover_screen.*). Bookmark or share the address to come back to the same view.

Saved screens stores the whole view under a name (POST /api/v1/screens). Click a name to apply it, or the × to delete it.

Tables#

Both tables are the app's standard table: click a header to sort (Shift-click for a second key), use the filter button in a header or Filter for every column, Columns to show, hide and reorder columns, Group by an enum column, CSV to export what is on screen and Reset view for the defaults. Every row is reachable: the tables scroll inside themselves with a sticky header and a pinned Symbol column, and only the rows in view are drawn, so a list of a thousand names scrolls smoothly. Headers with an (i) explain their column.

New entrants#

The first table answers "which names are new since I last looked". It lists candidates from four sources, explained in full in Candidate sources:

  • Near low: within X% of the 52-week low (your near-low distance, 10% by default), from the scan below.
  • Big drop: down X% or more over N sessions (10% over 1 session by default), $2B or more market cap, and profitable: positive trailing-twelve-month net income and positive operating margin.
  • Strict 1: passes all 11 Finviz Strict 1 filters, recomputed from SEC filings and daily bars.
  • Uploaded: from your screener files (Schwab Stock Screener or Finviz exports).

Hover a source button for its definition with your own thresholds and when it last ran. Each button shows its count (after the panel filters) and how long ago the source last ran, or not run when it has never run, so a 0 is never ambiguous. A source that ran on a fallback says fallback: when Nasdaq's same-session change feed fails, big drops use the one-day change from the last two stored daily closes. The (i) beside the buttons says why a source has no names, and Held back lists big drops the quality gate held back on the latest pass, with the reason.

By default the table shows only new names: first seen within your window (7 days by default) or not yet evaluated under your current rules. Tick Include seen and dismissed to revisit history. The separate Exclude holdings and open orders control still applies. A name in two sources counts in both and appears once. Every entrant arrives with the page, with no paging.

Column Meaning
Symbol Ticker and company name. Hover for the hover card.
Verdict The latest verdict from your rules. Hover or tap the chip for its reason card.
Price, 1D Last delayed price and the same-session change.
Above low Distance above the 52-week low, with a bar, when the scan has the name.
Why Why the name is here, from its sources: "-18.2% in 5d", "new 52W low", "6.4% above 52W low", "Strict 1: 11/11", "uploaded Nov 4".
Source Every source that has the name. Filtering and sorting use the first.
First seen The earliest sighting across its sources. New marks names first seen since your last visit; Back marks a dismissed name that has since traded below the price you dismissed it at.
Strict 1 Filters passed out of eleven, when the name has been checked.
Own? Whether you hold it.
Sector, $ volume 30D, Mkt cap Hidden at first; show them from Columns.

Each row has two actions:

  • Analyze evaluates the name now under your rules (deterministic, no cost) and fills in the verdict.
  • Dismiss hides the name. Investi remembers the lower of its last price and its 52-week low; if it later trades below that price it comes back as new. With seen and dismissed names showing, Restore undoes a dismissal.

Open the arrow at the start of a row for its detail: each source with its first and last sighting, the uploaded file name, the big-drop gate checks, and the Strict 1 checklist with every filter marked Pass, Fail or Unknown, its value and where it came from. Unknown never counts as a pass.

New entrants are evaluated automatically: after a scan and after each close, the analysis queue takes new entrants first. Loading Discover counts as a visit; the Home attention list shows how many new candidates arrived since the last one.

Running a scan#

The header button reads Run screen before your first scan and Rescan and analyze after. While a run is going, it changes to Stop.

A run has two phases:

  1. Scanning prices. The server builds a universe from Nasdaq's listing: US companies above your screener market-cap floor, priced at $5 or more, with plain ticker symbols, capped at your "max names per scan" setting (both live in Settings under Preferences). Names you have traded and names that were nearest their lows last time are scanned first. The browser then steps through the universe 24 names at a time (POST /api/v1/screener/runs, then POST /api/v1/screener/runs/{id}/step). Each name gets up to two years of daily bars, from which Investi computes the 52-week low, ATR, repeated-low count, trend and returns.
  2. Analyzing new and changed names. New entrants from every candidate source that have no evaluation under your current rules go first. Then names that are New or Changed, not blocked by a hard rule, and sit within 1.5 times their own ATR-scaled entry gate get a full evaluation (SEC solvency and filing checks, market cap, earnings date and the market regime), four at a time (POST /api/v1/screener/analyze). Names whose prior analysis is still valid are reused, not recomputed.

Opening /discover?run=1 starts a run automatically, once.

Note: The first scan takes a few minutes. Later runs reuse prior work, so they are faster. Price fields come from Nasdaq daily bars (regular session, split-adjusted).

Research queue#

While a run is active or after one finishes, a status block shows a progress bar (processed / total) and these counters:

Counter Meaning
Processed Names whose prices were scanned.
Skipped Names with no resolvable symbol or fewer than 30 daily bars.
Failures Names whose data request failed. Recent failures are listed below.
Analyzed Names given a full evaluation in this run.
Reused (no new work) Names whose prior analysis was still valid.
Queue left Names still waiting for full analysis.
Cost Always $0.00. The batch uses deterministic rules only, with no paid model calls.

The last 14 analyzed names appear as chips with their verdict, marked "changed" if the verdict moved. A name whose analysis failed shows as Insufficient.

Candidate states#

States are not exclusive; a name can be Owned and Changed at once. The State column shows the most important one (Blocked, then Stale, Changed, New, Ordered, Owned, Unchanged). Hover it for the reason.

  • New: never analyzed under your current record.
  • Changed: the policy version changed, material inputs changed, or the full analysis is more than seven days old.
  • Unchanged: the prior analysis is still valid.
  • Owned: you hold shares. Ordered: you have a working order.
  • Blocked: a hard rule from Settings excludes it.
  • Stale: data is more than 36 hours old, or there is not enough data to evaluate.

Full detail is in /docs/concepts/candidate-states.

The 52-week-low screen#

The second table lists every scanned name within 25% of its 52-week low, nearest the low first. The panel filters apply here too.

Column Meaning
Verdict The latest verdict from your rules (or your override). Hover or tap for the reason card.
State The most important candidate state (see above). Hover for the reason.
Price, 1D Last delayed price and day change, updated from the quote stream.
30D Sparkline of the last 30 closes; sorts by the change across them.
52W low Lowest close over the trailing 365 days.
% above low Last price relative to that low, with a bar.
14D ATR% Wilder ATR(14) as a share of price.
Last new low Date of the most recent new low, with a count if several occurred recently.
Own?, Pending order Whether you hold it, and any working order.
Why The state reason, or the hard rules that block it.

Hidden at first, from Columns: $ volume 30D, 50DMA direction, 5D and 1M returns, Mkt cap, Sector and Data through (the last bar date). Click a ticker to open its research page.

How Discover works#

The How this works drawer in the page head holds the methodology: each source's definition with your thresholds, where price data comes from (Nasdaq daily bars, regular session, split-adjusted), when full verdicts run (new entrants from every source, and New or Changed names within 1.5 times their own entry gate, with the widest gate from your rules) and how Strict 1 is computed.

Empty states#

  • Before any scan: "No scan yet" with a Run screen button.
  • When the panel filters or the source button hide every row: how many names they hide, with Clear filters.
  • When a column filter hides every row: "No rows match these filters" with Clear filters.
  • A source with no names says why (not run yet, or 0 of 161 checked pass).

For how verdicts are decided, see /docs/concepts/verdicts-and-policy and /docs/strategy/rules.