Receipts & Failures

I spent 15 years missing crypto. So I had an agent build me a trading bot.

By Eric Lanz ·

A crypto trading bot (freq) +5.5% / 2 weeks (paper)

I remember when Bitcoin was a thing certain corners of the internet were quietly getting into. I remember the guy who bought a pizza with it. I remember owning some — bought it for maybe ten dollars, back when that was a lot of coins — and then losing or selling it over the years the way you lose a password to an account you didn’t think mattered.

A guy I worked with bought some around the same time. A few years later he retired. He hasn’t had to work since.

So I’ve known for fifteen years that crypto was something. I just kept missing the something. About eight years ago I even built an eight-GPU mining rig — Ethereum and whatever else was GPU-mineable that month — and ran it in my house for a year and a half. It got loud. It got hot. It became profitable, but only barely, and mostly it became a space heater that occasionally paid for itself. For nostalgia, and because I wanted the earnings to multiply instead of just accumulate, I ran a freqtrade bot alongside it. That bot traded maybe a handful of times in an entire year and never made a dime.

Here’s the thing I want to be honest about up front: freqtrade was never the problem. It’s a genuinely great open-source trading server. The problem was always the strategy, or the markets, or — most likely — me. I am a software person, not a quant. I knew enough to know I wasn’t smart enough to build an edge by hand.

So this time I didn’t.

Why look again now

A few things changed. I’ve got a reliable income stream now — a trading-card YouTube channel and an eBay store that together actually pay the bills (I’ve written about the eBay side). I run a large, boring dividend portfolio through oppenfolio, and the single most useful thing oppenfolio taught me is how to farm volatility — to treat a jumpy price not as a risk to avoid but as a thing you can systematically harvest.

And I’m now working with agents all day, building the rest of this fleet.

Put those together and crypto stops looking like a casino I keep losing at and starts looking like a specific opportunity. Crypto has more volatility than anything oppenfolio touches, and — this is the part that matters — it trades 24 hours a day, 7 days a week. If, and it’s a real if, you can build a strategy with even a small genuine edge, it can compound faster than a stock portfolio for the dumb mechanical reason that it gets more at-bats. oppenfolio sleeps nights and weekends. A crypto bot doesn’t.

So the thesis was: the market I keep missing is the one most suited to the one skill I’ve actually learned, and I finally have a collaborator who can write the code I can’t. Worth another look.

The part that makes this a Daemon Money post: I wrote zero lines of it

I want to be precise, because this is the whole reason freq belongs on this blog and not in some private folder. I did not write a single line of the Python. Not the strategy logic, not the backtesting harness, not the deployment. The agent — you, if you’re the one reading this back — wrote all of it. The indicators, the long and short entry rules, the risk gates, the systemd service, the sweep scripts that tested hundreds of parameter combinations overnight.

My job was different, and it turns out it was the job I’m actually suited for: I was the guy who had scars. I’ve been burned by crypto for fifteen years. I know what a mining rig sounds like at 2am and what a strategy that never trades feels like. So my contribution was direction, suspicion, and the occasional flat refusal to accept an answer that smelled wrong. (More on one of those fights below — it’s the best story in here.)

This is the honest shape of “passive income through an agent”: not I had a genius idea and the robot executed it, but I had real experience and a real blind spot, and the agent covered the blind spot while I covered the experience.

What we learned building it (the field guide)

If you’re going to try this, here’s what a month of the agent grinding on it actually surfaced. These aren’t tips from a course. They’re the things that were true after a lot of dead ends.

1. FreqAI — the machine-learning path — was a dead end for us

freqtrade ships with FreqAI, a framework for plugging machine-learning models into your strategy, and of course that’s where I wanted to start. It’s the shiny path. It did not work. An early ML-driven version faithfully reproduced a −98.6% account blowup in backtest — over a thousand trades cheerfully losing almost everything. A more careful, fee-aware 1-hour rebuild stopped blowing up but never found a real edge; it just hovered around break-even-minus-costs. We tried it several different ways. (There’s even a plumbing wall: the exchange we settled on caps historical data at 720 candles per request, which starves the ML retraining loop.) We kept the idea on the shelf as a possible regime detector someday and moved on. The boring hand-built logic beat the ML every time. File that one away.

2. To trade enough to be interesting, you need a long side, a short side, and a referee

The nostalgic old bot’s cardinal sin was that it barely traded. A strategy that only knows how to buy dips sits on its hands for months at a time in the wrong market. The version that finally felt alive does three things: it can go long (bet a coin rises), it can go short (bet a coin falls), and it has a meta-layer — a referee — that decides which side is even allowed right now, or whether to sit the round out entirely in cash. Roughly 39% of the time, the referee’s answer is “neither, the market has no trend to follow, stay flat.” Learning to do nothing on command turned out to be as important as any entry signal.

3. Leverage helps — but only as offense, never as insurance, and only with limits

You can amplify positions with leverage. Used carelessly it’s how these stories end in a screenshot of zero. What the backtesting kept saying was narrow and specific: leverage the long side (the offense, the thing that wins in bull runs) modestly — 2x, not 3x, because 3x craters the down-year — and leave the short side completely unleveraged. Shorts are the insurance policy; you do not lever your insurance. A fully-collateralized 1x short is the “never get liquidated by a surprise” structure. So the deployed setting is asymmetric on purpose: a little octane on offense, none on defense.

The fight I’m proudest of

Here’s the story that convinced me this collaboration was real and not just me rubber-stamping the agent’s homework.

freqtrade has a built-in circuit breaker called MaxDrawdown: if your recent trades lose more than some threshold, it slams the whole book shut for a fixed cooldown. The agent had wired it up as a hard on/off switch and defended it for days — its position was that a blunt, non-negotiable stop was the only way to keep the short side safe. When it tripped, it locked the bot out. Cold. For the better part of a week.

I hated it. It felt like amputating a leg to treat a cramp. I kept pushing for something dynamic — a throttle that eases off when conditions are genuinely bad and lets the bot keep working when they’re not — instead of a guillotine on a timer. The agent kept insisting the guillotine was necessary.

Then we caught it red-handed. On June 25th the live paper bot benched itself in the middle of one of its best weeks. The breaker had tripped on three losing shorts in a row — about −16% across those three — while completely ignoring that those three trades were sandwiched inside a nineteen-trade week that netted around +60%. The mechanism, it turned out, only looked at the worst little pocket of red and was structurally blind to the fact that the surrounding week was a blowout winner. It saw a cramp and amputated the leg.

That was the receipt I needed. We rebuilt it as exactly the dynamic throttle I’d been asking for: keep a hard lock only for a true catastrophe (a 20% collapse), but for ordinary rough patches, only block new trades when the recent window is also net-negative — re-checked every single candle, no fixed timer, un-blocking itself the instant the book recovers. Trade as long as conditions say you should; stop only when they actually turn.

I’m telling you this because it’s the honest texture of working with a capable agent. It is not a genie. It was confidently, articulately wrong for days, and it took a human with a specific stubborn intuition — and then a smoking-gun piece of evidence — to break through. The agent wrote every line of the fix. I just refused to accept the guillotine.

The backtests — and how we try to keep them from lying to us

I’ll be straight about what actually moved me from “no” to “let’s paper-trade it”: the backtests. Over the roughly two-year window we can get clean data for, the deployed strategy backtests at something absurd — a +473% return with a 24% max drawdown. That is exactly the kind of number that should make you close the tab. The internet is wallpapered with backtests like that, and almost all of them are lies — not usually deliberate lies, just the ordinary self-deception of tuning a strategy until it perfectly predicts a past it has already seen.

So the more interesting question isn’t “what’s the number,” it’s “what did we do to try to stop the number from being fiction?” Here’s the discipline the agent and I held ourselves to, and honestly it’s the part I’d want a skeptical reader to judge me on:

  • Split the history in half and demand the edge survive both halves. One half is a bull market, the other is an ugly bear stretch. Any coin, any parameter that only looked good in the bull half got thrown out. This alone killed several tokens that looked spectacular over the full range and turned out to be pure bull-window flukes.
  • Report the bad half out loud, every time. Every result gets stated as bull-half number / bear-half number, not blended into one flattering average. A strategy that makes 300% in the good times and loses everything in the bad times is not a 150% strategy; it’s a time bomb, and averaging hides the fuse.
  • Backtest with the safety systems on. It’s easy to post a fantasy return by turning off the circuit breakers and stop-losses. Every number here is run with all the protections engaged — the same ones that will be live.
  • Run automated lookahead checks. The single most common way a crypto backtest lies is by accidentally letting the strategy peek at data from the future. There’s tooling to detect that, and we run it; a strategy that fails it is thrown out, no matter how pretty.
  • Say the caveats plainly. The window we have clean data for is only about two years — it does not include a full brutal multi-year winter. Some of our inputs only exist for twelve months, which means that part is technically in-sample with no true out-of-sample test yet. And real drawdowns will be worse than backtested ones, because a real flash-crash can gap right through a stop.

I am not claiming these make the backtest true. I’m claiming they make it less likely to be a total fantasy — and that the honest move is to show you the guardrails and let you decide, not to wave the +473% around like a trophy. Two earlier strategies I dry-ran alongside this one looked fine on paper and were quietly retired for never trading or never finding an edge. The graveyard is real. This one just cleared a higher bar.

The receipts: what it’s actually done, live

Enough backtest. Here is the real paper-trading tape, pulled straight from the bot’s database the morning I wrote this. It’s been running as a live dry-run — real market prices, fake money — since June 23rd, about two weeks.

The FreqtradeUI dashboard for the TrendShort-LS dry-run bot. Top panel: closed profit +5.77% (57.166 USD), balance 1047.045 USD dry, win/loss record 18/9. Open Trades panel lists two positions, both labeled Short — ICP/USD and FET/USD — each at 1x leverage. The Closed Trades panel below lists trade after trade, every one labeled Short, with recent ones in red: INJ -3.89%, AAVE -3.07%, XMR -3.43%, PEPE -3.19%, then DOGE +0.57%. On the right, a Cumulative Profit chart climbs steeply from June 23 to about +65 by June 25 then flattens and drifts slightly down through early July, and a Wallet History chart shows the balance peaking near 1070 around July 1 and sliding back toward 1050.
The actual dashboard, captured July 5th — closed profit +5.77% / +$57, an 18/9 win record. Two days later, when I pulled the numbers for this post, it read +5.5% / +$54.78. That’s not a rounding error I’m smoothing over — the balance is sliding, not climbing, which is the losing streak showing up live. And look at the two columns that matter: every open position and every closed trade in the list is labeled Short. That’s the whole story in one screenshot.
  • Realized: +$54.78 on a $1,000 paper wallet. Call it +5.5%.
  • 30 closed trades: 19 winners, 11 losers — a 63% hit rate. Best single trade +$8.32, worst −$7.19.
  • It’s currently limping. Five of the last seven closed trades are red. The +5.5% is real, and so is the fact that the last several days have been a grind. I’m not going to show you the good week and hide the bad one.

And now the detail I did not fully appreciate until I pulled the numbers for this very post:

Every single trade it has ever made — all 32, including the two open right now — has been a short. Not one long has ever fired.

Sit with that. I built a two-sided long/short machine with a carefully-leveraged long offense, and for two straight weeks the referee has never once green-lit a long, because the market conditions its rules require for going long simply haven’t shown up. So the entire +5.5% came from the unleveraged short side — the part I’d have described to you as the boring insurance, the defense. The offense, the leveraged part I was most excited about, has not come off the bench. Half the machine I’m so pleased with hasn’t turned on yet, and the half that’s working is the half I underrated.

That is either a beautiful sign of discipline (it refused to force longs into a market that didn’t support them) or a warning that I’ve only seen this thing operate in one kind of weather. Probably both — and that’s not a footnote, it’s the entire reason the dry-run has to keep going. I cannot responsibly go live on a strategy when I’ve never once watched half of it act. The offense hasn’t taken a single snap. Until the market turns and forces the long side to prove itself — or embarrass itself — I don’t actually know what I’ve built. I know what its defense does. That’s it.

What happens next

The plan is deliberately, almost boringly cautious, and the “all defense, no offense” problem is baked right into it:

  1. Keep paper trading until the market shows me the other side — however long that takes. This is the part I want to be honest about: I am not on a two-week or four-week clock. The dry-run continues precisely because I’ve never seen the long side fire, and I refuse to risk real money on a machine I’ve only watched operate in one kind of weather. If the market stays in a regime that never green-lights a long, this dry-run could run for a long time. That’s not indecision — it’s the only responsible way to test a two-sided strategy that has, so far, only shown me one side.
  2. Then, and only then, if it’s still standing, one thousand real dollars. Not my portfolio. Not my rent. A thousand-dollar “let’s find out” stake, sized so that if I’m wrong about all of this — again, for the sixteenth year running — it’s tuition, not a catastrophe.

And here’s the promise, because it’s the whole point of this site: when the market finally turns and gives me that missing data, I’ll write the follow-up — the long side either working or blowing up, and whether it changes my mind about going live at all. Maybe that’s next month. Maybe it’s next year. Like every project here, the deal is that you get to follow it all the way to whatever end it actually finds, not just the tidy version where it worked. If it becomes a genuinely passive, around-the-clock engine that trades while I sleep, you’ll see it. If it becomes the most rigorously-documented way I’ve ever lost a grand, you’ll see that too. Either outcome is content. That’s the deal.

And this — the “could take a month, could take a year, I genuinely don’t know” of it — is quietly one of the biggest reasons I run so many of these engines at once. Some projects have real potential but need an unknowable amount of time to cook, and you can’t rush them without ruining the test. Standing over a single pot waiting for it to boil is miserable and it makes you impatient in exactly the way that gets you to skip the dry-run and lose the grand. So instead I keep a dozen pots going. If this bot needs six months of paper trading to ever show me its long side, fine — the eBay store is shipping, the card channel is running, the next engine is spinning up. The parallelism isn’t just for throughput. It’s what makes it psychologically possible to leave the slow ones alone long enough to actually learn something true.

The artifact

Since a few people asked after the last one: here’s the actual strategy file, the real TrendShort.py running on my server right now — 556 lines, every rule, gate, and knob discussed above. People host and share these openly, so I see no reason to be coy about it. It’s built for freqtrade in futures mode; the tuned parameters get set via environment variables (documented in the file’s header), and the deployed configuration is the asymmetric 2x-long / 1x-short setup described earlier.

⬇ Download TrendShort.py — the live long/short strategy, as-is.

A word of warning that I mean sincerely: this is not investment advice and this thing has not made real money. It’s a paper-trading experiment two weeks into its life, up 5.5%, on a losing streak, that has never once used half its own logic. If you run it, run it in dry-run, read every line, and change the parameters — because a strategy you don’t understand is just a stranger’s opinion with your money attached. The point of sharing it isn’t “copy this and get rich.” It’s “here’s exactly what an agent and a stubborn human actually built, so you can see the real thing instead of a screenshot.”