The trading playbook — rules, real backtest cases, and the methodology lessons from the autoresearch loop. Read after How to Read.
scripts/revalidate-howtotrade-numbers.pyDistilled from every autoresearch round. These are the rules that survived backtesting on HYPE's ~18 months of data.
Specific cases from autoresearch where the chart's rules evolved in response to what the data showed. Each case is a real trade, the original system's behavior, what was broken, and what we changed.
signalBUYbb at fire−0.99fwd30+97.8%HTF🔥 Elite trifecta
What broke: the variant-C cluster filter routes only the FIRST BUY of each BEAR run into the actionable count. Apr 2 BUY had already fired, so Apr 6 was tagged suppressed — invisible despite being the highest- conviction trade in the entire validation window.
The fix:Elite override. When a would-be- suppressed BUY day ALSO has a fresh 3D BULL/RECOVERY flip, the suppression is lifted and it's promoted to a real BUY. Apr 6 is now a solid green triangle with a purple ELITE 🔥 above it.
signalNEG_DIV (info-only)bb at fire+0.94fwd24−37.6%weekly15wk BULL
What happened: NEG_DIV pivot fired with bb at +0.94 (euphoria). HYPE was at $48 and the pipeline expected a SELL_WARN or SELL_EXIT to follow within 30 days. Instead, regime flipped to BEAR by Nov 6 — only 8 days later. SELL signals only fire in BULL/TOPPING, so the SELL window closed before the signal could print. Price was at $30 by Nov 22.
What broke:Original chart hid Oct 29 as "info-only" because divLedToTrade === undefined — no SELL had fired in the 30d window.
The fix: bb-extreme alternate gate (NEG_DIV only). A NEG_DIV at bb ≥ +0.7 renders even without a SELL trigger, because the price extreme self-confirms the divergence. Asymmetric — see Case 5 for why.
Karpathy-style autoresearch sweep tested BUY thresholds across the bb_pos range. Original config used −0.7. Sweep result: −0.8 was the optimal cut on the composite metric (total_pnl × win_rate) with min_n gate.
The attempt: changed LIGHT_BUY threshold from bb_pos crossed up through −0.5 to −0.3 to make it more permissive (catch more soft pullbacks).
What broke: the change eliminated the Oct 2025 LIGHT_BUYs that were the only historical fires of the late-cycle BULL ⚠️ warning. The warning markers visibly disappeared from the chart even though the rule itself was unchanged.
The fix: reverted to −0.5.
The proposal: apply bb-extreme alternate gate symmetrically — POS_DIV at bb ≤ −0.7 AND NEG_DIV at bb ≥ +0.7 both bypass the led requirement.
The data check before applying:
| Side | bb-extreme info-only | Outcome |
|---|---|---|
| POS_DIV | 5 fires (Feb 26, Nov 22, Dec 1, Dec 9 + 1) | 4 LOSERS (−31%/−17%/−18%/−8%) · 1 winner |
| NEG_DIV | 1 fire (Oct 29) | 1 winner (−27.2%) |
Symmetric application would surface 4 POS_DIV losers to gain 0 winners — net regression.
The fix: asymmetric. NEG_DIV bb-extreme bypass only. POS_DIV stays gated by led-to-trigger.
User pain point:"sometime I long late bull and got trap."
Test: bucket bull-flavor signals by secularBullWeeksat fire. Expectation: late (≥8wk) underperforms early (<8wk).
Result (re-validated 2026-05-10):
| Bucket | n | Win | Mean fwd30 |
|---|---|---|---|
| LATE (≥8wk weekly BULL) | 4 | 25% | −9.2% |
| Early (<8wk) | 19 | 95% | +31.0% |
Underperformance gap: −40.2pp on mean, −70pp on win rate. The original validation (n=3, −36.3pp) has held up — even strengthened slightly with the extra fire from late 2025. The pain was real, quantifiable, and reproducible on fresh data.
User question:"investigate on if a strong buy after late-cycle bear, or vice versa. Is that a good signal?"
Test: bucket bull-flavor signals by secularBearWeeks at fire. Hypothesis: bear exhaustion = bottom is forming = best entries.
Result (re-validated 2026-05-10 — unchanged): n=5 fires with weekly BEAR ≥4wk returned 100% win, mean +21.2%. Same 5 dates as the original validation (Jan 16, Jan 20, Jan 24, Apr 1, Apr 2 2026) — no new fires landed in this bucket since. The mirror is real and stable.
User reported divergence diamonds were the noisiest signal on chart. Audit:
| Tier | n | Win | Verdict |
|---|---|---|---|
| POS_DIV bright (late-cycle BEAR ≥4wk + tier-2 + led) | 3 | 100% / +29.9% | Keep — unique signal |
| POS_DIV dim (led + tier-2, no late-cycle) | 10 | 60% / +21% | Hide — redundant with triangles |
| POS_DIV info-only (no led, no same-day) | 5 | 20% / +6% | Hide — genuine noise |
| NEG_DIV dim (led, no late-cycle) | 7 | 29% / −4% | Hide — noise |
The redundancy check: all 4 big POS_DIV dim winners (Apr 6 +104%, Aug 21 +34%, Feb 10 +29%, Feb 18 +37%) had a sibling BUY/PULLBACK/LIGHT_BUY within ±6 days. The diamond never alerted a unique trade.
Re-validated 2026-05-10 — unchanged: bright POS_DIV still n=3 (100% / +29.9%), bright NEG_DIV still n=6 (83% / −19.9%). Same fires, same outcomes — no new late-cycle divergences have landed since the original audit.
The fix: only render late-cycle bright divergences. Dim and info-only are hidden in strict mode (HYPE default). Legend still shows hidden counts for transparency.
The change: reduced findPivots(lookforward) from 7 to 3.
Result:
| Metric | lookforward=7 | lookforward=3 |
|---|---|---|
| NEG_DIV count | 9 | 15 |
| SELL fires | 6 | 8 |
| Mean fwd30 (SELL) | −14.7% | −12.6% |
| Visibility lag | 7 days | 3 days |
More fires, slightly lower per-fire quality, but 4 days less lag. Quality dilution was small; the timing improvement was material.
The bug:v1 of the divergence filter scored a win as "price moved ≥5% favorably within 14d." Result: every bucket showed 100% win rate, every filter looked great.
Why:HYPE moves >5% in 14d as baseline. The threshold didn't discriminate.
The fix: v2 used r30 ≥ ±10% directional. Suddenly the buckets separated cleanly (Case 8 above).
The mistake:proposed a "death-zone filter" (5 ≤ days_in_BEAR ≤ 40 AND drawdown > −45%) derived from the same backtest data it would have judged.
Caught: classic overfit. Numbers picked specifically because they happened to exclude the historical losers — guaranteed in-sample success, near-zero out-of-sample confidence.
Fix: dropped the filter.