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.
| Strategy type | Resolution sniping |
|---|---|
| Asset | BTC |
| Timeframe | 15m |
| Market type | Crypto 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:
- Wait through the first 14 minutes 45 seconds. No polling, no signal computation, nothing.
- Snipe window opens at T-15s (
SNIPE_START = 885s). Poll the orderbook every 2 seconds via Polymarket REST. - Pick a side: if either Up or Down has mid-price ≥
MIN_MID_PRICE($0.90), that side is the favorite. - Compute size:
BET_PCT = 1.00of cash, but capped by--max-betand by what cash supports at $0.95 with a $1 buffer. Targets up to 10 shares. - Fire FOK at
MAX_BUY_PRICE($0.95). Either filled in this exact second or skipped. - Snipe window closes at T-5s (
SNIPE_END = 895s). If no side has crossed the threshold by then, this candle is skipped. - Hold to resolution, verified via Gamma API + Chainlink RTDS.
Risk gates:
MAX_CONSEC_LOSSES = 3: trigger 30-min cooldown after 3 losses in a rowMIN_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.jspoly15m/run.sh(auto-restart wrapper)polymarket-limits.js(fee + tick constants)- README with cooldown tuning + ETH/SOL/XRP variant notes
Configuration
| Flag | Default | Description |
|---|---|---|
| --asset BTC | BTC | Asset to trade. BTC, ETH, SOL, XRP supported. |
| --live | — | Place real orders. Default is dry-run. |
| --sim-balance 30 | 30 | Starting balance in dry-run mode (USD). |
| --max-bet 10 | 10 | Hard cap per trade in USD. |
| --max-loss 0 | 0 | Daily loss limit in USD. 0 = disabled. |
Related bots
poly15m-v6 — Enhanced orderbook signal BTC scalper
Polymarket book + Chainlink RTDS + CVD + OFI + chop filter + trained meta-model. Needs 3 of 8 confirmation layers before FOK taker at $0.52. Quarter-Kelly with drawdown scaling, holds to resolution.
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.