use std::{
thread,
time::{Duration, Instant},
};
use ndaxrs::ws::{NdaxWsAPI, NdaxWsConfig};
fn main() {
env_logger::init();
log::info!("Starting NDAX public data example");
let config = NdaxWsConfig::builder()
.subscribe_level2(vec![1]) .book_depth(10) .build();
log::info!("Connecting to NDAX WebSocket...");
let api = match NdaxWsAPI::new(config) {
Ok(api) => {
log::info!("Successfully connected to NDAX WebSocket");
api
}
Err(e) => {
eprintln!("Error: Failed to connect to NDAX: {}", e);
eprintln!("Make sure you have network connectivity.");
return;
}
};
log::info!("Fetching available instruments...");
match api.get_instruments() {
Ok(instruments) => {
println!("\n=== Available Trading Pairs ===");
for inst in &instruments {
println!(
" ID {}: {} ({})",
inst.instrument_id,
inst.trading_pair(),
inst.symbol
);
}
println!("Total: {} instruments\n", instruments.len());
if let Some(btc_cad) =
instruments.iter().find(|i| i.symbol.contains("BTCCAD"))
{
log::info!(
"Found BTC/CAD: instrument_id={}, qty_increment={}, \
price_increment={}",
btc_cad.instrument_id,
btc_cad.quantity_increment,
btc_cad.price_increment
);
}
}
Err(e) => {
log::warn!("Failed to fetch instruments: {}", e);
log::info!("Continuing with default instrument_id=1 for BTC/CAD");
}
}
let btc_cad_instrument_id: u64 = 1;
log::info!("Waiting for initial order book data...");
thread::sleep(Duration::from_secs(2));
log::info!("Starting 30-second market data loop for BTC/CAD...");
log::info!("Press Ctrl+C to stop early.");
let start_time = Instant::now();
let duration = Duration::from_secs(30);
let mut last_mid_price = None;
while start_time.elapsed() < duration {
if api.is_closed() {
log::error!("WebSocket connection closed unexpectedly");
break;
}
if let Some(book) = api.get_book(btc_cad_instrument_id) {
let best_bid = book.best_bid();
let best_ask = book.best_ask();
let mid_price = book.mid_price();
let spread = book.spread();
if (best_bid.is_some() || best_ask.is_some())
&& mid_price != last_mid_price
{
println!("=== BTC/CAD Order Book ===");
if let Some((bid_price, bid_qty)) = best_bid {
println!(" Best Bid: {} CAD (qty: {})", bid_price, bid_qty);
} else {
println!(" Best Bid: No bids");
}
if let Some((ask_price, ask_qty)) = best_ask {
println!(" Best Ask: {} CAD (qty: {})", ask_price, ask_qty);
} else {
println!(" Best Ask: No asks");
}
if let Some(mid) = mid_price {
println!(" Mid Price: {} CAD", mid);
}
if let Some(s) = spread {
println!(" Spread: {} CAD", s);
}
let time_remaining = duration.saturating_sub(start_time.elapsed());
println!(
" ({} bid levels, {} ask levels, {}s remaining)",
book.bids.len(),
book.asks.len(),
time_remaining.as_secs()
);
println!();
last_mid_price = mid_price;
}
}
thread::sleep(Duration::from_millis(500));
}
log::info!("Closing WebSocket connection...");
api.close();
log::info!("Disconnected. Example complete.");
}