Skip to main content

Eleven days I didn't touch it

Published: July 4, 20265 min read
#algo-trading#crypto#build-in-public#paper-trading#automation
Dashboard card on Deep Space navy background. Kicker: UNATTENDED, 22 JUN to 3 JUL, 11 DAYS. Large gold number: plus $132.00. Below: 5 losses, 1 winner (BTC plus $49.72), loss-streak pause fired at 5 and 7, no emergency halts. Sparkline: five red dots stepping down, one green dot jumping up. Title: Eleven days I didn't touch it.

Between 22 June and 3 July I let Trader-7 run without opening the logs once. Eleven days of hands-off paper trading, three coins, an LLM decision engine, and no supervision. Came back to a stack of things I hadn't noticed.

The paper account was up $132 for the period. That's the good news.

What went right

Loss-streak protection did its job. Around 29 June the system took its fifth consecutive stop-out on BTC and ETH shorts, mostly minus $30 to minus $40 each. Sprint 25's pause logic kicked in: four hours at five losses, then four more at six, eight hours at seven. The system correctly stopped trading, cooled off, tried again with fresh cycles. No emergency halts. No crashes.

The one big winner covered most of the damage. Trade #292 was a BTC long opened 1 July at $60,398. It ran up two days, hit max hold time on 3 July, and closed at $62,162 for plus $49.72. Trailing stop had ratcheted from $60,405 to $61,438 over 48 hours. Textbook exit.

Two positions still open from the 3 July run into today: an XRP long with a trailing stop that's crept up to $1.13 as XRP holds around $1.14, and an ETH long from yesterday morning up a few dollars.

What went wrong

Three things had drifted while I wasn't looking.

The signal generator started truncating again. Three events in five days, all hitting max_tokens=2500 on the DeepSeek output. Sprint 146's salvage logic caught two of them, recovering partial signals from the truncated JSON. One cycle came back empty. That's a cycle where the strategist had run, market data was fresh, and I could have taken a trade. Cost of a truncation event is unknowable but non-zero.

The log had been spammed for weeks. The fee-drag warning fired 160 times across five days at exactly the same values ($22.58 fees vs $1.73 profit, cumulative for July so far). The metric was factually correct but re-emitted every cycle. Same for data staleness: 102 warnings for the market data lagging by 15 to 20 minutes when the threshold was set at 15 minutes. Noise that drowns real signal.

And a metric had been quietly wrong for months. The per-coin performance breakdown was computed over a rolling 100-trade window, labelled as if it were all-time. I only found this because I dug into the database to check whether we'd lost trades during the eleven-day gap. Data was fine. The reporting layer had been fooling me all summer.

What I fixed today

Six commits, three real bugs. Signal-generator max_tokens bumped from 2500 to 4000 to give DeepSeek headroom. Fee-drag throttled to at most once per 24 hours or when the ratio moves more than 50 percentage points. Staleness threshold moved from 900 to 1500 seconds, matching actual cadence. The per-coin metric now labels its windows explicitly: All-Time, Since Sprint 135, and Per-Coin under each.

I also audited the SOL exclusion with the corrected numbers. Sprint 137 hard-excluded SOL in May based on a bad recent window (0% win rate, minus $126 across seven trades). The corrected all-time picture is 36 trades at plus $23, 30.6% win rate. Slight positive, but per-trade Sharpe 0.013 is noise. Remove any of the top three winners and it goes negative. The exclusion was right and stays.

The lesson

Hands-off automation works. Trader-7 traded correctly, protected capital, didn't blow up. The rules held. The gates fired when they should. The winner it caught was clean.

But hands-off isn't unsupervised. The reporting layer had cruft. The log had noise. A metric was wrong. If I'd left it another month, those would have compounded. The metric bug in particular could have talked me into a bad decision if I'd been reading the aggregate line to reconsider SOL.

Weekly audit is probably the discipline. Not daily. Not never. Once a week, open the log, run the SQL, compare the aggregate to the source. Ten minutes.

Where things stand

198 closed trades all-time. Plus $1,045 realised on a $3,000 paper account. 36.4% win rate. Annualised return of 102%. Sharpe on the recent hundred trades is 0.76. That's the honest number now that I'm not reading a mislabelled window.

Since Sprint 135 baseline: 42 trades, 35.7% win rate, plus $300, Sharpe 1.66. Small sample, but the recovery from the Sprint 120 regression is holding.

Per-coin all-time: BTC 65 trades at 40% and plus $245. ETH 52 trades at 32% and plus $208. XRP 45 trades at 40% and plus $526, still the star. SOL excluded, plus $23 lifetime but statistical noise.

The regime flipped WEAK_BEAR to WEAK_BULL this morning. Two positions open, both green. The system read the flip and rotated stance from defensive to moderate.

Eleven days unattended. Five losses, one winner. A stack of cleanup. Still ahead.

Get the next one in your inbox

I build with AI in the open and write up what held and what didn't. Real numbers, the failures before the wins.

Share this post