polydaily — Daily BTC pair arbitrage bot
Buy-both-sides Gabagool on daily BTC markets (threshold + Up/Down). Picks up cheap YES + NO, locks profit when pair stays below $0.95. Tracks up to 3 markets at once across a ±$1k strike range.
| Strategy type | Pair arbitrage |
|---|---|
| Asset | BTC |
| Timeframe | Daily |
| Market type | Crypto binary |
| Minimum capital | $30 |
| Dependencies | @polymarket/clob-client, ws, ethers |
What it does
polydaily applies the Gabagool buy-both-sides strategy to daily BTC markets. Two market types are covered:
- Threshold: "Will BTC be above $X on
{date}?" — YES is cheap when BTC trades below the strike, NO is cheap when BTC trades above the strike. - Up/Down: "Will BTC be up or down on
{date}?" — sides oscillate cheap based on intraday momentum.
When the average pair-cost (YES + NO) falls below $0.95, the position is locked-in profitable.
The edge
A daily candle gives 24 hours of oscillation. BTC will rally and dump several times in any 24-hour window. Each oscillation makes one side momentarily cheap. A patient bot lifting cheap sides as they appear accumulates a balanced book at a lower average cost than either side alone would have cost.
Capital churn is the trade-off. Daily markets lock capital for up to 24 hours per cycle, so $30 starting capital with 3 simultaneous markets means $10 per market. The 5¢+ pair margin is small per share but compounds over weeks of continuous operation.
How it works
- Discover markets every 5 minutes (
DISCOVERY_INTERVAL_MS): Gamma API search for today's BTC threshold + Up/Down markets within ±$1k of current spot (THRESHOLD_RANGE_K = 1) - Refresh BTC price every 2 minutes (
PRICE_REFRESH_MS) - Poll orderbooks every 60 seconds (
POLL_INTERVAL_MS) - Buy condition: best ask on either side ≤
MAX_BUY_PRICE($0.49) AND ask size ≥MIN_ASK_SIZE(5) - Completion bonus: when one side is already held, the second side can be bought at up to
MAX_BUY_PRICE_COMPLETION($0.51) to lock the pair - Pair-cost check: only buy if
avg_YES + avg_NOwould stay belowPAIR_COST_TARGET($0.95) - Size: 20% of balance per side, hard cap
MAX_BET_PER_SIDE($15) - Cooldown: 30 seconds between buys on the same market (
BUY_COOLDOWN_MS) - Track up to 3 markets concurrently (
MAX_POSITIONS) - Hold to resolution (end of day, midnight UTC for most markets)
Sample output
[24/05/2026, 09:14:32] Polymarket WS connected [24/05/2026, 09:15:01] Discovered 4 BTC markets in ±$1k range (3 threshold, 1 Up/Down) [24/05/2026, 09:18:42] BUY (FOK) 15sh "BTC above $110k?" Yes @ $0.46 ($6.91 incl fee) [24/05/2026, 14:32:14] BUY (FOK) 15sh "BTC above $110k?" No @ $0.47 ($7.06 incl fee) [24/05/2026, 14:32:14] Pair locked: $0.460 + $0.470 = $0.930 (7¢ margin) [25/05/2026, 00:00:01] Resolved Yes WIN | +$15.00 - $13.97 = +$1.03 | Bal: $31.03
Design targets
Locked-in margin per matched share at $0.95 pair cost: $0.05 per share. 15 matched shares per pair = $0.75 gross, minus fees ≈ $0.40-$0.60 net.
Realistic cycle: 1-3 locked pairs per day across 3 simultaneous markets = $0.50-$1.80 daily profit per $30 of capital deployed. Slow but stable, designed to run continuously over weeks.
FAQ
How is this different from poly15m-v4 and poly5m-v4?
Same Gabagool idea, different timescale and market type. The 5-min and 15-min variants ride the Up/Down book within a single candle. polydaily applies the same logic to daily threshold + Up/Down markets, with 24-hour holds and slower polling.
Can I run all three Gabagool bots at once?
Yes. They use different lock files and different market slug prefixes. Capital is shared from the same wallet, so size each bot's BET_PER_SIDE_PCT accordingly.
What's included
polydaily/polydaily.jspolymarket-limits.js- README with strike-range tuning and threshold-vs-Up/Down notes
Configuration
| Flag | Default | Description |
|---|---|---|
| --asset BTC | BTC | Asset to trade. |
| --live | — | Place real orders. Default is dry-run. |
| --sim-balance 30 | 30 | Starting balance in dry-run mode (USD). |
| --max-balance 0 | 0 | Cap the balance used for sizing (USD). 0 = use full balance. |