We have been developing mobile exchange applications for over 5 years and have completed 30+ projects with real-time data integration. One of the most demanding components is the order book. Data updates every 100 ms, the list can contain up to 500 price levels, and the interface must remain responsive even under peak load. Without optimization, the app lags at just 50 levels — users flee to competitors. We handle all technical challenges: from protocol selection and snapshot synchronization to rendering virtualization and decimal precision handling. Contact us for a consultation on implementing an order book tailored to your exchange.
How to Avoid Lags When Rendering the Order Book
Rendering the order book is the primary source of performance issues. 100 price levels × updates every 100 ms = 10,000 updates per second. On a mobile device, this causes lags without optimizations.
Virtualization is the key technique. We display only visible levels, not all 100. On iOS — UITableView with reloadRows(at:with:) for changed rows, not reloadData(). On Android — RecyclerView with DiffUtil to compute minimal changes. In Flutter — ListView.builder with itemCount. This reduces UI load by 2.5x.
Batching updates. Do not update the list on every WebSocket event. We accumulate updates and apply them every 250–500 ms. The user does not notice the difference, and the renderer does 2.5x less work.
| Approach | iOS | Android | Flutter |
|---|---|---|---|
| Virtualization | UITableView | RecyclerView | ListView.builder |
| Updating | reloadRows | DiffUtil | itemBuilder |
| Batching | CADisplayLink | Choreographer | Timer |
Colors and highlighting: on price decrease — red background, on increase — green, then smoothly return to neutral. We implement this via color animation with CABasicAnimation (iOS) or ValueAnimator (Android). Do not keep timers on each row — use a single timer for the entire list.
Data Source: WebSocket
The exchange order book updates via WebSocket — HTTP polling is unacceptable due to latency. WebSocket provides 10+ times lower delay than polling, which is critical for trading. Standard approach: get a snapshot via REST, then subscribe to incremental updates via WS.
Example for Binance API (pattern used by most exchanges):
GET https://api.binance.com/api/v3/depth?symbol=BTCUSDT&limit=100 → snapshot with full bids and asks WSS wss://stream.binance.com:9443/ws/btcusdt@depth@100ms → incremental updates every 100ms Applying incremental updates: if a price level already exists in the book, update quantity. If quantity is 0, remove the level. If price is new, add it. This is the standard diff algorithm for an order book. The Binance API documentation describes this method.
How to Sync Snapshot and Stream?
A critical point often implemented incorrectly: the WebSocket starts sending updates before the REST request for snapshot has returned. You must buffer WS events, obtain the snapshot with its lastUpdateId, then apply all buffered events with firstUpdateId <= lastUpdateId + 1. Missed an event? Desynchronized? The only way out is to reconnect and get a new snapshot. Do not attempt to recover state from partial data.
Why Is Number Precision Critical for Order Book?
Prices and volumes on exchanges are decimals with high precision. BTC trades with 8 decimal places. Using Double leads to rounding errors. We use Decimal (iOS) or BigDecimal (Android) for correct display and summation. Comparison: Double gives up to 0.0001% error over 1000 operations, while Decimal gives zero. Formatting: different trading pairs have different tick sizes (minimum price step). For BTC/USDT tick size is 0.01, for altcoins up to 8 decimals. The number of displayed decimals is taken from pair metadata, not hardcoded.
Comparison of Synchronization Approaches
There are three main ways to synchronize order book data. The first is periodic full snapshot requests: simple to implement, but generates high traffic and increases latency. The second is subscribing to incremental updates via WebSocket: low latency, but complex synchronization, especially on packet loss. The optimal is hybrid: one-time snapshot on connection, then incremental updates. This approach requires buffering WS events until snapshot receipt and order correction, but gives the best balance of performance and reliability. We use this in all projects — it reduces traffic by 20x compared to full snapshot and provides update latency under 50 ms.
Step-by-Step Synchronization Implementation
- Establish WebSocket connection and start buffering all incoming messages.
- Send REST request to obtain snapshot with the last update id.
- After receiving the snapshot, apply buffered events with firstUpdateId <= lastUpdateId + 1.
- If event loss or desynchronization is detected — reconnect and repeat steps 1-3.
- After successful synchronization, switch to real-time stream processing using the diff algorithm.
Depth Chart
Visualize volumes via an accumulated histogram (depth chart) — we accumulate volume from the best price to worst. Draw using CAShapeLayer / Canvas / CustomPainter in Flutter. Update no more than once per second — it's a visualization, not a trading tool.
Offline and Reconnection
On connection loss, we clear the book and show a "No Data / Reconnecting" state. Do not display an outdated book as current — it misleads during trading. Reconnection logic: exponential backoff from 1 s to 30 s. After restoration, we re-fetch the snapshot and resubscribe.
What's Included
- Architecture of WebSocket connection with snapshot/incremental synchronization.
- Implementation of virtualized list with batching and animation.
- Integration of depth chart and number formatting with tick size.
- Handling offline mode and reconnection with exponential backoff.
- Testing on real data and performance optimization.
- Documentation and source code delivery.
Cost and Savings
The cost of order book implementation is calculated individually — it depends on integration complexity, number of trading pairs, and customization needs. On average, ordering a ready module costs 30-50% less than developing from scratch and saves 2-4 weeks of team time. Contact us for a project estimate.
We guarantee correct synchronization and responsive interface under any load. Get a consultation — we will analyze your API and propose the optimal solution.







