Skip to main content

OrderbookEngine

Higher-level wrapper that manages one connection, maintains local state, and routes updates to filtered views.

Create and Subscribe

from polynode import OrderbookEngine

engine = OrderbookEngine(api_key="pn_live_...")
await engine.subscribe([token_a, token_b, token_c])

engine.on("ready", lambda: print(f"{engine.size} books loaded"))

Query State

engine.midpoint(token_id)    # float | None
engine.spread(token_id)      # float | None
engine.best_bid(token_id)    # OrderbookLevel | None
engine.best_ask(token_id)    # OrderbookLevel | None
engine.book(token_id)        # (bids, asks) | None

Filtered Views

Create lightweight views that only receive updates for specific tokens:
trade_view = engine.view([token_a, token_b])
portfolio_view = engine.view(my_position_tokens)

trade_view.on("update", lambda u: print(f"{u.asset_id} changed"))
trade_view.on("price", lambda c: print(f"price: {c.assets}"))

trade_view.midpoint(token_a)
trade_view.spread(token_a)

# Swap to different tokens
trade_view.set_tokens([new_token_x, new_token_y])

# Or destroy entirely
trade_view.destroy()

Cleanup

engine.close()  # disconnects WS, destroys all views, clears state