use alpaca_base::Environment;
use alpaca_websocket::{AlpacaWebSocketClient, SubscribeMessage};
use futures_util::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Crypto Stream ===\n");
let client = AlpacaWebSocketClient::crypto_from_env(Environment::Paper)?;
println!("Crypto WebSocket client created");
println!("URL: {}", client.url());
let symbols = vec!["BTC/USD".to_string(), "ETH/USD".to_string()];
println!("Subscribing to crypto data for: {:?}", symbols);
let subscription = SubscribeMessage {
trades: Some(symbols.clone()),
quotes: Some(symbols.clone()),
bars: None,
trade_updates: None,
};
println!("\nConnecting to WebSocket...");
let stream = client.subscribe_market_data(subscription).await?;
println!("Connected! Waiting for crypto data...\n");
println!("--- Live Crypto Data ---");
println!("(Press Ctrl+C to stop)\n");
let mut stream = stream;
let mut update_count = 0;
while let Some(update) = stream.next().await {
update_count += 1;
match update {
alpaca_websocket::MarketDataUpdate::Trade { symbol, trade } => {
println!(
"[{}] TRADE {} - ${:.2} x {} @ {}",
update_count, symbol, trade.price, trade.size, trade.timestamp
);
}
alpaca_websocket::MarketDataUpdate::Quote { symbol, quote } => {
let spread = quote.ask_price - quote.bid_price;
println!(
"[{}] QUOTE {} - Bid: ${:.2} | Ask: ${:.2} | Spread: ${:.2}",
update_count, symbol, quote.bid_price, quote.ask_price, spread
);
}
alpaca_websocket::MarketDataUpdate::Bar { symbol, bar } => {
println!(
"[{}] BAR {} - O:{:.2} H:{:.2} L:{:.2} C:{:.2}",
update_count, symbol, bar.open, bar.high, bar.low, bar.close
);
}
}
if update_count >= 20 {
println!("\nReceived 20 updates, stopping demo.");
break;
}
}
println!("\n=== Example Complete ===");
Ok(())
}