#![allow(clippy::disallowed_methods)]
use ccxt_core::ExchangeConfig;
use ccxt_core::types::ohlcv_request::OhlcvRequest;
use ccxt_exchanges::okx::Okx;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== OKX Market Data API Example ===\n");
let config = ExchangeConfig::default();
let exchange = Okx::new(config)?;
println!("1. 【fetch_markets】Get all supported markets");
println!(" Fetching markets...");
let markets = exchange.fetch_markets().await?;
println!(" ✓ Found {} markets", markets.len());
println!(" Sample markets:");
for market in markets.values().take(5) {
println!(
" - {} ({}) Type: {:?} Active: {}",
market.symbol, market.id, market.market_type, market.active
);
}
println!();
exchange.load_markets(false).await?;
println!("2. 【fetch_ticker】Get BTC/USDT ticker");
match exchange.fetch_ticker("BTC/USDT").await {
Ok(ticker) => {
println!(" ✓ Successfully fetched BTC/USDT ticker");
println!(" - Symbol: {}", ticker.symbol);
println!(" - Last Price: {:?}", ticker.last);
println!(" - High (24h): {:?}", ticker.high);
println!(" - Low (24h): {:?}", ticker.low);
println!(" - Volume (24h): {:?}", ticker.base_volume);
println!(" - Timestamp: {}", ticker.timestamp);
}
Err(e) => println!(" ✗ Error: {}", e),
}
println!();
println!("3. 【fetch_order_book】Get BTC/USDT order book");
match exchange.fetch_order_book("BTC/USDT", Some(5)).await {
Ok(order_book) => {
println!(" ✓ Successfully fetched order book");
println!(" - Bids: {} levels", order_book.bids.len());
println!(" - Asks: {} levels", order_book.asks.len());
if let Some(best_bid) = order_book.bids.first() {
println!(" - Best Bid: {} @ {}", best_bid.amount, best_bid.price);
}
if let Some(best_ask) = order_book.asks.first() {
println!(" - Best Ask: {} @ {}", best_ask.amount, best_ask.price);
}
}
Err(e) => println!(" ✗ Error: {}", e),
}
println!();
println!("4. 【fetch_trades】Get BTC/USDT recent trades");
match exchange.fetch_trades("BTC/USDT", Some(5)).await {
Ok(trades) => {
println!(" ✓ Successfully fetched {} trades", trades.len());
for (i, trade) in trades.iter().take(5).enumerate() {
println!(
" {}. {:?} {} @ {} (Time: {})",
i + 1,
trade.side,
trade.amount,
trade.price,
trade.datetime.as_deref().unwrap_or("N/A")
);
}
}
Err(e) => println!(" ✗ Error: {}", e),
}
println!();
println!("5. 【fetch_ohlcv】Get BTC/USDT 1h candles");
let request = OhlcvRequest::builder()
.symbol("BTC/USDT")
.timeframe("1h")
.limit(5)
.build()?;
match exchange.fetch_ohlcv_v2(request).await {
Ok(ohlcvs) => {
println!(" ✓ Successfully fetched {} candles", ohlcvs.len());
for (i, ohlcv) in ohlcvs.iter().enumerate() {
println!(
" {}. Time: {}, Open: {}, High: {}, Low: {}, Close: {}, Vol: {}",
i + 1,
ohlcv.timestamp,
ohlcv.open,
ohlcv.high,
ohlcv.low,
ohlcv.close,
ohlcv.volume
);
}
}
Err(e) => println!(" ✗ Error: {}", e),
}
println!();
println!("=== Example Complete ===");
Ok(())
}