poly15m-v2 — Reactive composite signal, hold to resolution

v1 composite signal with ATR-adaptive entry threshold (0.5 × ATR, 0.05% fallback). FOK taker at $0.51 between 45s and 600s. All early exits disabled, holds every position to Chainlink resolution.

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

What it does

poly15m-v2 keeps v1's composite signal (momentum + volume imbalance + velocity) and changes two things: the entry threshold scales with realized volatility (ATR-adaptive instead of static), and every early exit is disabled. Every trade rides to Chainlink resolution.

The edge

v1's static thresholds misfire across volatility regimes: too tight in calm markets (no trades), too loose in volatile ones (overtrading). v2's threshold is 0.5 × ATR-derived percent (0.05% fallback). In calm markets it lowers the bar; in volatile ones it raises it. This is what "reactive" means in the source comments.

The hold-to-resolution rule is the second change. v1's retracement-based exits triggered on most trades and locked in losses or partial wins before the underlying had a chance to confirm. v2's premise: on 15-minute candles the variance is too high for an early-exit rule to add value. Either the signal works on the full window or it doesn't.

How it works

  1. Connect to Binance + Coinbase + Kraken WebSockets for the multi-feed median price.
  2. ATR computation: rolling, derived from Binance 1-minute candles.
  3. Compute composite (same shape as v1).
  4. Adaptive threshold: threshold = max(0.05%, 0.5 × ATR_pct).
  5. Entry window: 45s to 600s into the candle (wider than v1's 90-270s because hold-to-resolution forgives later entries).
  6. Trend filter: skip if the BTC price is more than 0.10% counter to the dominant trend direction in the entry window.
  7. FOK taker at $0.51, sized at 8% of balance, capped at --max-bet.
  8. No early exits. Position holds until 15-minute Chainlink resolution.

Sample output

[25/05/2026, 15:32:14] 📡 Binance connected [25/05/2026, 15:33:50] 📡 Composite=1.42 ATR=0.18% threshold=0.090% — entering [25/05/2026, 15:33:51] BUY (FOK) 16sh @ $0.51 ($8.30 incl fee) [25/05/2026, 15:33:51] Filled: 0xc9a1... [25/05/2026, 15:45:01] Resolved WIN | +$7.70 | Bal: $37.70

Design targets

Break-even at $0.51 entry: required WR ≈ 51.7%. Design target 54-58% realized WR through the ATR-gated composite. Hold-to-resolution means fewer flash exits but bigger swings per trade.

Trade rate: similar to v1 (15-25% of candles trigger), but distribution shifts toward more entries in volatile regimes and fewer in calm ones.

FAQ

Why was hold-to-resolution chosen over a tighter exit rule?

Backtests on v1's exit ladder showed early exits hit the right call ~30% of the time and stopped out winners ~70% of the time. Net effect was negative expected value. v2's hold-to-resolution accepts the variance for higher per-trade expectation.

What's included

  • poly15m/poly15m-v2.js
  • poly15m/run.sh
  • polymarket-limits.js
  • README with ATR window tuning + trend filter 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-balance 00Cap the balance used for sizing. 0 = use full balance.

Related bots