resolution-scalper — Near-certain outcome buyer

Buys $0.95-$0.99 outcomes across Polymarket and holds to resolution for the $0.01-$0.05 spread. Skips esports / close sports via keyword filter, dedupes correlated markets, 20-position cap.

Version v1.0.0 · One-time payment · Source code download
Strategy typeResolution sniping
AssetMulti-market
TimeframeEvent-driven
Market typeAll Polymarket markets
Minimum capital$30
Dependencies@polymarket/clob-client, ethers

What it does

resolution-scalper scans every active Polymarket market every 60 seconds and buys near-certain outcomes priced between $0.95 and $0.99. It holds each position to resolution and collects $1.00 per share. Profit margin is 1-5 cents per share before fees.

The edge

When a Polymarket outcome trades at $0.97, the market is saying there's a 97% chance the answer is "yes". On binary yes/no markets with clear resolution criteria (court rulings, calendar dates, scheduled announcements), the realized accuracy at $0.95-$0.99 is high — typically above the implied probability because the spread reflects time-value and liquidity premium, not real probabilistic uncertainty.

The killer is fees and exceptions. Fee math at $0.97 is tiny (~0.07% of bet), but a single $0.99-to-$0 loss wipes out 33 winning $0.97-to-$1 trades. The bot's filters are designed to eliminate the categories where surprise losses are most common: esports (high upset rate), close sports matches, and markets with thin liquidity that can be manipulated.

How it works

Scan cycle (every 60 seconds, SCAN_INTERVAL_MS):

  1. Pull all active markets from Polymarket Gamma API
  2. Filter by:
    • Mid-price between MIN_BUY_PRICE ($0.95) and MAX_BUY_PRICE ($0.99)
    • Best ask ≤ MAX_ASK_PRICE ($0.99) AND size ≥ MIN_ASK_SIZE (5 shares)
    • 24h volume ≥ MIN_LIQUIDITY ($1000)
    • Ask within 6¢ of mid-price (MAX_SPREAD_VS_MID) — skip if ask too far above mid
    • Question doesn't match the esports keyword list: ['counter-strike', 'cs2', 'cs:', 'lol:', 'league of legends', 'dota', 'valorant', 'overwatch', 'bo3', 'bo5', 'esport']
  3. Dedupe correlated markets (multiple variants of the same underlying event)
  4. Size: BET_SIZE_PCT (5%) of balance, capped at MAX_BET ($50), and MAX_PER_MARKET_PCT (10%) of bank max
  5. Buy as FOK taker at the best ask
  6. Resolution poll every 5 minutes (RESOLUTION_POLL_MS)

Caps: MAX_OPEN_POSITIONS = 20, MIN_BALANCE = $5.

Sample output

[24/05/2026, 12:00:01] Scanning 847 active markets... [24/05/2026, 12:00:04] 14 candidates after filters (esports, spread, liquidity) [24/05/2026, 12:00:05] [LIVE] BUY 30sh @ $0.970 ($29.10 incl fee $0.0042) [24/05/2026, 12:00:05] Order 0xa9c3b21f... [24/05/2026, 12:00:06] [LIVE] BUY 25sh @ $0.985 ($24.63 incl fee $0.0019) [26/05/2026, 18:30:00] WIN "Will SCOTUS rule by July?" — Yes @ $0.97 | +$0.90 [26/05/2026, 20:00:00] WIN "BTC above $110k on May 26?" — Yes @ $0.985 | +$0.37

Design targets

Break-even at $0.97 entry: required WR ≈ 97.5% (fees are tiny). Design target ≥ 98% realized WR on the filtered universe. That sounds high, but the filters (esports skip, liquidity floor, spread cap) eliminate most of the categories where surprises happen.

Cycle economics: ~10-20 trades per day during normal activity. Expected per-trade PnL after fees ≈ +$0.01 to +$0.05 per share, scaled by position size. Returns are small per trade but very stable.

FAQ

How is this different from poly15m-sniper?

Sniper only touches BTC 15-minute binaries in the last 10 seconds before resolution. Each trade is held for seconds. resolution-scalper buys across the entire Polymarket catalog at $0.95-$0.99 and holds for hours to days until natural resolution. Different cycle times, different market universes.

Why filter esports?

Backtests showed esports markets have 5-10× higher upset rate than sports/political binaries at the same implied probability. A $0.97 esports favorite loses way more often than a $0.97 political favorite. Filtering esports preserves the strategy's edge.

Can I drop the esports filter?

Yes. Edit RISKY_KEYWORDS in source. You'll get more trades; expect lower WR.

What's included

  • others/resolution-scalper.js
  • polymarket-limits.js
  • README with risky-keyword tuning, correlation-dedupe explanation, and an alternative-asset filter example

Configuration

FlagDefaultDescription
--livePlace real orders. Default is dry-run.
--sim-balance 3030Starting balance in dry-run mode (USD).
--max-bet 5050Hard cap per single position in USD.
--min-price 0.950.95Minimum mid-price to consider.
--max-price 0.990.99Maximum buy price.
--max-ask 0.990.99Maximum ask price to accept.
--min-liq 10001000Minimum 24h volume filter (USD).

Related bots