Documentation Index
Fetch the complete documentation index at: https://miny.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Overview
KrakenClient is the primary interface for streaming market data. It manages connections, orderbook state, and event distribution.
Creation
use kraken_sdk::prelude::*;
let client = KrakenClient::builder(vec!["BTC/USD".into()])
.with_depth(Depth::D10)
.with_book(true)
.connect()
.await?;
See Builder Configuration for all options.
Methods
Market Data
| Method | Return | Description |
|---|
best_bid(symbol) | Option<Decimal> | Highest bid price |
best_ask(symbol) | Option<Decimal> | Lowest ask price |
spread(symbol) | Option<Decimal> | Ask minus bid |
mid_price(symbol) | Option<Decimal> | (Bid + Ask) / 2 |
orderbook(symbol) | Option<OrderbookSnapshot> | Full orderbook |
// Query prices
if let Some(spread) = client.spread("BTC/USD") {
println!("Spread: {}", spread);
}
if let Some(bid) = client.best_bid("BTC/USD") {
println!("Best bid: {}", bid);
}
State
| Method | Return | Description |
|---|
is_synced(symbol) | bool | Orderbook valid |
is_connected() | bool | WebSocket open |
if client.is_synced("BTC/USD") && client.is_connected() {
// Safe to use orderbook data
}
Events
let mut events = client.events();
while let Some(event) = events.recv().await {
// Handle event
}
events() can only be called once. It takes ownership of the receiver.
Lifecycle
// Graceful shutdown
client.shutdown();
Thread Safety
KrakenClient is Send + Sync. Safe to share across threads:
use std::sync::Arc;
let client = Arc::new(client);
let client_clone = client.clone();
tokio::spawn(async move {
loop {
let spread = client_clone.spread("BTC/USD");
// ...
}
});
Reads are lock-free. Multiple threads can query simultaneously without blocking.
Full Example
use kraken_sdk::prelude::*;
use std::sync::Arc;
use tokio::signal;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Arc::new(
KrakenClient::builder(vec!["BTC/USD".into(), "ETH/USD".into()])
.with_depth(Depth::D10)
.with_book(true)
.connect()
.await?
);
// Spawn price monitor
let client_monitor = client.clone();
tokio::spawn(async move {
loop {
for symbol in ["BTC/USD", "ETH/USD"] {
if let Some(spread) = client_monitor.spread(symbol) {
println!("{}: {}", symbol, spread);
}
}
tokio::time::sleep(Duration::from_secs(1)).await;
}
});
// Wait for shutdown
signal::ctrl_c().await?;
client.shutdown();
Ok(())
}