The short version
The Break percentage is a conditional probability: given a trendline with this specific combination of features, and given price is currently within 2% of the line, what fraction of historical lines like it were crossed within the next 30 trading days? The same metric is reported for both support and resistance — a "cross" means a daily close on the other side of the line (close below for support, close above for resistance).
The colour is bull-positive: green = good for long positions (low break% on a support, high break% on a resistance), red = bad for longs. The number itself is always the raw probability of a cross.
The headline number alone can be misleading. The signal is in how far a ticker deviates from the base rate, not whether the percentage happens to look high or low.
Which lines enter the model
The pipeline has two stages. First, a label index is built by sweeping every ticker × every trading day and writing one row per qualifying line. Then the lattice is built from those rows with an additional dedup pass so each line counts at most once per active spell.
Label index (per-day, no dedup)
The index keeps every (line, day) row that meets these criteria — the regression training pipeline uses the same file, so we don't drop rows here:
-
Active proximity. The line must be within 2% of the day's close
(
active_threshold_pct). Lines further away aren't "actively tested" and are excluded. - Not yet broken. If price has already closed through the line on any earlier bar, the line is dropped. Once a line breaks, it stays out of the index forever.
- Both passes included. Pass-1 (primary trendlines) and pass-2 (finer-grained secondary lines) both contribute, tagged so downstream consumers can split on them.
Lattice events (one per active spell)
When the lattice is built, the index is filtered down so each line contributes at most one event per contiguous active spell:
- Known 30-day outcome. Rows without 30 trading days of forward data are dropped — they can't be labelled crossed-or-not.
- First day of spell only. Rows are sorted by date per ticker. A line emits an event on the first row where it appears, and stays silent on any subsequent consecutive day it remains in the band. If it leaves the band for a trading day and later re-enters, the next emission counts as a new spell. This stops lines that linger near price for weeks from drowning out lines that get tested briefly and break.
- Pass-1 and pass-2 tracked separately. The lattice keeps separate per-pass slices and falls back to the combined slice when a per-pass cell is too thin.
Each event is then bucketed against 5 line features (gradient, touch count, span days, gap to candles, days since last touch) into a 5-dimensional lattice, separately for support and resistance.
Why the numbers look high (and why that's not a bug)
Lines only enter the rankings when price is within 2% of the line. This is the "actively being tested" window. A support price is sitting on top of has, by construction, been pushed right up to its floor — historically, price usually closes through.
Across all historical events of active lines:
| Partition | Base break rate | Sample size |
|---|---|---|
| Support | — | — |
| Resistance | — | — |
So the model's starting assumption is "an actively-tested support breaks … of the time on average" and "an actively-tested resistance breaks … of the time on average." Any line you score is being compared against those base rates.
Reading the ranking
The probability rankings page shows the same metric in both columns: P(break) within 30 trading days. The default sort is support break% ascending — strongest support first. Think of the list as answering "of all actively-tested lines right now, which are the most historically unusual?"
| Where you land | What it means |
|---|---|
| Low support break% | Support is historically more likely to hold than typical. Strong floor. Bullish for longs. |
| High support break% | Support is historically worse than the already-weak base rate. Expect a breakdown. |
| High resistance break% | Resistance is historically even more likely to break than typical. Bullish breakout signal. |
| Low resistance break% | Resistance is holding firm against pressure. Bearish — price may be trapped below. |
What "guaranteed" means in this model
There are no guarantees at 2%. Across the current lattice, the strongest support cells (depth-5) bottom out around 36% break — well below the ~76% base rate but still nowhere near "certain to hold". The weakest top out near 98%. Resistance runs roughly 46% to 99%. That ~60-point spread between strongest and weakest is the working range of the signal — the headline percentage is only meaningful relative to that spread.
If you look at a screen where everything is in the 60–90% range and think "there's no signal," you're reading it wrong. The population is already biased toward crossing because every line in it is being actively tested. The signal is the ranking — how far each line is from its partition's base rate.
Numbers above are illustrative — pulled from a snapshot of the depth-5 cells. The exact extremes shift slightly each time the lattice is rebuilt, but the working range stays in the same neighbourhood.
Wilson confidence interval
Every headline probability is accompanied by a 95% Wilson CI — e.g. 72.3% [68.4–75.9%].
Narrow intervals mean the historical sample is large enough that you should trust the estimate.
Very wide intervals (e.g. 40% [10–80%]) mean the cell is thin — the model is
guessing from a small sample and shouldn't carry much weight.
Depth badges (d0–d5)
The model uses 5 line features: gradient, touch count, span, gap-to-candles, and days since last touch. At scoring time it tries to find a historical cell that matches your line on all 5 features at once (depth 5). If that cell has fewer than 50 samples, it backs off to a 4-feature match, then 3, and so on.
| Depth | Meaning |
|---|---|
| d5 (full) | All 5 features matched. Most precise answer the lattice can give. |
| d4–d3 | Dropped the lowest-priority features. Still specific. |
| d2–d1 | Only 1–2 features matched. Broad answer, take with a grain of salt. |
| d0 (global) | Fell back to the global base rate. Effectively no signal. |
Cell view: combined vs pass-1 vs pass-2
Within the matched cell, the model further splits by whether your line is a pass-1 (primary) or pass-2 (secondary, finer-grained) line. If the same-pass slice has at least 50 samples, the model uses the slice that matches your line's pass. Otherwise it uses the combined slice.
The hover card header tells you which slice was used. A depth-5 pass-specific slice is the model's most confident answer. A depth-5 combined slice means the specific pass slice was too thin — still a good answer, just less tailored.
Per-feature breakdown
Hovering a Support/Resistance tag shows the headline plus 5 rows — one per feature. These rows are independent lookups, not components of the headline. Each shows what that feature alone would predict if you ignored the other 4.
Use them for sanity-checking. If every individual feature looks bullish but the headline is bearish, the combination is unfavourable even though each feature in isolation looks fine. That's useful extra signal, not a bug.
What the model is and isn't
It's a statistical frequency lookup. Every number comes from counting historical events — there's no extrapolation, no forecasting model, no machine learning prediction. If there's no relevant historical data, the model says so by matching at a shallower depth and reporting a wide confidence interval.
It isn't a trading signal on its own. It tells you how a specific feature combination has behaved in the past. Feature patterns can shift — a regime change, a new market dynamic — and historical frequencies don't know about the future. Use it as one input, not an oracle.