poly15m-sniper — Resolution sniper for 15-minute BTC markets

Resolution 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.

Version v1.0.0 · One-time payment · Source code download
Strategy typeResolution sniping
AssetBTC
Timeframe15m
Market typeCrypto binary
Minimum capital$30
Dependencies@polymarket/clob-client, ethers

What it does

poly15m-sniper waits until the final 10 seconds of a 15-minute Polymarket BTC binary, checks the orderbook, and if one side has a mid-price at or above $0.90, fires a FOK taker order for that side at up to $0.95. It holds the position 5 seconds to resolution and collects $1.00 per share.

The strategy is a direct port of ascetic0x's documented approach: ignore everything that happens in the first 14 minutes, take a last-second snapshot, ride the consensus to settlement.

The edge

By T-15 seconds, the BTC price for the candle is ~85% determined. Market-makers know this and price the favorite at $0.92-$0.95. Reverse moves in the final 15 seconds are rare enough that buying at $0.93 and collecting $1.00 gives ~7¢ of edge per share after fees. The edge is small per trade, but the cycle time is short and the win rate is high.

The risk is the rare moonshot reversal. To bound this, the bot caps each snipe at the smaller of (current cash) or --max-bet (default $10), and the consecutive-loss limit (3) plus 30-minute cooldown prevents bleeding through a streak of these reversals.

How it works

Cycle, per 15-minute candle:

  1. Wait through the first 14 minutes 45 seconds. No polling, no signal computation, nothing.
  2. Snipe window opens at T-15s (SNIPE_START = 885s). Poll the orderbook every 2 seconds via Polymarket REST.
  3. Pick a side: if either Up or Down has mid-priceMIN_MID_PRICE ($0.90), that side is the favorite.
  4. Compute size: BET_PCT = 1.00 of cash, but capped by --max-bet and by what cash supports at $0.95 with a $1 buffer. Targets up to 10 shares.
  5. Fire FOK at MAX_BUY_PRICE ($0.95). Either filled in this exact second or skipped.
  6. Snipe window closes at T-5s (SNIPE_END = 895s). If no side has crossed the threshold by then, this candle is skipped.
  7. Hold to resolution, verified via Gamma API + Chainlink RTDS.

Risk gates:

  • MAX_CONSEC_LOSSES = 3: trigger 30-min cooldown after 3 losses in a row
  • MIN_BALANCE = $3: stop snipes if cash falls below
  • Circuit breaker: if the loop catches 5 errors in 60 seconds, restart cleanly

Sample output

[25/05/2026, 15:57:00] BUY (FOK) 5sh @ $0.95 ($4.753 incl fee) [25/05/2026, 15:57:00] Filled: 0x8a3f2d09a13b48e1 (FOK) tx=0xabc12345 [25/05/2026, 16:00:01] Resolved WIN | +$5.00 - $4.75 = +$0.247 | Bal: $26.35 [25/05/2026, 16:12:00] BUY (FOK) 5sh @ $0.94 ($4.704 incl fee) [25/05/2026, 16:12:00] Filled: 0x9b21c8a17f9c20a3 (FOK) [25/05/2026, 16:15:01] Resolved WIN | +$5.00 - $4.70 = +$0.296 | Bal: $26.65

Design targets

Break-even math at $0.95 entry (5-15 min crypto fee curve, peaks at p=0.50 not $0.95, so fee is small):

fee = shares × 0.25 × 0.95 × (0.95 × 0.05)^2 ≈ 0.05% of bet

At $0.95 entry, you need 95.05% of trades to win to break even. Sniper's design target is 96-98% realized WR on the trades it takes (most candles are skipped because no side crosses $0.90 in time). With only 1-3% of candles producing a snipe, the bot trades roughly 30-60 times per day on continuous BTC coverage.

Capital efficiency: 100% of cash per snipe means winnings compound fast, but losses hit hard. Pair with redeem-convert-auto so winnings settle into pUSD between snipes.

FAQ

How is this different from resolution-scalper?

resolution-scalper buys $0.95-$0.99 outcomes across the whole Polymarket catalog and holds them potentially for days until resolution. poly15m-sniper only touches BTC 15-minute binaries and only in the last 10 seconds, with hold time measured in seconds not days.

Why 100% of cash?

Edge per trade is small (a few cents per share), so sizing matters. The hard cap (--max-bet) sits on top to prevent any single snipe from being catastrophic. The 3-loss cooldown bounds the worst-case streak.

What's included

  • poly15m/poly15m-sniper.js
  • poly15m/run.sh (auto-restart wrapper)
  • polymarket-limits.js (fee + tick constants)
  • README with cooldown tuning + ETH/SOL/XRP variant notes

Configuration

FlagDefaultDescription
--asset BTCBTCAsset to trade. BTC, ETH, SOL, XRP supported.
--livePlace real orders. Default is dry-run.
--sim-balance 3030Starting balance in dry-run mode (USD).
--max-bet 1010Hard cap per trade in USD.
--max-loss 00Daily loss limit in USD. 0 = disabled.

Related bots