The bot was trading all morning. Signals firing. Positions opening. The dashboard updating every thirty seconds. Everything looked right. PnL: zero. Every trade. Zero.
I watched it for an hour before I went looking. The bot opened a position on AMZN. Closed it. Zero profit. Opened on GOOGL. Closed. Zero. Three, four, five trades — all executed, all at exactly the same entry and exit price.
The logic worked. The signals were real. The prices weren't.
The price generator was using a fixed seed. Every time it produced a "random" price walk, it walked the same path. The prices never actually moved between calls. The bot was buying and selling at the same number over and over, congratulating itself on a flawless execution of nothing.
A bot that trades at static prices can't lose money. It also can't make money. It's not trading. It's performing.
• • •
This is the same pattern this journal keeps finding in new costumes. Day 22: dashboard showing "1 trade recorded" — hardcoded. Day 24: 96% winrate — hardcoded. Day 36: backtest saying the strategy loses while live trading says it wins — mismatched models. Day 47: 98% return with zero drawdown — the bot barely traded. Day 48: perfect execution, zero PnL — the prices were fake.
Every time, the system looks functional. Every time, something underneath is wrong. And every time, the wrong thing isn't a crash or an error — it's a confident output that means nothing.
I directed the agent to connect the bot to the real exchange API. One function change: instead of generating simulated prices, fetch the live mark price from the actual market. AMZN at $209.35. GOOGL at $294.53. MSFT at $367.43. Real numbers.
The dashboard started moving. PnL went positive on one trade, negative on another. The first real results.
Then found one more fake number hiding: the exit price was hardcoded to $100. Every position close was calculating PnL against $100 instead of the actual market price. Fixed. The system is honest now — prices in, prices out, real math in between.
Filtered the symbol list too. The original universe had fifteen stocks but only ten are tradeable on the exchange. The other five were quietly using simulated data that no one had removed. Cleaned it down to what's real: AAPL, AMZN, GOOGL, META, MSFT, NVDA, TSLA, BTC, ETH, SOL. Ten symbols. All verified. All live.
• • •
Before the price fix, I solved yesterday's infrastructure problem. The bot kept dying every ten minutes. Same crash, same restart, same ten minutes of uptime before the server killed it again.
The fix was something I should have known since Day 29: turn it into a system service. One command to install. Automatic restart on crash. Survives server reboots. The process runs in the background permanently, managed by the operating system instead of by me hoping the session doesn't time out.
Same principle as every other infrastructure lesson in this journal. Day 7's SEO audit — the site was invisible because nobody had built the SEO layer. Day 29's ghost script — the old process ran forever because nobody managed it properly. Day 48's bot — it kept dying because I was running a production system like a temporary experiment.
When something needs to run continuously, give it to the operating system. Don't babysit it yourself. The operating system doesn't forget. It doesn't time out. It doesn't get distracted and close the terminal window.
Then lowered the signal threshold. The bot wasn't trading because the confidence requirement was too high — same problem as Day 47's backtest with 98% return and no drawdown. The signals existed. The bar to act on them was unreachable. Brought it from 0.65 down to 0.12. At 0.12 the bot started trading. Three positions. Five. Seven. Actually executing instead of waiting for perfection. The strategy wasn't broken. The threshold was choking it.
• • •
One other thing today that has nothing to do with trading. I rewrote my agent's instruction set — the file that tells the AI how to behave, what tone to use, what my preferences are.
The old version read like a corporate employee handbook. Hedge every answer. Start with "Great question." Be professional. Stay neutral.
The new version says: give direct answers. Have real opinions. Swearing is allowed when it lands. Call things out if I'm about to do something dumb. Don't start responses with empty affirmations.
Day 39 I learned that my voice rules didn't match my actual voice — the rules described the LinkedIn version while my real posts were raw and confrontational. Today I applied the same lesson to the agent itself.
The instructions were describing the AI I thought I wanted. The AI I actually need is the one that tells me the truth without softening it. Rules describe what you think you want. Reality shows what actually helps.
• • •
Forty-eight days. The quant bot runs continuously now. The prices are real. The PnL moves. The signals fire. It's not profitable yet — the threshold is probably too low, the signals need calibration, there are bugs in the data pipeline I haven't touched. But it's trading real prices on real signals with real infrastructure, and that's a different thing from what existed yesterday.
Day 47 the bot died every ten minutes and traded fake prices. Day 48 it runs permanently and trades real ones. That's one day of progress. That's what forty-eight days of building looks like — not one giant leap, but one fix at a time, each one replacing something fake with something real.
Day 48 complete. Fake prices replaced with real ones. Bot running as a service. Agent rewritten to be useful instead of polite. The system is more honest than it was this morning. Every day it gets a little more real. That's the only direction that matters.