Weather Bot — Episode 7: The $0.45 Exit Strategy — Why I Stopped Scalping on Polymarket

My bot was buying YES shares at $0.15 and trying to sell at $0.172. A clean 15% scalp. The order sat there for six hours. Nobody bought it.

I pulled up the actual order book for that Ankara position. The gamma API said the market price was $0.38. Sounded like there'd be buyers everywhere. But the real order book looked like this:

Best Ask: $0.990  (unified orderbook artifact)
Best Bid: $0.010  (the only real buyer)

One buyer. At a penny. My $0.172 sell order was sitting in a desert. The "market price" the API showed was meaningless — it reflected the unified orderbook math, not actual liquidity. Nobody wanted to buy at $0.172 when they could place their own order at $0.15.

That's when I realized the entire exit strategy was broken.

What This Post Covers

The switch from trying to scalp small profits to holding for resolution or selling at $0.45 — a change that sounds minor but completely redefined the bot's economics. The breakeven math that made it obvious, and the first resolution win that proved it worked with real money.

Why Scalping Doesn't Work Here

In liquid markets like stocks, a 15% scalp is straightforward. Someone's always on the other side. But Polymarket weather markets are thin. Really thin. Below $0.30, there are almost no natural buyers. The only liquidity appears when the price moves into the $0.30-$0.45 range — at that point, people start seeing value in buying.

I spent three days watching order books across different cities and times. The pattern was consistent: below $0.30, you're selling to nobody. My 1.15x sell orders at $0.172 were never going to fill because there's no one between $0.15 and $0.30 who wants to buy.

The Breakeven Math

I went back to study the top traders again — gopfan2, meropi, 1pixel. They all did the same thing: either sell at $0.45 if a buyer shows up, or hold to resolution. No scalping.

When I put the three strategies side by side, the math was brutal:


StrategyWinLossBreakeven Win Rate
1.15x scalp+$0.02-$0.1587%
$0.45 exit+$0.30-$0.1533%
Resolution hold+$0.85-$0.1515%

I'd been trying to scalp $0.02 per trade and needing to be right 87% of the time to break even. The profitable traders were aiming for $0.30-$0.85 per win and only needed to be right 15-33% of the time. One resolution win at $0.85 covers five full losses at $0.15 each.

I'd been playing the hardest possible game when an easier one was sitting right there.

The Code Change

Surprisingly simple:

# Before (v2.2)
CONFIG = {
    "yes_exit_multiplier": 1.15,
}

# After (v2.3)
CONFIG = {
    "yes_exit_price": 0.45,
}

The sell logic now checks if the best bid is at or above $0.45. If yes and there's a real buyer at that price, sell. If not, hold to resolution. No more hoping someone will buy my shares at $0.172.

if best_bid >= 0.45:
    # real buyer exists at $0.45+ — sell
    place_sell(client, pos)
elif near_peak and best_bid >= buy_price:
    # peak coming, at least break even
    place_sell(client, pos)
else:
    # no buyers — hold for resolution
    pass

In plain terms: if someone's willing to pay $0.45 or more, take the profit. If peak temperature time is approaching and the price is at least what I paid, get out at breakeven. Otherwise, sit tight and wait for the market to resolve. Don't sell into an empty order book.

The First Real Win: Ankara +$5.89

Ankara, 14°C bucket. Bought 6.89 shares at $0.145. The price climbed over the next 24 hours, but the best bid never reached $0.45 — it sat around $0.01 the whole time, despite the gamma API showing a "price" of $0.535.

Under the old 1.15x strategy, my bot would've tried to sell at $0.167, failed repeatedly for hours, and eventually sat through resolution anyway — but with all the stress of watching an unfillable order.

Under the new strategy: the bot saw no real buyer at $0.45, so it held. Resolution came. 14°C was correct.

6.89 shares × $1.00 = $6.89 payout. Minus the $1.00 cost. Profit: +$5.89.

One trade. More than all my previous small wins combined.

The Day Everything Went Wrong (And It Still Worked)

March 16. Eight daily markets. Seoul, Tokyo, Shanghai, Buenos Aires, Chicago — all wrong. Zero for eight on resolution. That's -$8 in losses.

But Ankara's single resolution win was +$5.89. And four earlier GTC sells at breakeven or small profit added +$1.35.

Net for the day: +$3.24.

A day where I got the weather wrong in eight cities and still made money. That's the $0.45/resolution strategy working exactly as designed. The wins are so much bigger than the losses that you don't need to be right most of the time. You just need the occasional resolution win to carry everything.

What Actually Happens at Resolution

I should mention: at this point, none of my $0.45 exit orders had actually filled. Every single profitable trade was a resolution hold — the bot held the position until the market closed, the temperature was verified, and the shares either paid $1.00 or went to zero.

The $0.45 exit is more of a safety valve. If a buyer shows up willing to pay $0.45 before resolution, great — lock in the $0.30 profit and move on. But in the thin weather markets, that rarely happens. The real money comes from resolution wins.

And the math works because the losses are capped at $0.15 per trade while the wins pay $0.85. The strategy doesn't need many wins. It needs the wins to be big when they come.

Key Takeaways

  • Polymarket weather order books are thin below $0.30. Scalping at 1.15x requires a buyer who doesn't exist.
  • Breakeven math: 1.15x scalp needs 87% win rate. $0.45 exit needs 33%. Resolution needs 15%. The easier game was right there.
  • First resolution win: Ankara +$5.89 on a single trade. Covered all previous losses.
  • March 16: 0 for 8 on forecasts, still ended +$3.24 for the day. The win/loss ratio does the heavy lifting, not the win rate.

What's Next

The exit strategy was fixed. The bot was making money on resolution holds. But running live also meant running into problems I'd never seen in DRY RUN — the kind that only show up when real money is moving through real APIs. Episode 8 is about the four technical bugs that nearly broke the bot, and how each one taught me something the documentation never mentioned.

← Previous: Episode 6: DRY RUN Results       Next: Episode 8: FOK Ghost Orders, Orderbook Lies, and the UTC Bug →


More updates on the way. If you're working on something similar or found a smarter way to do it, drop it in the comments — the more we share, the faster we all move.

Disclaimer: This blog documents my personal learning journey. Nothing here is financial advice.

Comments