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.
| Strategy type | Resolution sniping |
|---|---|
| Asset | Multi-market |
| Timeframe | Event-driven |
| Market type | All 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):
- Pull all active markets from Polymarket Gamma API
- Filter by:
- Mid-price between
MIN_BUY_PRICE($0.95) andMAX_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']
- Mid-price between
- Dedupe correlated markets (multiple variants of the same underlying event)
- Size:
BET_SIZE_PCT(5%) of balance, capped atMAX_BET($50), andMAX_PER_MARKET_PCT(10%) of bank max - Buy as FOK taker at the best ask
- 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.jspolymarket-limits.js- README with risky-keyword tuning, correlation-dedupe explanation, and an alternative-asset filter example
Configuration
| Flag | Default | Description |
|---|---|---|
| --live | — | Place real orders. Default is dry-run. |
| --sim-balance 30 | 30 | Starting balance in dry-run mode (USD). |
| --max-bet 50 | 50 | Hard cap per single position in USD. |
| --min-price 0.95 | 0.95 | Minimum mid-price to consider. |
| --max-price 0.99 | 0.99 | Maximum buy price. |
| --max-ask 0.99 | 0.99 | Maximum ask price to accept. |
| --min-liq 1000 | 1000 | Minimum 24h volume filter (USD). |
Related bots
poly15m-sniper — Resolution sniper for 15-minute BTC markets
LIVEResolution sniper for 15-minute BTC binaries. Polls the book every 2s during the final 10s (T-15s to T-5s), fires FOK at up to $0.95 when one side trades mid ≥ $0.90. Goes 100% of cash per snipe.
contrarian — GTC maker bids on underdog outcomes
GTC maker bids on 20-50¢ underdog outcomes across all Polymarket markets. Zero taker fees, 30-min scan loop, multi-layer risk stack. Inspired by @Car's +$22K strategy.