Expand description
§Market Data Guide
This guide covers how to fetch market data from the O2 Exchange using the Rust SDK.
See also: WebSocket Streams for real-time streaming,
O2ClientAPI reference.
§Listing Markets
let markets = client.get_markets().await?;
for market in &markets {
println!(
"{}/{}: base={} ({} decimals)",
market.base.symbol, market.quote.symbol,
market.base.symbol, market.base.decimals,
);
}
// Get a specific market
let market = client.get_market("fFUEL/fUSDC").await?;
println!("Min order: {}", market.min_order);
println!("Maker fee: {}", market.maker_fee);The market pair lookup is case-sensitive and supports the f-prefix
convention used on testnet (e.g., "fFUEL/fUSDC"). You can also look up
by hex market ID using O2Client::get_market_by_id.
§Order Book Depth
Fetch a snapshot of the order book:
let depth = client.get_depth("fFUEL/fUSDC", 1, None).await?;
if let Some(best_bid) = depth.bids.first() {
println!("Best bid: {} x {}", best_bid.price, best_bid.quantity);
}
if let Some(best_ask) = depth.asks.first() {
println!("Best ask: {} x {}", best_ask.price, best_ask.quantity);
}
// Iterate price levels
for level in depth.bids.iter().take(5) {
println!(" BID {} x {}", level.price, level.quantity);
}
for level in depth.asks.iter().take(5) {
println!(" ASK {} x {}", level.price, level.quantity);
}The precision parameter controls price aggregation — lower values
produce fewer, wider price levels.
§Recent Trades
let trades_resp = client.get_trades("fFUEL/fUSDC", 20).await?;
for trade in &trades_resp.trades {
println!(
"{:?} {} @ {} (id={})",
trade.side,
trade.quantity,
trade.price,
trade.trade_id,
);
}§OHLCV Candles
use std::time::{SystemTime, UNIX_EPOCH};
let now_ms = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_millis() as u64;
let bars = client.get_bars("fFUEL/fUSDC", "1h", now_ms - 86_400_000, now_ms).await?;
for bar in &bars {
println!(
"{}: O={} H={} L={} C={} BuyVol={} SellVol={}",
bar.timestamp,
bar.open,
bar.high,
bar.low,
bar.close,
bar.buy_volume,
bar.sell_volume,
);
}Supported resolutions: "1m", "5m", "15m", "30m", "1h", "4h",
"1d", "1w".
§Ticker Data
let ticker = client.get_ticker("fFUEL/fUSDC").await?;
if let Some(last) = ticker.last {
println!("Last: {}", last);
}
println!("Bid: {:?} / Ask: {:?}", ticker.bid, ticker.ask);§Price Conversion
Market data is returned in on-chain integer format. Use the Market
helper methods to convert to/from human-readable values:
let market = client.get_market("fFUEL/fUSDC").await?;
let depth = client.get_depth("fFUEL/fUSDC", 1, None).await?;
if let Some(best_ask) = depth.asks.first() {
let human_price = market.format_price(best_ask.price);
println!("Best ask: {}", human_price);
}
// Human-readable → chain integer
let chain_price = market.scale_price(&"0.02".parse()?);
let chain_qty = market.scale_quantity(&"100".parse()?);§Balances
let balances = client.get_balances(&session.trade_account_id).await?;
for (symbol, bal) in &balances {
println!("{}:", symbol);
println!(" Trading account: {}", bal.trading_account_balance);
println!(" Locked in orders: {}", bal.total_locked);
println!(" Unlocked: {}", bal.total_unlocked);
}§Low-Level API Access
For advanced use cases, you can access the underlying O2Api directly
through the api field:
// Aggregated assets
let assets = client.api.get_aggregated_assets().await?;
// Aggregated order book
let book = client.api.get_aggregated_orderbook("fFUEL_fUSDC").await?;
// Market summaries
let summaries = client.api.get_aggregated_summary().await?;
// All tickers
let tickers = client.api.get_aggregated_ticker().await?;