How Wave Works
Wave is an AI-driven paper-trading system on a single $100K bankroll. Every number below is sourced from the live database at render time — no marketing copy, no hand-waving.
What Wave Is
An AI bot paper-trading crypto on one $100K bankroll. Public, observable, killswitched end-to-end.
Wave is a 24/7 scoring engine that watches the top ~50 crypto perp pairs by volume, scores each candidate across ~8 components, then opens paper trades when the score clears both a regime gate and an execution gate. The trades are real-time against real Binance prices, but the money is paper — no capital deployed until the system proves a 90-day positive edge over BTC buy-and-hold.
Single bankroll, not two. Longs, shorts, and the moonbag accumulation sleeve all share one $100K pool (Spec 2589 architecture). Anything that talks about "$200K combined" is a bug — the integrity audit catches that string in Telegram and report files automatically.
Right now (live from lib/crypto/equity.js):
- Equity: $96415.89 (-3.58% MTM / 0.91% realized)
- Closed trades all-time: 219 — 122 in the v3 cohort (post-rebuild)
- Open positions: 1+ longs · 0 shorts (see /wave for live counts)
- Cash available: $50906 · Invested: $50000 (50% deployed)
Scoring Engine
8 components feed total_score. Each has a status — live, degraded, partial, or disabled. The badges below pull from the same DB keys the /wave dashboard reads.
Pillar status — live from <pillar>_pillar_status settings keys, written by the integrity audit every 30 min:
Per-component breakdown:
Strip-dead-features setting. When score_strip_dead_features=1 (current state), the Smart Money and Narrative Alert contributions are forced to zero in total_score regardless of what the per-symbol scorer returned. Re-enable cleanly by flipping their individual *_enabled flags AND the strip-dead setting back to 0.
onchain_score is null for non-DeFi tokens as of Spec 2599 Phase 1#3 — distinguishes "no DefiLlama mapping" (N/A) from "mapped but scored 0" (real signal). Eliminates phantom-zero dilution in total_score.
Measurement & Self-Audit Layer
How Wave checks its own work: measure first, weight later, no curve-fitting.
Several capture-only systems exist purely to tell us whether Wave is making the right calls. None of them touch a live score. They record what happened, what we skipped, and what we are watching, so a decision to add weight later is backed by data instead of a hunch.
crypto_rejected_candidates.crypto_missed_rallies. crypto_smartmoney_flows. crypto_external_signals (source altfins). crypto_external_signals (source lunarcrush).The discipline is deliberate: a new signal records its read with zero influence, we compare it against what actually happened, and only then do we consider giving it weight. The first review window has passed and every captured source still sits at weight 0 — none has yet earned a live weight.
Two Execution Gates
Score-emit threshold + regime-execution floor. Decoupled per side (Spec 2598).
Every candidate passes through two independent gates. A signal can be EMITTED (score ≥ threshold) but still BLOCKED from execution by the regime floor. The two were coupled until Spec 2598 — shorts now have their own execution floor so a chart-only short setup can fire in flat tape without lowering the long-side defensive floor.
Gate 1 — score-emit threshold: shorts_min_score_after_3_trades=3 (default 4 pre-shorts-pilot). Anything below this never even enters as a signal candidate.
Gate 2 — regime execution floor: long-side reads min_score_neutral=5, short-side reads shorts_min_execution_score=4 (Spec 2598 decoupling). Both havestrict_floor_enforcement kill-switch.
Plus per-trade vetoes: cluster cap, day-of-week filter, funding-APR veto, onchain-zero veto, gap-through guard. Any one of these short-circuits an otherwise-qualifying signal.
Risk Management
Killswitched at every level. Deployment cap, sizing tiers, stops, ratchets.
Every rule below has a settings-key killswitch. Flipping it to 0 takes effect on the next scan tick — no redeploy.
shorts_position_size_pct / tier × conviction × regimemax_deployed_capital_pct=0.80max_open_trades_hard_ceiling / shorts_max_open_trades_hard_ceilingatr_stops_enabled / atr_tp1_mult / atr_tp2_multalways-on (Spec 2550)near_stop_alerts_enabledlong_funding_veto_enabled, range -50% to 0%long_onchain_zero_veto_enabledday_of_week_filter_enabledcorrelation_cap_enabled, max_per_cluster=3Audit Visibility
37 checks every 30 min. equity.js locked as the only P&L source. Pre-commit hook enforces it.
The system catches its own bugs before David eyeballs them. Each audit run cross-checks every live API endpoint, every snapshot table, every score-feature variance against lib/crypto/equity.js(the canonical truth). Dedup state machine prevents repeat alerts inside a 4-hour cooldown.
Run-history table: every wave/crypto cron writes a row to crypto_cron_runs via the shared tripwire helper. Status, duration, output_summary_json, error_message. 30-day retention. Replaces pm2-log-grepping with a queryable history.
P&L canonical source rule (Spec 2599 Phase 8): every $/% number that gets shown or spoken to David comes from lib/crypto/equity.js. scripts/check-pnl-canonical.sh +.git/hooks/pre-commit fail any commit that introduces inline equity math outside the canonical writers.
Tier-1 auto-fix: snapshot drift > $1K vs equity.js auto-repairs the row; stale crons with last_success_at > 2×expected_interval auto-restart via pm2. Cooldown 3/24h per fix-type, 10/24h global cap. Killswitch integrity_audit_autofix_enabled.
Cohorts & Tuning
Pre-rebuild trades stay in the DB but don't feed weight tuning. v3 cohort starts now.
crypto_paper_trades.cohort column added by Spec 2599 Phase 9. All trades before the rebuild ship are tagged pre_rebuild; new trades opened by either scanner now writecohort='v3'. This is NOT data deletion — pre-rebuild trades are still queried for all-time lifetime numbers, but they don't feed Phase 2 weight tuning.
Phase 2 trigger: when cohort='v3' AND status='closed' count reaches n ≥ 30 AND every scoring feature has been alive for the full window, the daily audit auto-proposes re-weights via crypto_audit_proposals (Tier 2 — Silas review, no auto-apply).
Recap audio explicitly distinguishes the two scopes: "Lifetime, all trades: -$1939 over 71 trades" (canonical, equity.js) AND "V3-era cohort: -$X over 122 trades" (subset, labeled). No more pre-rebuild numbers wearing the word "Lifetime."
Current v3 cohort count: 122 closed trades (target n ≥ 30 to unlock Phase 2 tuning).
Daily Rhythm
When each cron runs and what it produces.
wave-daily-auditwave-morning-recapwave-morning-healthcrypto-daily-recapwave-scanwave-shorts-scanwave-near-stop-alertswave-system-integrity-auditwave-defillama-ingestTelegram cadence: morning health DM at 08:00 PT is the canonical "is Wave OK?" digest. Integrity audit Telegram currently muted per operator flag (integrity_audit_telegram_enabled=0) — runs silently, writes reports, alerts when flipped back on. Audit MP3s land at /recaps/<date>-audit.mp3 regardless.
Safety Rails
Killswitched rails layered on top of the scoring engine. Each is independent; flipping its DB key reverts to pre-rail behavior.
The original rebuild on 2026-05-17 added 13 rails over one day. Specs #2826 and #2827 layered another ten on top through May 21 / May 22 — portfolio drawdown breaker, BTC flash breaker, counterfactual shadow replay, wiring drift audit, BTC tape filter, counter-trend guard, daily loss cap, funding entry-gate, news weight set to zero, and the inverse-side shadow loop. Each row shows what it does, why it exists (with backing data where the case was empirical), and the exact DB key to flip if a rail needs to be disabled. Cohort marking is active throughout — pre-rebuild and v3 trades are tagged separately so post-rebuild metrics don't get muddied by legacy data.
Watchdog retune (May 31): liveness, near-miss, and dead-scoring monitoring. A quiet day no longer triggers false alarms now that the score floor is 6; alerts fire only on a stalled scanner or genuinely dead scoring.
Pattern Detection
Bullish + bearish chart-pattern detectors. Aggregator fires on the highest-confidence detection per scan; score folds into total_score via the per-side killswitches.
All detectors live in lib/crypto/patterns.js. The aggregators (detectBullishPatterns, detectBearishPatterns) return the top confidence match plus a 0–3 score that scales into total_score. Killswitches: bullish_pattern_enabled=1, bearish_pattern_enabled=1.
- Double bottom
- Inverse head & shoulders
- Bull flag
- Cup & handle
- Descending wedge
- Ascending triangle
- Symmetric triangle (bullish)
- Wyckoff spring
- Double top
- Head & shoulders
- Bear flag
- Rising wedge
- Bearish structure (LH/LL)
- Descending triangle
- Wyckoff upthrust
Cohort marking is active — pre-rebuild and v3 trades are tracked separately so the detectors' post-rebuild contribution can be measured without legacy contamination.
Strategy Suite (Spec #2828, May 22)
New data feeds, shadow strategies, and sizing helpers shipped as one batch. Most ship in shadow or default-OFF until 7 days of forward data prove the edge.
The diagnostic on the first 116 trades showed that exits work (trail stop is +$6,985) but the entry direction is the leak. The May 22 batch attacks both sides of that problem: new data feeds (BTC dominance, liquidations, funding extremes, event calendar) give the scanners context they didn't have before; new shadow strategies (liquidation fade, Kelly sizing, bankroll compounding, slippage-modelled backtest, pre-listing watchlist) run alongside the live system without affecting real PnL until the data says they earned the upgrade.
Data feeds (always on)
Shadow strategies + sizing helpers
The full strategy plan that motivated this batch lives at /root/cc-summaries/2026-05-22-boostio-10x-strategy-plan.md. Promotion criterion across the board: ≥30 closed shadow trades with WR + payoff that beats the live cohort by more than the round-trip cost. Until then, the live book runs on the existing engine and the new strategies record themselves into crypto_shadow_trades + their per-strategy log tables.
Research & Data Foundation (June 18)
A day spent on data quality, not new trading behavior: a research engine, the survivor-bias fix, and a validated dead-coin universe. Every item here is capture-only at weight 0 — none of it touches live scoring, sizing, entries, exits, leverage or orders.
Research engine, honest outcome. We stood up a full historical-cycle research pass and an analog engine that finds past look-alikes for the current tape, framed around a "Master Trader OS" idea of keeping signal research strictly separate from execution. The honest result: these are context and risk tools, not a proven buy/sell edge. They help us reason about where we are in a cycle; they do not place trades.
We did not wire a fake edge. We swept a portfolio simulator plus position-sizing, exit, veto and entry variants, each tested out-of-sample against a plain fixed-fractional baseline. None beat the baseline out-of-sample, so we wired exactly none of them into live trading. The discipline is the point — we do not ship a strategy change just because it looked good in-sample.
What we actually built — all capture-only research data quality:
What did not change. No trading, scoring, sizing, entry, exit, leverage, order or real-money setting was touched. The delisting/dead-coin events table stays forward-only, and anything merely medium-confidence, conflicting, not-found, unverifiable or tokenized is not promoted — only contract-proven crypto graduates into the lifecycle.
Intentionally Not Here Yet
The honest list of what's NOT in this version, and why.
Wave ships in phases. Below is everything that someone might reasonably assume is part of a "real trader" stack but is deliberately deferred — with the reason for each, so nothing surprises you later.
Roadmap
Triggers, not dates. Wave ships when the data says it's ready.
No fixed dates. The roadmap moves when the data does — n ≥ 30 v3 trades unlocks Phase 2, not a calendar. If a phase needs more time, it gets more time. If it ships earlier, it ships earlier. Either way the morning health DM tells David where we are.
Moonbag Accumulation
A signal-driven, buy-and-hold sleeve for the bottom zone. Not a stop-managed trade: it accumulates deep-value coins and holds them through the cycle.
Wave's trade book is built for momentum: it enters on a score, manages a stop, and exits. That is the wrong tool for a different job, which is accumulating coins you believe in near a cycle bottom and holding them for the move up. The moonbag sleeve is that second tool. It is part of Wave, funded from the same one $100K bankroll, but its bags follow different rules: no hard stop, no take-profit ladder, no time-based exit, and a deeper drawdown tolerance. The momentum manager skips them, so the two styles share one bankroll without interfering. Every bag is a real, tagged Wave long, so it counts in the bankroll's equity and shows up, marked, in the Open Trades table.
How the picks are chosen
The basket is the top Scout candidates by score: deep below all-time high, scored on value, quality, structure, narrative and entry. Every position is tagged with why it is held: the moonbag hold-type (longer hold, higher drawdown tolerance), the signal source (Scout), the score at entry, the live current score, and the percent below ATH. So you can always see at a glance which holdings are patient bags and exactly why each was picked.
The list stays current, not frozen. Scores refresh every run, and a candidate only stays eligible if it still meets the moonbag score bar AND was re-scored recently. A high score that has gone stale (not re-scanned in days) is excluded, so the sleeve holds today's high-scorers, not last week's. Picks that are not on Binance are priced live via CoinGecko, so the best Scout signals are not left out just because they sit off our main exchange feed.
How it accumulates
Built for a no-leverage, hold-the-cycle style: no tight stop, no time-based exit. It deploys a first tranche now, then adds on weakness (pre-planned dip tranches below the entry reference) so being early lowers the average cost, and adds one more tranche when Bitcoin reclaims its rising 50-day average (the trend-turn confirmation). It caps total deployment to keep dry powder in reserve and posts every add to the crypto channel. Nothing is auto-sold: a bag that decays below the bar is flagged for review, and the decision to take profit stays manual.
Paper only, real money off, killswitched (accumulation_enabled). The bags are first-class Wave longs in crypto_paper_trades tagged cohort=moonbag, so they count in the one bankroll's equity and appear, tagged, in the Open Trades table under the Moonbag filter. They sit alongside the on-chain bottom score that reads real MVRV, SOPR, NUPL, realized price and exchange reserves plus a weighted read of Blockchain Backer's posts.
Changelog
What changed and when. The "Last updated" date above is derived from this list, so the page can never quietly drift out of date.
- Daily-OHLCV coverage backfill: the daily OHLC history was missing for many traded symbols, so reconstruction-based research only covered ~30 of 75 closed longs — and that covered set was positively biased (the off-coverage trades were the big losers). We backfilled the daily history for 31 previously-uncovered symbols (ZEC, ICP, TIA, HBAR, ETC, TAO, ONDO, JUP, PENDLE, IMX, STRK, WIF and more) from the existing Binance source — 11,131 rows, the table went from 92 to 123 symbols — and added a keep-fresh guard so a one-time backfill can never silently freeze. Data-quality only; no scoring/sizing/entry change.
- Clean-space breakout, honestly de-biased: once the coverage gap closed, the clean-space/breakout edge that looked strong on the biased subset (+$585 / 70% win on 10 trades) largely collapsed on the full set (+$111 / 53% win on 17). The direction survives but the magnitude was mostly a coverage artifact, so the feature stays capture-only at weight 0 and is NOT promoted. We would rather kill our own pretty result than wire a fake edge.
- Survivor candidate registry + promotion cockpit: every promotion candidate from the recent research chain is now recorded in a machine- and human-readable registry (15 candidates today — implemented-default-off, capture-only, needs-data, analytics-only, rejected) and surfaced read-only on a promotion cockpit, so the exact status, evidence and next-proof of each idea is visible and cannot quietly drift.
- Default-off research wiring: a long coil-veto guard (the most PnL-predictive single component in testing) is wired into the long scanner but ships provably inert — its setting does not exist, so it never fires — pending forward proof. The conviction-flatten idea was rejected after a toggle-accurate replay flipped its apparent edge negative. Net-directional exposure capture runs capture-only. None of these touch live behavior.
- Full self-audit pass: an 8-track, 26-agent read-only audit swept the engine, backtest/PnL canon, data ingestion, the signal stack, shadow strategies, cron/infra health and the database. It confirmed the core discipline holds end-to-end (real money off, signals capture-only at weight 0, optimizer propose-only with a hard blocklist) and found a set of paper-only correctness/hygiene defects — the high-value ones now fixed: the backfilled OHLCV symbols are kept fresh, a false "scanner silent" watchdog alert is gated on real scanner liveness, shadow killswitches no longer strand open positions, promotion recommendations require a credible baseline before flagging PROMOTE, and short targets can no longer be stored as impossible negative prices.
- Multi-cycle validation harness + an honest result: we built a read-only backtest harness that validates candidate edges across the cycle data we already hold (123 alts 2023-2026; BTC/ETH on-chain to 2013), reusing the canonical fill math, net-of-cost, out-of-sample, and survivorship-free (it even includes coins that delisted/collapsed in-window, like the OM crash). A 3-agent adversarial review confirmed the engine has no look-ahead and faithful fill math. The verdict was humbling and useful: the naive directional long edges (trend, breakout, cross-sectional momentum) do NOT clear cost once tested rigorously - the apparent winners were survivorship mirages. We would rather our own tool kill a fake edge than risk money on it.
- On-chain cycle valuation dial (capture-only): the same study found a real, multi-cycle edge - on-chain valuation (MVRV/NUPL) times the cycle at the extremes (BTC NUPL<0 historically +64% over 180d at an 82% hit rate; it marked the 2018 and 2022 bottoms and the 2021 top). A new daily cron now records the BTC+ETH valuation zone, percentile and a suggested long-size multiplier - read by nothing, recorded forward to prove itself before it ever earns a live weight. As of today it reads early/accumulation (ETH below its realized price), not euphoria.
- Deferred-detector audit: corrected the "Intentionally Not Here Yet" list. Two items had quietly SHIPPED — the realtime Binance liquidation websocket now runs as a live pm2 process (the 5-min poll was retired), and the CME-gap scanner is populated and scheduled. The rest (Volume Profile, higher-TF bias, funding×price-action, FVG, Wyckoff Spring) are built into the scanner with score slots but their killswitches are OFF (weight 0) — now under a net-of-cost out-of-sample backtest; only the survivors graduate, capture-only first.
- Discipline unchanged: everything here is paper, capture-only or research wiring at weight 0. Real money stays off, no live scoring/sizing/entry/exit/leverage/order change, and every new idea proves itself forward before it can earn a live path.
- Real funding-rate history: we backfilled the full per-settlement funding history for the perp universe (about 643K rows back to 2019, with APR normalized by each contract’s real funding interval) instead of only a threshold event log, so carry, basis and net-of-cost research finally has a real time series. A keep-fresh job tops it up after each settlement. Capture-only.
- Smart-money contrast lanes: the Nansen capture was inflow-only, so it had no control group and "does smart money predict returns" was untestable. It now records inflow vs outflow/distribution vs a near-zero neutral control, adds 7-day and 30-day outcomes with a BTC benchmark and excess-of-beta, and resolves liquidity plus a canonical coin id per token. Still weight 0.
- Market concentration and leadership: a daily breadth + top-5/10 return-and-volume concentration + leadership-rotation read, plus true top-1/5/10 market-cap concentration and an HHI on the hourly market snapshot. Pure regime/context, never a buy/sell signal.
- The big one - correcting survivor bias: our local history only contained coins that survived to today, so every backtest over-credited winners. We now (a) snapshot the point-in-time investable universe daily going forward, (b) detect coins leaving or re-entering it as forward delisting evidence, and (c) ingested a vendor dead-coin universe (about 29K inactive/delisted coins from CoinMarketCap) bridged to CoinGecko ids and contract-verified. Tokenized stocks and ETFs (Ondo and Reserve wrappers) are explicitly classified out so they never pollute the crypto dead-coin set. Behind an exact promotion gate, 29 contract-proven dead coins (11, then 18 more) are now recorded as delisted in the asset-lifecycle table (274 lifecycle rows total, 29 delisted); dates and market cap stay null because CMC supplies no exact delist dates.
- Discipline unchanged: every item here is capture-only research data-quality at weight 0. None of it touches scoring, sizing, entries, exits, leverage, orders or real money. Dead and delisted assets are staged and validated before anything is trusted; the honest point-in-time universe accrues forward and the deep historical dead-coin set stays provisional until validated.
- The moonbag accumulation sleeve is now part of Wave, not a separate pool. The bags are first-class Wave longs (tagged cohort=moonbag) drawn from the same one $100K bankroll, so they count in the canonical equity and the dry-powder math instead of living in a second book. They still follow hold-the-cycle rules: no hard stop, no take-profit ladder, no time exit, deeper drawdown tolerance, and the momentum manager leaves them alone.
- Unified, filterable Open Trades: every position is now tagged by side (long/short), strategy (momentum/moonbag) and source (Scout), and the trade table has filter chips for each. The moonbag bags show inline, marked, with their score and "hold" in place of stop/TP/time. This is the groundwork for letting members filter and mirror exactly the slices they want.
- Real on-chain bottom metrics: we now ingest MVRV, adjusted SOPR, NUPL, realized price and exchange reserves from CryptoQuant (about a year of daily history backfilled), so the system can finally measure the things a real bottom-caller measures instead of price heuristics. A v2 bottom score is computed alongside the live one from that on-chain data plus a heavily weighted read of Blockchain Backer, whose full Substack posts are now ingested. It currently reads higher than the old score, driven by exchange supply-shock and his bottom call. All shadow: it does not change live behavior.
- Moonbag accumulation sleeve (paper, hold-the-cycle): a buy-and-hold sleeve separate from the trade book, for accumulating deep-value coins near a cycle bottom with no leverage and no tight stop. The basket is the top Scout picks (deep below all-time high), each tagged with why it is held (moonbag hold-type, Scout source, score, thesis, percent below ATH). Scores refresh every run and stale or below-bar names drop off, so it holds current high-scorers, not frozen ones. Picks not on Binance are priced live via CoinGecko. It deploys a first tranche, adds on dips, and adds again when Bitcoin reclaims its rising 50-day average, keeping dry powder in reserve. Real money off, killswitched.
- Bottom-mode shadow longs: a shadow long behavior that holds longer with a looser stop when the bottom score is high and sustained, to forward-test the patient-at-a-bottom thesis. Off by default, no live path.
- Discipline unchanged: everything above is paper and shadow-first, real money stays off, and the new scores and sleeves prove themselves forward before anything earns a live path.
- Why the book felt like constant losses: an 11-agent audit found it was not bleeding (roughly flat) but mis-timed. The book was short-only and the market based around June 6, so we kept shorting bounces. The cause is regime timing: risk_off flips on a sub -10% trailing 14-day return, which stays pinned for about 10 days after a crash while the drop rolls off the window, long after price bottomed. We reverted the June 6 short-loosening so we stop taking low-quality bounce shorts; a full-history replay confirmed the fix, matching the audit number to the dollar.
- Basing sub-state (behind a flag, replay-validated): a no-lookahead detector (distance from the trailing low, bottom-score confirm, 3-day momentum) flags a base about 9 days before the lagging gate flips, so we throttle shorts into a base instead of fighting it. Off by default until forward evidence confirms it.
- New data foundation: we were on 4-hour, close-only prices, so every backtest was blind between marks. We now ingest true 1-minute OHLC bars across the universe (about 3 million backfilled), open interest, Deribit implied volatility (DVOL), cross-exchange derivatives via Coinglass (aggregated OI, funding, long-short ratio), and on-chain exchange flows via CryptoQuant. This gives stop-aware backtests and real volatility for the first time.
- Market-neutral direction: one-sided directional bets are why a bouncing market can hurt us at all. A dollar-neutral long/short book (long the strong, short the weak, net zero to BTC) backtested over 35 days with a positive gross spread, Sharpe near 1.1, and correlation to BTC of 0.08 - essentially uncorrelated. It now runs forward as a paper shadow book to prove out across regimes. No live path, no real money.
- Discipline unchanged: everything is paper, real money stays off, and the new strategy runs in shadow until out-of-sample evidence earns it a live path. We rejected the tempting overfits (flip to longs, promote the inverse cohort, lower the long floor) because the data did not robustly support them.
- The homepage now surfaces the connected data stack that was already documented here: smart-money, social, technical, DEX pricing, market data, TVL, and narrative feeds. It is a visibility change, not a new integration.
- Copy stays honest: these sources are captured and validated first. New sources start capture-only at weight 0 until out-of-sample edge is proven, so nothing shown there drives live trades yet.
- When a short moves meaningfully in our favor before TP1, Wave can now tighten the stop or arm a pre-TP trail instead of leaving the gain unprotected. Defaults are conservative: protect once a short is up about 5%, lock at least a small profit, and arm a pre-TP trail rather than waiting for a TP row that may be missing or too wide.
- No-TP risk decay: if a short has been held for several hours and never moved meaningfully in our favor, Wave tightens its stop to cut the bleed. Forced close stays off by default. It tightens risk first, it does not auto-exit.
- Short side only. Long-side exits, entry score floors, and real-money settings are unchanged.
- altFINS technical signals (capture-only, weight 0): the altFINS signals-feed is now pulled into crypto_external_signals. It contributes a 7-day net bullish or bearish read per token. Like everything new, it is recorded at zero weight and does not touch any score, sizing or entry yet.
- LunarCrush social sentiment (capture-only, weight 0): LunarCrush sentiment (0 to 100) is now captured for our universe with deep mid-cap coverage. This directly addresses the news and sentiment blind spot, since headline news skews toward large caps while Wave trades mid-cap movers. A single bulk call keeps it inside the provider rate limit. Zero weight, measure first.
- DexScreener pricing for smart-money capture: Nansen surfaces tokens outside our trade universe, so their capture price used to be missing. We now price those tokens by contract address via DexScreener at capture time, so forward-return evaluation of smart-money flows is finally possible. Forward only: older rows captured before the fix stay unpriced.
- Cadence and coverage: the external-signals pull moved from once daily to every 4 hours, and the orchestrator now ingests every configured provider together each cycle (Nansen, altFINS, LunarCrush). It stays inside provider quotas at this cadence.
- Top Accumulation feed: a smart-money net-inflow leaderboard now posts to our internal crypto channel every 4 hours. It is observational only, capture-only at weight 0.
- Discipline unchanged: every one of these is recorded with zero influence on trades. They graduate to non-zero weight only after out-of-sample validation shows they predict forward returns. No curve-fitting.
- Nansen smart-money netflow capture: smart-money net inflows and outflows per token (Ethereum, Solana, Base) are pulled every 3h into crypto_smartmoney_flows. This is capture-only at weight 0, it does not touch any score, sizing or entry yet. We are measuring whether smart-money accumulation predicts 24h and 72h forward returns before giving it any weight. This is a new signal, separate from the old disabled creators-based Smart Money pillar.
- Rejected-candidate ledger: every blocked candidate is now recorded in crypto_rejected_candidates with the exact reason (below score floor, symbol cooldown, tier filter, exposure caps) plus its 24h and 72h forward return. If our filters are blocking eventual winners, the data will show it. 450 rows on day one.
- Missed-rally detector: crypto_missed_rallies scans every 4h and logs when an established major (market cap over $300M) rallies 8% or more while Wave was flat or short, along with the reason we did not go long. It targets the systematic blind-spot class such as the HBAR and XLM miss.
- Watchdog retune: the old raw "zero trades today equals alert" logic was retired (it false-alarmed now that a score floor of 6 means fewer trades by design) in favor of scanner-liveness, near-miss context, and a dead-scoring detector that fires only when something is genuinely wrong.
- Discipline: measure first, weight later. The new signals are recorded with zero influence; the first review window has now passed and every captured source still sits at weight 0 — none has yet earned a live weight. No curve-fitting.
- Every cron now heartbeats on success, intentional-skip AND failure (crons/lib/cron-health.js). The skip path updates last-run, so a healthy-but-skipping cron is no longer mistaken for dead.
- New liveness + correctness watchdog judges crons by last-run vs expected interval (a correct skip stays fresh), checks output freshness, self-heals once, and escalates with the real error.
- Read-only cron-health board added at /dashboard/crypto/health. Removed the superseded liquidation poller (the Binance websocket has carried liquidations since).
- Coil scoring v3: "buy the coil before the spring, fade the obvious rocket." Bullish divergence, squeeze, volume and 4h-momentum boost the score; multi-timeframe-aligned, high-ADX, high-ATR and extended-weekly setups are penalized.
- Score-6 quality floor: candidates below a 6 do not execute, killing the low-conviction churn.
- Regime fixes: stopped shorting into caution regimes and unblocked longs that were being over-gated.
- On-chain pillar weighted at 1.75. Self-optimizer (champion/challenger walk-forward) runs daily and only promotes a challenger after an out-of-sample gate. Still 100% paper.
- Short-side scanner now captures the full TA snapshot + coil_score on every short, so a validated coil-short formula can be built on labeled data.
- First public version of this page: 13 rails over one day documenting the scoring engine, gates and risk model.
See it live
Every trade, every signal, every regime change — happening right now.
Open the Wave Dashboard →