poly15m-v3 — Maker strategy under post-2026 fee rules

Two-phase maker on 15-min BTC binaries. Phase 1 (0-720s) quotes both sides at 6¢ spread via WebSocket. Phase 2 (720-900s) posts a directional GTC at $0.52 once multi-exchange median picks a winner.

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

What it does

poly15m-v3 was the first 15-minute iteration to abandon taker entries entirely. It posts GTC limit orders that rest on the book, earning zero taker fee and qualifying for Polymarket's maker rewards program. The 15-minute window is split into a two-sided market-making phase and a late directional phase.

The edge

Taker fees on 15-minute crypto markets peak at ~1.56% at p=0.50. A $0.50 maker fill costs 0% and earns rewards on top. Required win rate drops from ~54% (taker) to 50% (maker), a much more forgiving accuracy target. The trick is filling: orders that don't fill within the window expire worthless. v3 solves this with two complementary phases.

How it works

Phase 1 — Market-making (0-720s, 12 minutes)

  • Post a GTC buy on both Up and Down at $0.50 ± 3¢ (MM_SPREAD = 0.06)
  • The Down side gets a tighter spread (MM_DOWN_SPREAD_MULT = 0.35) because the Down book is consistently thinner and needs a tighter offer to fill
  • Refresh quotes every 15 seconds via Polymarket WebSocket
  • 15 shares per side (MM_SIZE = 15)
  • If only one side fills for 4 cycles in a row (MM_MAX_ONESIDED_CYCLES = 4), abort Phase 1 to avoid a stuck inventory bet

Phase 2 — Directional (720-900s, last 3 minutes)

  • Compute multi-exchange median price move since candle open
  • If the move is ≥ 0.12% (DIR_MIN_MOVE_PCT), that direction is the winner
  • Post a GTC buy on the winning side at $0.52 (DIR_PRICE_YES)
  • 15 shares (DIR_SIZE)

Risk gates

  • MAX_BET = $10 per trade
  • MAX_POSITION_PER_MARKET = 30 shares per side
  • MAX_CONSEC_LOSSES = 5 triggers cooldown
  • CANCEL_TIMEOUT_MS = 2000: max time to wait for a cancel to confirm before moving on

Sample output

[25/05/2026, 15:30:01] 📡 Binance connected [25/05/2026, 15:30:01] 📡 Polymarket WS connected [25/05/2026, 15:30:14] 📝 POST Up 15sh @ $0.47 [a3c9d12f...] [25/05/2026, 15:30:14] 📝 POST Down 15sh @ $0.43 [b8e2c4a1...] [25/05/2026, 15:34:28] FILL Down 15sh @ $0.43 [25/05/2026, 15:42:14] Phase 2: Binance +0.18% — posting Up @ $0.52 [25/05/2026, 15:42:14] 📝 POST Up 15sh @ $0.52 [d7f1c93e...] [25/05/2026, 15:43:51] FILL Up 15sh @ $0.52 [25/05/2026, 15:45:01] Resolved WIN | +$5.25 (zero taker fee) | Bal: $35.25

Design targets

Break-even at $0.50 maker entry: 50% WR (zero fee). Design target 52-55% WR on Phase 2 directional fills. Phase 1 MM fills are roughly even on price action (you bought both sides) but contribute to maker reward accumulation. Net expected value comes from Phase 2 plus rewards.

Trade rate: every 15-minute candle gets MM posts; only 30-50% of candles produce a Phase 2 directional fill because the 0.12% threshold filters out flat candles.

What's included

  • poly15m/poly15m-v3.js
  • poly15m/run.sh
  • polymarket-limits.js
  • README with maker rewards setup and spread tuning notes

Configuration

FlagDefaultDescription
--asset BTCBTCAsset to trade. BTC supported at launch.
--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-position 3030Maximum shares per side per market.

Related bots