Transparency · Methodology
How BullAlert measures momentum
BullAlert is an information & data tool, not a trading app. We surface positive-momentum small-caps within five minutes of their session crossing a meaningful threshold — and we publish the same measurement everywhere it appears. Here is exactly what we measure, what we don't, and what you see.
catch% and peak% — the two numbers that matter
Every signal BullAlert publishes is described by two numbers, scoped to a single (ticker, day, session) triple:
- catch% — the price change at the moment we caught the ticker, measured against the correct session reference. Frozen at catch. Once written, it never updates.
- peak% — the highest price the ticker reached in that session after we caught it. A running max, refreshed every five minutes, frozen at session close (with bar-resolution truth from the daily reconciliation pass).
The three sessions — pre-market (4:00–9:30 AM ET), regular hours (9:30 AM–4:00 PM ET), and after-hours (4:00–8:00 PM ET) — are independent. A pre-market signal that closes its session is not carried forward into regular hours. Each session opens with its own catch and peak.
Why two numbers, not one? Because catch% tells you how early the scanner caught the move, and peak% tells you how far it went. The gap between them — the catch-to-peak delta — is the only honest measure of edge. We sort every leaderboard by this delta, and you can verify it yourself on the public alert history.
Three sessions, three threshold sets
Pre-market, regular hours, and after-hours have different liquidity profiles, different average volumes, and different microstructure. A signal that's noteworthy at 4:30 AM is unremarkable at 10:30 AM, and vice versa. Rather than apply one threshold across the day, the scanner applies three session-aware sets — the concept matters more than the exact numbers, which we keep internal.
At a session boundary, every live row resets. Live candidates.catch_session
switches to the new session; the historical per-session row gets frozen into
candidates_daily_snapshot a few minutes before the boundary. There is no
cross-session inheritance, no “today's catch” that spans pre-market into
regular hours.
Sixteen internal scoring gates
Before a candidate becomes a signal, it passes through sixteen gates. Each gate measures one thing. Below is what each group checks — not the thresholds, formulas, or weights. The recipe stays opaque on purpose; the categories are public on purpose.
Liquidity & structure
- Tradable session — the ticker is currently in an active trading session
- Volume floor — enough turnover that prices reflect real demand, not a single retail order
- Float guardrails — share structure is within a band where momentum can sustain without instant exhaustion
- Price band — the universe is constrained to small-caps where catalysts move price meaningfully
Momentum & flow
- Relative volume regime — today is structurally heavier than the recent baseline at this time of day
- Momentum acceleration — recent move is expanding rather than fading
- Session-aware change — the move is measured against the correct prior-session reference
- Trend confirmation — multi-bar agreement, not a one-print spike
Quality & catalyst
- Sentiment density — a meaningful number of independent social sources have surfaced the ticker recently
- Catalyst presence — a fresh news/filing/event tied to the ticker, with sane recency
- Scoring threshold — internal momentum score crosses a session-aware bar
- Tier eligibility — the catch quality earns S, A, B, C, or D classification
Late-catch & fader rejection
- Late-catch guard — the move has not already exhausted (no chasing local tops)
- Fader rejection — patterns that historically reverse quickly are filtered out
- Drawdown brake — early-cycle weakness disqualifies before it becomes a loss
- Per-session cap — a finite number of catches per session prevents over-firing
Pattern grading (S / A / B / C / D)
Once a candidate clears the gates, the resulting signal is graded on a five-level scale based on how many confirming layers stack up. Grades are outcome-described, not recipe-described:
Highest conviction. Multiple catalyst signals, clean structure, strong session context.
High conviction. Catalyst plus structure, with one fewer confirming layer than S.
Medium conviction. Either catalyst or structure dominates, not both.
Low conviction. The signal crossed gates but the structure is thin.
Marginal. Surfaced for completeness; treat as watchlist context, not a setup.
What we don't do
- We don't show charts, raw price feeds, or order-book depth.
- We don't execute trades. We are not a broker.
- We don't recommend buys, sells, exits, or position sizes.
- We don't claim “win rates.” We don't trade — you do.
- We don't use insider data, off-exchange flow, or anything that isn't public.
- We don't predict gains. We measure session-truth catch% and peak%, after the fact.
What you see
The user-facing surface is intentionally narrow. For every signal:
- Ticker and session (pre-market, regular, or after-hours).
- catch% and peak% against the session reference.
- Number of gates passed (out of sixteen) and tier grade.
- Pattern labels if any cleanly applied (e.g., gap-and-go, VWAP reclaim).
- Catalyst tag when a fresh news/filing event was tied to the catch.
That's it. We don't show our internal scores, weights, thresholds, or vendor stack.
Verify it yourself
Every signal we've ever published is on the public alert history. catch% and peak% are byte-identical across the in-app feed, email digests, social posts, and the landing page — the same (ticker, day, session) row drives all of them. If you find a mismatch, email adrian@bullalert.ai and we'll fix it.
Not financial advice
BullAlert is an educational data tool. We are not a registered investment advisor, not a broker, and not a financial planner. Nothing on this page or in our signals is investment advice. Always do your own due diligence. Past performance does not guarantee future results.