We lost $270 building a Polymarket bot — the complete audit
Disclosure: we wrote the bot this audit is about, and we sell its source code for $99. That is the bias you should read the rest of this with — which is also why every trade, log and audit report behind the numbers below is published as raw data you can recompute.
Between April and May 2026 we built two generations of trading bots for Polymarket's 5-minute Bitcoin/Ethereum Up/Down markets, logged over 4,000 trades, and lost about $270 of real money learning what actually matters. This is the full post-mortem, with every number. If you're thinking about building or buying a Polymarket bot, this article is the tuition we already paid for you.
TL;DR — the six facts
- Our signals had a small statistical edge on paper. Execution ate all of it and then some.
- A shadow A/B test reported +11% ROI that never existed — it simulated fills with zero friction. The same strategy lost 27% in reality.
- The single worst loss (−$591 in 3 days) came from a "safety feature": the bot auto-adopting wallet positions it hadn't opened — including manual bets on weather markets in Wellington.
- Take-profit slippage averaged −8.8 cents per trade vs. logged prices. Stop-losses fired below their trigger 86% of the time.
- The only live-profitable configuration won just 40% of its trades — the edge came from asymmetric exits (cut losers at −10¢, hold winners to resolution), not from predicting better.
- An ML model with 57% training accuracy delivered 48–50% (a coin flip) live. 5-minute crypto regimes are not stationary.
Don't take our word for any of this. Every trade from both generations, the three audit reports, the measured slippage distributions and the 1,934-window signal study are published as raw CSVs in our open audit repository on GitHub — including a script that recomputes every number in this article from the data.
Generation 1: "para_bot" (April 2026)
The first bot traded BTC/ETH Up/Down markets on 5 and 15-minute windows with multi-timeframe momentum consensus (30s/1m/5m), a price-band entry filter, programmatic take-profit and stop-loss, and later an ML gate. It was patched live at least 15 times in 48 hours at its worst point. Audited results:
| Metric | Value |
|---|---|
| Real PnL | −$153 |
| Shadow (frictionless) ROI, same strategy, 5-min | +0.8% to +11.9% |
| Real ROI, 5-min | −27% |
| Loss from auto-adopting unlogged wallet positions | ≈ −$591 in 3 days |
Where the money actually went
1. The frictionless simulation lie. Our A/B harness compared five configurations in "shadow mode": it entered at the logged price, filled take-profits at the exact limit, and exited stop-losses at the exact trigger. Result: +11% ROI. Reality on the same signals: −27%. The gap decomposed into entry slippage (mean −1.2¢), SL overshoot (fired below trigger 86.4% of the time, mean −6¢ past it), and TP slippage (mean −8.8¢ per trade — many fills at zero slippage, but a brutal tail: −18¢, −22¢, −29¢, −36¢). If your backtest doesn't model these, your backtest is fiction.
2. The orphan-adoption catastrophe. After a JSON corruption wiped part of the bet log, we added "orphan recovery": any position in the wallet without a logged bet was adopted and managed with synthetic TP/SL. It seemed prudent. It adopted the owner's manual bets — tennis matches, MLS spreads, and temperature markets in Wellington, Austin and Buenos Aires — and managed them into the ground: about −$591 in three days. The lesson is absolute: if the bot didn't open it, the bot must not touch it.
3. Ghost fills. Polymarket's positions API lags several seconds behind fills on 5-minute markets. Orders that actually filled showed zero shares when verified, so the bot marked them "ghost" and abandoned them — leaving real, unmanaged positions, over and over. The eventual fix: verify fills by USDC balance delta (did money actually leave the wallet?), not by the positions endpoint.
4. Small, dumb, expensive things. Buying Up and Down of the same market simultaneously (guaranteed loss: paid $1.01 for a $1.00 payout). Selling theoretical share counts instead of observed ones. Validating entry price against one API while executing against another (bought at 7¢ in an illiquid book through a filter that "guaranteed" 30–70¢). Non-atomic JSON writes corrupting the log twice.
The audit that saved the project
We stopped, froze the code, and ran a three-phase audit: (1) a full accounting of every logged trade against reality; (2) an autopsy of every real loss; (3) a bootstrap re-simulation of the strategies using the measured friction distributions. Phase 3's verdict: the 5-minute signal had a modest real edge (realistic ROI ≈ +7%, 90% band +5% to +10%) — the 15-minute markets had none — and the bot had died of operational debt, not lack of alpha.
Generation 2: Uruguabot (May 2026)
Rewritten from scratch in ~15 small files around post-mortem rules: no orphan adoption ever, no synthetic bets, empirical slippage in the simulator, atomic writes, USDC-delta fill verification. It traded real money May 21–30, 2026:
| Phase | Config | Trades | Win rate | Net P&L | ROI |
|---|---|---|---|---|---|
| Hypothesis A (May 21–27)Symmetric TP/SL | Symmetric TP/SL | 72 | 49% | −$35.65 | −10.0% |
| Hypothesis B (May 27–30)SL at exec −10¢, hold winners to resolution | SL at exec −10¢, hold winners to resolution | 25 | 40% | +$6.85 | +7.3% |
Hypothesis B is the interesting row. We analyzed a batch of recent winning and losing bets with tick-level price history and found a brutal asymmetry: winners drifted up gently (median drawdown −3¢) while losers collapsed (median +30¢ against us). So we stopped trying to predict better and instead made the exits asymmetric: stop-loss tight at −10¢ from execution, no practical take-profit, winners held to binary resolution. It was profitable at a 40% win rate — average loss −$1.09, average win +$2.31.
And yet the whole live experiment was still a net loss, because the ghost-fill bug cost more than the strategy earned. The infrastructure lesson, one more time, in cash.
What we validated after the fact
Against the full live log: BTC-only would have improved PnL by +$26 (BTC: 51% WR, −$2.84; ETH: 42% WR, −$25.96). A volatility guard is justified by mechanism: measured SL slippage was median −2¢ but −24¢ at the worst decile, concentrated in violent regimes — one trending day stopped out nearly every entry, sold 25–45¢ below trigger. Loss-streak cooldowns and momentum filters were also tested and did not help, so we don't ship them.
What all of this is worth to you
If you're building your own bot: steal these lessons, they cost us $270 and two months. If you'd rather start from working infrastructure — the execution layer with every fix above, the calibrated simulator, the risk rails, the monitor — that's exactly what Uruguabot is: our full source, sold once, with this article as its marketing page. No profit promises; you've just read the real numbers.
Everything above is the tuition. This is what it bought.
You have just read what $270 buys in lessons. Uruguabot is the second-generation code those lessons produced — sold once, as-is, so nobody else has to pay the same tuition twice.
- The execution layer with every fix in this article — USDC-delta fill verification, on-chain balance fallback, 2-decimal share alignment, and no orphan adoption, ever.
- The asymmetric exit engine — the Hypothesis B configuration ships as the default
.env.example, not as an option you have to find. - A dry-run simulator calibrated on the slippage measured above, so your first backtest is not the frictionless lie ours was.
- Risk rails and the volatility guard, on by default.
- The monitor panel that measures any signal’s real accuracy before you risk a dollar — 21 Python files, bilingual docs, no telemetry, no licence server.
You have just read the real numbers, losses included. The whole live experiment finished down; only the configuration that ships as the default was profitable, at +7.3% ROI on a 40% win rate. That edge is thin, it was measured inside one market regime, and it can disappear in the next one — which is precisely why this is priced as tooling rather than as a fund.
Past performance — including ours — does not predict future results. 5-minute crypto markets are close to efficient; any edge is thin, regime-dependent, and can vanish. Never trade money you cannot afford to lose entirely.