# Order book strategies

> Trade on what rests in the book, not just the last price. Book reads, recorded history for backtests, maker quotes that rest post-only on the venue, and orders capped to the depth near the middle.

## What a strategy can read

On a perp (Hyperliquid, Lighter) or a Polymarket outcome, a strategy reads the book at each bar:

| Read | Means |
|---|---|
| `book.bid`, `book.ask`, `book.mid` | Best prices and the middle |
| `book.bidSize`, `book.askSize` | What rests at the best prices |
| `book.micro` | The microprice: the middle leaning toward the thinner side |
| `book.spread` | The spread, in bps of the middle |
| `book.bid2` … `book.ask5` | Levels 2 to 5, with sizes |
| `book.bidDepth`, `book.askDepth`, `book.imbalance` | USD on the top 20 levels, and their balance (+1 all bids) |
| `book.bids10`, `book.asks50`, `book.imbalance25`… | USD within 0.1%, 0.25%, 0.5% and 1% of the middle |

## History for backtests

A book is recorded every 15 seconds once a market is in your Sources, a strategy runs on it, or you record it. Backtests read what was recorded; bars before recording began read `na` and never trade. A run on 5s or 15s bars has its book recorded every second, so it steps on each push.

## Maker quotes

`perp.bid({ usd, at })` and `perp.ask({ usd, at })` rest post-only orders at the price you give. They fill when a later bar trades through them (a touch is not a fill), at your price, paying the maker fee. One order rests per line; the next replaces it, and `perp.cancel({})` pulls them all.

On a live project's wallets, a run on one perp rests its quotes on the venue itself as post-only orders.

```text
while (quoting) { perp.cancel({}); }
while (quoting && perp.sizeUsd() < max) {
  perp.bid({ usd: size, at: min(book.bid(market, interval), close * 0.9999) });
}
```

Clamp the price to the bar's close: the book a bar reads can be a little older than its close, and a bid over the close would take rather than rest, so it reverts.

## Taking only what's there

`maxImpactBps` on `perp.long`, `perp.short`, `perp.target` and `perp.hedge` caps an order to what rests that near the middle. In a backtest it's cut to what the recorded book held; live it goes as an immediate-or-cancel limit that far from the live middle, so a thin book never fills you far away.

## Following a book live

Outside a strategy, the `books` stream sends a market's book at most once a second (best prices, sizes, microprice, depth bands and the top 10 levels). A workflow can trigger on it, a source can filter it, and the app's live book panel draws it. See [Sources](https://docs.ftw.trade/sources/markets#order-books).
