ccxt-rust 0.1.5

Cryptocurrency exchange trading library in Rust
Documentation
//! Binance Order Book WebSocket Example
//!
//! Demonstrates real-time order book monitoring via WebSocket streams.
//! Note: This feature is pending implementation.

use ccxt_core::ExchangeConfig;
use ccxt_exchanges::binance::Binance;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("=== Binance Order Book WebSocket Example ===\n");
    println!("Note: Order book WebSocket feature is pending implementation");
    println!("The following examples show planned usage patterns:\n");

    let config = ExchangeConfig {
        api_key: std::env::var("BINANCE_API_KEY")
            .ok()
            .map(ccxt_core::SecretString::new),
        secret: std::env::var("BINANCE_API_SECRET")
            .ok()
            .map(ccxt_core::SecretString::new),
        ..Default::default()
    };

    let _binance = Binance::new(config)?;

    println!("Available Examples:");
    println!("  1. Watch spot order book (fast updates - 100ms)");
    example_watch_spot_orderbook_info();

    println!("\n  2. Watch order book (slow updates - 1000ms)");
    example_watch_orderbook_slow_info();

    println!("\n  3. Watch multiple order books simultaneously");
    example_watch_multiple_orderbooks_info();

    println!("\n  4. Watch futures order book");
    example_watch_futures_orderbook_info();

    println!("\n  5. Order book depth analysis");
    example_orderbook_analysis_info();

    println!("\n  6. Monitor real-time order book updates");
    example_orderbook_updates_info();

    println!("\n=== Example Information Complete ===");
    println!("\nTo enable these features, implement the watch_order_book method in Binance.");
    println!("Reference: https://binance-docs.github.io/apidocs/spot/en/#diff-depth-stream");

    Ok(())
}

/// Example 1: Watch spot order book with fast updates (100ms)
fn example_watch_spot_orderbook_info() {
    println!("\n--- Example 1: Watch Spot Order Book (Fast Updates) ---");
    println!("\nFeatures:");
    println!("  • Subscribe to BTC/USDT order book");
    println!("  • Fast update speed (100ms)");
    println!("  • Monitor top 5 bid/ask levels");
    println!("  • Calculate spread and mid-price");
    println!("\nExample Code:");
    println!(
        r#"
    let symbol = "BTC/USDT";
    let limit = Some(5);
    
    let mut stream = binance.watch_order_book(symbol, limit).await?;
    
    while let Some(orderbook) = stream.next().await {{
        println!("Symbol: {{}}", orderbook.symbol);
        println!("Best Bid: {{}}", orderbook.bids[0].price);
        println!("Best Ask: {{}}", orderbook.asks[0].price);
        
        let spread = orderbook.asks[0].price - orderbook.bids[0].price;
        let mid_price = (orderbook.asks[0].price + orderbook.bids[0].price) / 2;
        println!("Spread: {{}}", spread);
        println!("Mid Price: {{}}", mid_price);
    }}
    "#
    );
}

/// Example 2: Watch order book with slow updates (1000ms)
fn example_watch_orderbook_slow_info() {
    println!("\n--- Example 2: Watch Order Book (Slow Updates) ---");
    println!("\nFeatures:");
    println!("  • Reduced update frequency (1000ms)");
    println!("  • Lower bandwidth consumption");
    println!("  • Suitable for non-HFT strategies");
    println!("\nExample Code:");
    println!(
        r#"
    let symbol = "ETH/USDT";
    let limit = Some(10);
    
    let params = HashMap::from([
        ("updateSpeed".to_string(), "1000ms".to_string())
    ]);
    
    let mut stream = binance.watch_order_book_with_params(symbol, limit, params).await?;
    
    while let Some(orderbook) = stream.next().await {{
        println!("Timestamp: {{}}", orderbook.timestamp);
        println!("Depth levels: {{}}", orderbook.bids.len());
    }}
    "#
    );
}

/// Example 3: Watch multiple order books simultaneously
fn example_watch_multiple_orderbooks_info() {
    println!("\n--- Example 3: Watch Multiple Order Books ---");
    println!("\nFeatures:");
    println!("  • Monitor multiple trading pairs");
    println!("  • Batch subscription reduces overhead");
    println!("  • Compare cross-pair liquidity");
    println!("\nExample Code:");
    println!(
        r#"
    let symbols = vec!["BTC/USDT", "ETH/USDT", "BNB/USDT"];
    let limit = Some(5);
    
    let mut streams = binance.watch_order_books(symbols, limit).await?;
    
    while let Some((symbol, orderbook)) = streams.next().await {{
        println!("\nSymbol: {{}}", symbol);
        println!("Best Bid: {{}}", orderbook.bids[0].price);
        println!("Best Ask: {{}}", orderbook.asks[0].price);
        
        let liquidity = orderbook.bids.iter()
            .take(5)
            .map(|level| level.amount)
            .sum::<Decimal>();
        println!("Top 5 bid liquidity: {{}}", liquidity);
    }}
    "#
    );
}

/// Example 4: Watch futures order book
fn example_watch_futures_orderbook_info() {
    println!("\n--- Example 4: Watch Futures Order Book ---");
    println!("\nFeatures:");
    println!("  • Subscribe to USDT-M futures order book");
    println!("  • Higher leverage and volatility");
    println!("  • Mark price and funding rate correlation");
    println!("\nExample Code:");
    println!(
        r#"
    let symbol = "BTC/USDT:USDT";  // USDT-M perpetual contract
    let limit = Some(20);
    
    let params = HashMap::from([
        ("type".to_string(), "future".to_string())
    ]);
    
    let mut stream = binance.watch_order_book_with_params(symbol, limit, params).await?;
    
    while let Some(orderbook) = stream.next().await {{
        println!("Contract: {{}}", orderbook.symbol);
        
        let total_bid_size = orderbook.bids.iter()
            .map(|l| l.amount)
            .sum::<Decimal>();
        let total_ask_size = orderbook.asks.iter()
            .map(|l| l.amount)
            .sum::<Decimal>();
            
        println!("Total Bid Size: {{}} BTC", total_bid_size);
        println!("Total Ask Size: {{}} BTC", total_ask_size);
        
        let imbalance = total_bid_size / (total_bid_size + total_ask_size);
        println!("Buy Pressure: {{}}%", imbalance * 100);
    }}
    "#
    );
}

/// Example 5: Order book depth analysis
fn example_orderbook_analysis_info() {
    println!("\n--- Example 5: Order Book Depth Analysis ---");
    println!("\nFeatures:");
    println!("  • Analyze order book structure");
    println!("  • Calculate support/resistance levels");
    println!("  • Identify large orders (walls)");
    println!("  • Measure market depth");
    println!("\nExample Code:");
    println!(
        r#"
    let symbol = "BTC/USDT";
    let limit = Some(100);
    
    let mut stream = binance.watch_order_book(symbol, limit).await?;
    
    while let Some(orderbook) = stream.next().await {{
        // Find largest bid/ask walls
        let max_bid = orderbook.bids.iter()
            .max_by(|a, b| a.amount.cmp(&b.amount))
            .unwrap();
        let max_ask = orderbook.asks.iter()
            .max_by(|a, b| a.amount.cmp(&b.amount))
            .unwrap();
            
        println!("\nLargest Bid Wall:");
        println!("  Price: {{}}", max_bid.price);
        println!("  Amount: {{}} BTC", max_bid.amount);
        
        println!("\nLargest Ask Wall:");
        println!("  Price: {{}}", max_ask.price);
        println!("  Amount: {{}} BTC", max_ask.amount);
        
        // Calculate cumulative depth
        let depth_1pct = calculate_depth_to_percentage(&orderbook, 0.01);
        println!("\nDepth to move price 1%: {{}} USDT", depth_1pct);
    }}
    "#
    );
}

/// Example 6: Monitor real-time order book updates
fn example_orderbook_updates_info() {
    println!("\n--- Example 6: Real-time Order Book Updates ---");
    println!("\nFeatures:");
    println!("  • Track order book changes");
    println!("  • Detect significant price movements");
    println!("  • Monitor spread dynamics");
    println!("  • Alert on anomalies");
    println!("\nExample Code:");
    println!(
        r#"
    let symbol = "BTC/USDT";
    let limit = Some(10);
    
    let mut stream = binance.watch_order_book(symbol, limit).await?;
    let mut prev_mid_price = None;
    
    while let Some(orderbook) = stream.next().await {{
        let best_bid = orderbook.bids[0].price;
        let best_ask = orderbook.asks[0].price;
        let spread = best_ask - best_bid;
        let spread_pct = (spread / best_bid) * Decimal::from(100);
        let mid_price = (best_bid + best_ask) / Decimal::from(2);
        
        println!("\n[{{}}] Update", orderbook.timestamp);
        println!("Best Bid: {{}} | Best Ask: {{}}", best_bid, best_ask);
        println!("Spread: {{}} ({{}}%)", spread, spread_pct);
        
        if let Some(prev) = prev_mid_price {{
            let price_change = ((mid_price - prev) / prev) * Decimal::from(100);
            println!("Price Change: {{}}%", price_change);
            
            if price_change.abs() > Decimal::from_str("0.1").unwrap() {{
                println!("⚠️  Significant price movement detected!");
            }}
        }}
        
        if spread_pct > Decimal::from_str("0.05").unwrap() {{
            println!("⚠️  Wide spread detected - low liquidity!");
        }}
        
        prev_mid_price = Some(mid_price);
    }}
    "#
    );
}