Skip to content

OrderBook

Level 2 market depth visualization with bid/ask sides, depth bars, and spread indicator.

Basic Usage

tsx
import { OrderBook } from '@askturret/grid';
import '@askturret/grid/styles.css';

const data = {
  bids: [
    { price: 100.50, size: 500 },
    { price: 100.25, size: 300 },
    { price: 100.00, size: 800 },
  ],
  asks: [
    { price: 100.75, size: 400 },
    { price: 101.00, size: 200 },
    { price: 101.25, size: 600 },
  ],
};

<OrderBook data={data} levels={10} />

Props

PropTypeDefaultDescription
dataOrderBookDatarequiredOrder book data with bids and asks
levelsnumber10Number of price levels to show per side
priceDecimalsnumber2Price decimal places
quantityDecimalsnumber0Quantity decimal places
showSpreadbooleantrueShow spread indicator between bid/ask
showDepthBarsbooleantrueShow depth visualization bars
showOrderCountbooleanfalseShow order count column
compactbooleanfalseCompact mode for smaller displays
onPriceClick(price: number, side: 'bid' | 'ask') => void-Price level click handler
flashOnChangebooleantrueFlash on quantity changes

Data Types

tsx
interface OrderBookData {
  bids: OrderBookLevel[];
  asks: OrderBookLevel[];
}

interface OrderBookLevel {
  price: number;
  size: number;
  orders?: number;  // Optional order count
}

Depth Bars

Depth bars visualize the relative size at each price level:

tsx
<OrderBook
  data={data}
  levels={15}
  showDepthBars={true}  // Default
/>

The bar width represents the cumulative size up to that price level.

Spread Indicator

Shows the spread between best bid and ask:

tsx
<OrderBook
  data={data}
  showSpread={true}  // Default
/>

Displays: Spread: 0.25 (0.25%)

Price Click Handler

Handle clicks on price levels for order entry:

tsx
<OrderBook
  data={data}
  levels={10}
  onPriceClick={(price, side) => {
    console.log(`Clicked ${side} at ${price}`);
    // Open order entry dialog
    setOrderPrice(price);
    setOrderSide(side);
  }}
/>

Order Count

Display the number of orders at each level:

tsx
const data = {
  bids: [
    { price: 100.50, size: 500, orders: 12 },
    { price: 100.25, size: 300, orders: 8 },
  ],
  asks: [
    { price: 100.75, size: 400, orders: 5 },
  ],
};

<OrderBook
  data={data}
  levels={10}
  showOrderCount={true}
/>

Compact Mode

For smaller displays or side panels:

tsx
<OrderBook
  data={data}
  levels={5}
  compact
/>

Real-Time Updates

The component handles real-time updates efficiently:

tsx
function LiveOrderBook() {
  const [data, setData] = useState(initialData);

  useEffect(() => {
    const ws = new WebSocket('wss://...');
    ws.onmessage = (event) => {
      const update = JSON.parse(event.data);
      setData(prev => mergeOrderBook(prev, update));
    };
    return () => ws.close();
  }, []);

  return <OrderBook data={data} levels={10} flashOnChange />;
}

Styling

The OrderBook uses CSS variables for theming:

css
:root {
  --grid-bid: #22c55e;     /* Bid side color */
  --grid-ask: #ef4444;     /* Ask side color */
  --grid-surface: #12121a; /* Background */
}

See Theming for full customization options.

Released under the MIT License.