use binance_api_client::{Binance, DepthCacheConfig, DepthCacheManager};
use std::time::Duration;
#[tokio::main]
async fn main() -> binance_api_client::Result<()> {
tracing_subscriber::fmt::init();
println!("=== Binance Depth Cache Manager Example ===\n");
let client = Binance::new_unauthenticated()?;
let config = DepthCacheConfig {
depth_limit: 100, fast_updates: true, refresh_interval: None, };
let symbol = "BTCUSDT";
println!("Starting depth cache for {}...", symbol);
println!("Config: {:?}\n", config);
let mut manager = DepthCacheManager::new(client.clone(), symbol, config).await?;
println!("Waiting for initial sync...");
manager.wait_for_sync().await?;
println!("Synced!\n");
let cache = manager.get_cache().await;
println!("=== Initial Order Book State ===");
println!("Symbol: {}", cache.symbol);
println!("Last Update ID: {}", cache.last_update_id);
if let Some((bid_price, bid_qty)) = cache.best_bid() {
println!("Best Bid: {} @ {}", bid_qty, bid_price);
}
if let Some((ask_price, ask_qty)) = cache.best_ask() {
println!("Best Ask: {} @ {}", ask_qty, ask_price);
}
if let Some(spread) = cache.spread() {
println!("Spread: {:.2}", spread);
}
if let Some(mid) = cache.mid_price() {
println!("Mid Price: {:.2}", mid);
}
println!();
println!("=== Top 5 Bid/Ask Levels ===");
println!("BIDS:");
for (price, qty) in cache.get_top_bids(5) {
println!(" {} @ {:.2}", qty, price);
}
println!("ASKS:");
for (price, qty) in cache.get_top_asks(5) {
println!(" {} @ {:.2}", qty, price);
}
println!();
println!("=== Volume Statistics ===");
println!("Total Bid Volume: {:.4}", cache.total_bid_volume());
println!("Total Ask Volume: {:.4}", cache.total_ask_volume());
println!();
println!("=== Real-time Updates (10 updates) ===\n");
let mut update_count = 0;
while let Some(updated_cache) = manager.next().await {
update_count += 1;
let best_bid = updated_cache.best_bid();
let best_ask = updated_cache.best_ask();
let spread = updated_cache.spread();
println!(
"Update #{}: Bid: {:?} | Ask: {:?} | Spread: {:?}",
update_count,
best_bid.map(|(p, _)| format!("{:.2}", p)),
best_ask.map(|(p, _)| format!("{:.2}", p)),
spread.map(|s| format!("{:.2}", s))
);
if update_count >= 10 {
break;
}
}
println!("\n=== Manager State ===");
println!("State: {:?}", manager.state().await);
println!("\nStopping depth cache manager...");
manager.stop();
tokio::time::sleep(Duration::from_millis(100)).await;
println!("\n=== Example completed successfully! ===");
Ok(())
}