Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Trading Data

The aim is to get a rough idea of the load that can be envisioned for a successful order book in the ICP ecosystem. We focus on Binance as the primary benchmark because it handles 25-40x more ICP volume than the next largest exchange (Kraken):

MetricBinance ICP/USDTKraken ICP/USDRatio
Trades/24h15,72664424x
Volume/24h (ICP)1,189,21628,93341x
Book depth (levels)5,6977617.5x
Peak trades/hour143,9323,53241x

Both exchanges peaked at the same hour (2026-03-11 06:00 UTC) with similar peak-to-average ratios (~30-54x), confirming that burst patterns are market-wide, not exchange-specific. Kraken data was fetched from their public REST API (/0/public/Ticker, /0/public/OHLC, /0/public/Depth, and /0/public/Trades endpoints) on the same date.

The trading data below was obtained from Binance public API on 2026-04-04. Interesting pairs related to ICP:

  • ICP/BTC: pure crypto trading pair
  • ICP/USDT: most active trading pair involving ICP

Overview of ICP Trading Pairs on Binance (24h snapshot, 2026-04-04)

PairTrades/24hVolume (ICP)Quote Volume
ICP/USDT15,7261,189,216$2,727,915
ICP/BNB4,00036,058567 BNB
ICP/BUSD4,000112,270$442,288
ICP/ETH4,00070,38184 ETH
ICP/USDC3,680241,641$554,496
ICP/TRY47532,2413,289,432 TRY
ICP/FDUSD1842,879$6,597
ICP/BTC1326,9930.24 BTC
ICP/EUR1315,01710,003 EUR
ICP/RUB000 RUB

ICP/USDT is the busiest pair by far (~4x the runner-up). BNB, BUSD, and ETH pairs all show exactly 4,000 trades, likely reflecting Binance’s internal market-making bots rather than organic volume.

Fetched by querying all ICP pairs from the exchange info endpoint, then their 24h tickers:

# List all ICP pairs
curl -s 'https://api.binance.com/api/v3/exchangeInfo' | python3 -c "
import json,sys; info=json.load(sys.stdin)
for s in info['symbols']:
    if s['baseAsset']=='ICP' or s['quoteAsset']=='ICP': print(s['symbol'])"

# Get 24h stats for each pair (example for one)
curl -s 'https://api.binance.com/api/v3/ticker/24hr?symbol=ICPUSDT'

Data Sources

All data was fetched from Binance public API v3 on 2026-04-04. Commands to recreate:

API="https://api.binance.com/api/v3"
DATE=$(date +%Y_%m_%d)
SYMBOLS="ICPBTC ICPUSDT"

for SYM in $SYMBOLS; do
  # 24h ticker statistics
  curl -s "$API/ticker/24hr?symbol=$SYM"                    -o "${DATE}_binance_ticker_24hr_${SYM}.json"
  # Hourly candlestick data (last 1000 hours ~ 41 days)
  curl -s "$API/klines?symbol=$SYM&interval=1h&limit=1000"  -o "${DATE}_binance_klines_1h_${SYM}.json"
  # Order book depth (up to 5000 levels)
  curl -s "$API/depth?symbol=$SYM&limit=5000"               -o "${DATE}_binance_depth_${SYM}.json"
  # Aggregated trades (last 1000)
  curl -s "$API/aggTrades?symbol=$SYM&limit=1000"           -o "${DATE}_binance_agg_trades_${SYM}.json"
  # Individual historical trades (last 1000)
  curl -s "$API/historicalTrades?symbol=$SYM&limit=1000"    -o "${DATE}_binance_historical_trades_${SYM}.json"
done

Analysis Results

1. Volume Comparison (24h snapshot)

PairTrades/24hVolume (ICP)Quote VolumeTrades/hour
ICP/BTC1326,9930.24 BTC5.5
ICP/USDT15,7261,189,216$2,727,915655.2

ICP/USDT dominates with ~80% of all trades and ~80% of dollar volume. ICP/BTC is negligible by comparison.

2. Trade Rate and Burstiness

From the last 1000 historical trades of each pair:

PairPeriod coveredAvg trades/hourAvg gap between tradesMin gap (burst)Max gap (quiet)
ICP/BTC5.0 days8.47 min 8s0ms1h 53min
ICP/USDT1.5 hours656.85.5s0ms2.8 min

All pairs exhibit bursty behavior: the minimum observed gap is 0ms (multiple trades share the same millisecond timestamp when a single market order hits several resting orders), while quiet periods can stretch to nearly 2 hours on ICP/BTC.

3. Aggregation Ratio (aggTrades vs individual trades)

PairIndividual trades per aggTrade
ICP/BTC1.25
ICP/USDT2.09

A ratio above 1 means a single incoming order frequently matches against multiple resting orders at different price levels. ICP/USDT’s ratio of 2.09 means the average market order eats through ~2 price levels. This is relevant for matching engine design: each incoming order triggers on average 1-2 fills, not just one.

4. Order Book Depth (resting orders)

PairBid levelsAsk levelsTotal levelsBid depth (ICP)Ask depth (ICP)Spread
ICP/BTC921,1801,27261,85778,5570.291%
ICP/USDT6975,000+5,697924,9011,289,9200.043%

ICP/USDT has the deepest book with at least 5,697 price levels of resting orders (the ask side hit the API’s 5,000-level limit, so the true count is higher). Both pairs are heavily ask-skewed, meaning more liquidity is offered on the sell side. ICP/USDT has a tight spread (0.043%), while BTC has a wider spread (0.291%), reflecting lower liquidity.

5. Peak Load Analysis (from 1000 hours of kline data)

PairAvg trades/hourMedianp95p99Peak hourPeak trades/hourPeak trades/sec
ICP/BTC38.5171342972026-03-11 06:003,9551.10
ICP/USDT2,6481,7796,22913,4832026-03-11 06:00143,93239.98

Both pairs saw their peak at the exact same hour (2026-03-11 06:00 UTC), suggesting a market-wide event. The peak-to-average ratio is 103x (BTC) and 54x (USDT), showing extreme spikiness.

Interpretation for ICP OISY TRADE Design

Steady-state load is very manageable. During normal conditions, ICP/USDT – the busiest pair – sees about 2,600 trades/hour (~0.7/sec). Even aggregating both pairs, the matching engine would process fewer than 1 trade per second on average. This is well within the capacity of a single canister on ICP.

Peak load is the real design constraint. The busiest hour recorded saw ~144,000 trades on ICP/USDT alone – that is 40 trades/sec sustained over an hour, with likely much higher sub-minute bursts. At p99 the rate is ~3.7 trades/sec. Designing for the p99 case (~15,000 trades/hour, ~4 trades/sec) is sensible; handling the extreme peak (40/sec) would require either batching or accepting some queuing delay.

Order book size is moderate. The deepest book (ICP/USDT) has at least ~5,700 price levels. An ICP canister can easily hold this in-memory. Even 10x this depth (57,000 levels) would be manageable.

Fan-out is cheap in our design. Each incoming order generates ~2 fills on average (ICP/USDT). Since our OISY TRADE settles fills via internal balance updates (no ledger calls), the fan-out only adds in-canister bookkeeping cost, which is negligible. Ledger transfers are only needed at deposit/withdrawal time, not per fill.

ICP/USDT should be the primary benchmark. It represents ~80% of volume and depth. ICP/BTC is essentially a rounding error in comparison and could be deprioritized in capacity planning.