The setup
On April 26, 2026, we deployed a Coinbase Advanced trading bot with a controlled live-test stake. Within 6 hours we halted it. This page explains why — with the actual numbers, every order we placed, and the math most retail trading strategies bury.
If you sell trading signals, run a Discord pump group, or tweet "I'm up 200% this year" — you should read this and ask whether your strategy survives net of fees.
Our SEC catalyst scanner has an audited 89% hit rate on equity catalysts (full audit at /trust/). We wanted to extend that edge to crypto by trading the BTC/ETH/etc spot market on Coinbase, using a multi-signal stack:
- SEC catalyst flag (when scanner flags a crypto-treasury equity like MSTR/MARA/RIOT)
- BTC ETF heavy-flow signal (combined dollar volume > $2B)
- Crypto-calm signal (DeFi liquidations in drift state)
- ETH gas-relief signal (ETH-only)
- Coinbase premium (CB BTC vs Kraken BTC, indicates US institutional buying)
- Intraday momentum (1h breakout in top quintile of 24h returns + 4h trend agreement)
Combined into a 0–6 score. Threshold ≥ 2 to enter. Conviction-weighted position sizing (5%–20% of equity scaled to score). +5% take-profit, −4% stop-loss, 168h time-stop. Re-entry blocked while holding.
"Edge confirmed" — and wrong
We ran a 60-day walk-forward backtest across 10 coins, 210 trades. Result:
Hit rate 48.6% Avg strategy return +4.83% per coin Avg buy-and-hold +2.32% per coin Alpha vs buy-and-hold +2.52% Verdict EDGE confirmed ✓
We deployed live. Placed three real-money trades. Then ran the backtest again — this time with Coinbase's actual taker fee (25bps × 2 sides = 50bps round-trip) subtracted from each trade.
Same data, fees included
Hit rate 48.6% (same) Avg strategy return -5.24% per coin ← SUBTRACTING fees Avg buy-and-hold +2.71% per coin Alpha vs buy-and-hold -7.95% Verdict NO EDGE — bot underperforms B&H by 8% ✗
The same strategy that looked like alpha became a fee-bleeder once we honestly accounted for the cost of trading. 21 trades per coin × 50bps = 10.5% in fees over 60 days per coin. The +2.52% gross alpha was completely consumed.
Before halting, we tested two adjustments:
| Config | Strategy | B&H | Alpha |
|---|---|---|---|
| 5% TP / 4% SL (original) | −5.24% | +2.71% | −7.95% |
| 8% TP / 3% SL (asymmetric) | −4.88% | +2.91% | −7.79% |
Tighter or wider exits don't help — the underlying win/loss distribution at 48.6% hit rate just isn't favorable enough to overcome 50bps × 21 trades. Tuning can't fix a strategy that doesn't have edge.
The honest halt
We wrote a halt file. Bot stopped placing new entries. The three live positions ($24.70 ETH × 2 + $9.69 BTC) stayed open and were set to exit naturally on TP/SL/time-stop. Total real-money loss: about 0.6% in fees on the live-test stake.
We caught this on day one of live deployment, lost less than 1% of capital, and now know two things we didn't know before:
- Pure intraday momentum on hourly bars has no alpha after Coinbase's retail fee tier. This isn't a tuning issue — it's a strategy-doesn't-work-at-scale issue. Fixing it requires either materially better signals (lower trade frequency or higher hit rate) or materially lower fees (Tier 2+ volume — unreachable at live-test scale).
- Our SEC scanner edge probably doesn't transfer to crypto spot directly. The scanner has 89% hit rate on equity catalysts. But "MSTR catalyst hit" doesn't mean "BTC will move 5% in next 168h." The correlation is weaker than the per-equity edge.
Research found alpha. Halt auto-lifted.
weekly_rotate, drawdown_buy, regime_split, dual_momentum).
One of them — dual_momentum — cleared the +1% promote threshold with
+1.87% net alpha vs B&H over 60 days, 91.7% hit rate (11/12 winners),
only 12 trades so the fees barely bite. The lab auto-removed the halt file and wrote
.live_strategy.json naming dual_momentum as the live strategy.
What dual_momentum actually does
Antonacci-style trend confirmation on hourly crypto bars — four rules, all required to fire an entry:
7d return positive
The most recent week must be uptrending. No buying into a down week.
30d return positive
The longer-window trend must agree. Stops false breakouts in down regimes.
Not at 24h high
Don't chase the local top. Price within 1% of yesterday's high → skip.
All three pass
If any rule fails, no entry fires. Most days we don't trade.
It's intentionally restrictive. Most days no entry fires. When it does, the trend is multi-window confirmed and the entry isn't right at a local peak. Wide TP (+15%) and tight SL (−6%) — one winner pays for two losers; with 91.7% hit rate, very few losers happen.
Why others failed and this one won
| Strategy | Trades | Hit % | Alpha vs B&H | Verdict |
|---|---|---|---|---|
| momentum_5_4 (original) | 102 | 52.9% | −11.29% | FAILED |
| buy_and_hold (control) | 5 | 100% | −0.34% | FAILED |
| bear_regime_long | 40 | 55.0% | −4.42% | FAILED |
| weekly_rotate (new) | 18 | 44.4% | −13.24% | FAILED |
| regime_split (new) | 7 | 71.4% | −0.70% | FAILED |
| dual_momentum (new) | 12 | 91.7% | +2.00% | EDGE — PROMOTED |
The pattern: low trade count + high hit rate + dual-window trend confirmation is what survives the fee tax. Single-window strategies trigger too often and get eaten by fees. Dual-window strategies trigger rarely and only when the trend is actually established.
How the live bot uses this
We wired dual_momentum directly into agent_coinbase.py on 2026-04-27.
The live bot now runs a closed loop:
- Reads
.live_strategy.jsonon every run - Uses dual_momentum's price gate (7d & 30d positive, not at 24h high) as the primary entry filter
- Drops the SEC-catalyst hard gate that previously required treasury flags
- Uses SEC catalyst as a position-size multiplier instead — no catalyst = 1.0× base, treasury_w 3-4 = 1.5×, treasury_w ≥ 5 = 2.5×
- Uses dual_momentum's TP (+15%) / SL (−6%) / max-hold (336h = 14d) instead of the legacy 8/3/168h
First live trade since the halt fired at 04:13:42 UTC on 2026-04-27 — $5.00 ATOM-USD at $1.993, gated by dual_mom_7d=+11.84% / 30d=+19.20%. ARB and LINK were filtered out by the "not at 24h high" rule that same run, exactly as designed. ARB later passed at $0.1308 once the rule cleared (7d +4.31% / 30d +46.64%). 5 open positions now: ETH×2, BTC, ATOM, ARB.
Bot was off for ~28 hours. Lab found alpha. Halt lifted automatically.
No manual intervention required.
The audit killed the next idea.
Operator hypothesis (2026-04-27): "We're sitting on +1% to +1.6% unrealized winners with a +15% TP that may take days to hit. Could a trailing-stop exit (arm at +5%, exit on −2% from high-water mark) capture more of the move and rinse the loop faster?"
Reasonable hypothesis. Sounds tradeable. We did NOT ship it directly. Instead we
added it to the strategy lab as dual_momentum_trail and replayed against the same 60-day
candle set with the same fee model:
| Strategy | Trades | Hit % | Return | vs B&H | Verdict |
|---|---|---|---|---|---|
| dual_momentum (live) | 12 | 91.7% | +15.01% | +1.87% | EDGE — kept |
| dual_momentum_trail (proposed) | 28 | 78.6% | +10.76% | −2.38% | FAILED — rejected |
The trailing exit closed too eagerly on minor pullbacks. 28 trades vs 12 means more fee burn, 78.6% hit rate vs 91.7% means more losers, and the +15% wins that drive dual_momentum's edge got capped at ~+5% to +8% before they could fully develop.
dual_momentum. We DID wire the trailing-stop logic into manage_exits()
inside agent_coinbase.py so the rails exist for any future variant that does pass
the threshold — but the rails stay inert until a strategy with trail_pct in its
params actually gets promoted by the lab.
What this proves
"Sounds tradeable" ≠ "is tradeable."
The trailing-stop proposal was logical. The math said no. Always backtest before promoting.
Build rails when you write rules.
Trailing-exit live support exists now — when a variant ever clears the bar, no re-engineering needed.
The audit IS the product.
Every promoted strategy AND every rejected variant lives at /data/strategy_lab.json. Pro subscribers pay for transparency, not signals.
"Earn or die" cuts both ways.
Earlier we killed a strategy that didn't earn. Now we're shipping one that does — same standard, opposite direction.
What you should take from this
Most paid trading services advertise gross returns. Almost none disclose the fee math, slippage, or kill-switch logic. We just halted our own bot in public, then iterated it back to alpha, then rejected an upgrade that didn't pass the audit — all in front of you. That's how you build trust.
If a service won't show you their full audit ledger including the trades that got halted and the ideas that got killed, you have your answer.
Footnotes
Backtest data: /data/coinbase_backtest.json ·
strategy lab results: /data/strategy_lab.json ·
promoted strategy: .live_strategy.json (dual_momentum, +1.87% alpha) ·
live P/L: /data/coinbase_pnl.json ·
all open and historical positions: /trust/ ·
halt file REMOVED 2026-04-27 04:02 UTC by lab auto-promote.
This is not investment advice. We are a software publisher, not a registered investment advisor. The bot trades a small principal sum we control. We disclose all trades, all halts, and all rejected iterations.