pulse_btc_arbPulseX WBTC pool → HL BTC signal
HL BTC
pBTC
basis
z

Live monitor — HL BTC vs PulseX pBTC

tick: every ?s · stored: 0 · poll: 2s · worker OFF

Now

no ticks yet — worker collects every 5s

Side-by-side candles — 1m, live

HL BTC perp (mid)
PulseX pBTC
1-minute candles aggregated client-side from 5s ticks. The rightmost candle on each chart is the current minute, still filling (open = first tick of this minute, close = latest tick). Pool candles often appear flat — that's correct: the pool only updates when someone swaps (emits a Sync event). Between swaps the price is unchanged. Time scales + crosshairs are synced.

Overlap — HL (green/red) + pBTC (white/black) on the same price axis

HL BTC V1 candles V1 step V2 step blend (basis vs HL is computed against this)divergences pop visually — green/red sit at HL price, white/black sit at pool price
Same 1m candles, both series on one axis. Vertical gap between same-minute candles = basis. Best viewed with log scale enabled (top of page) when the prices diverge wide enough to matter visually.

Basis (bps) — live, 1m

z-score — live, 1m (entry thresholds at ±3)

Paper PnL — since worker started

no closed trades yet — strategy waits for |z| ≥ 3 with basis ≥ 5bps

Open paper position

no position — strategy is waiting for |z| ≥ 3 with basis ≥ 5bps

Recent paper trades (0 closed)

no trades yet

Pattern events (0)

no events in window

How the pBTC price is derived (V1 vs V2)

PulseX has two factories (V1 and V2). The resolver enumerates every pBTC candidate token × stable/native quote across both factories, reads getReserves() for each, prices any WPLS-quoted pool through the V2 WPLS/DAI pool, and picks the deepest.

Pools the resolver found (click to open on PulseScan):

dexpairpair addressliquidity
V1WBTC / DAI0xff1efdf62ebc20$300k← CHOSEN (deepest)
V2WBTC / WPLS0x8c52470aE71D07$62k
V1WBTC / WPLS0xDB82b09148B2D1$30k
V2WBTC / DAI0x21cbf8e481153f$208
V2WBTC / USDC0x069da5e2228be4$8
V1WBTC / USDC0x6fa61478d84bd3$0

Useful contracts:

The current implementation uses a single pool (V1 / DAI) for the signal because the next-deepest is ~5× smaller and would add noise. Each tick reads the live (reserve0, reserve1) from that one pair via eth_call and computes:

pool_btc_usd = reserve_DAI / reserve_pBTC   (DAI ≈ $1, so this is dollars)

A future iteration could blend V1 + V2 by liquidity weight to smooth out per-pool noise — open work item.

Research dataset

Tick worker writes one row to live_ticks every 5s. Page polls every 2s. Pattern detection lands in live_events.

GET  /api/ticks?since=<unix_sec>&limit=10000
GET  /api/ticks.csv?since=<unix_sec>           # CSV download for offline research
GET  /api/events?since=<unix_sec>&limit=200
GET  /api/paper_trades?since=<unix_sec>
GET  /api/paper_trades/summary                  # aggregate stats + equity curve
GET  /api/ticks/status
↓ download live_ticks.csv