The official Rust client library for Databento. The clients support fast and safe streaming of both real-time and historical market data through similar interfaces.
To add the crate to an existing project, run the following command:
cargo add databento
Real-time and intraday replay is provided through the Live clients. Here is a simple program that fetches the next ES mini futures trade:
use std::error::Error;
use databento::{
dbn::{Dataset, PitSymbolMap, SType, Schema, TradeMsg},
live::Subscription,
LiveClient,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let mut client = LiveClient::builder()
.key_from_env()?
.dataset(Dataset::GlbxMdp3)
.build()
.await?;
client
.subscribe(
&Subscription::builder()
.symbols("ES.FUT")
.schema(Schema::Trades)
.stype_in(SType::Parent)
.build(),
)
.await
.unwrap();
client.start().await?;
let mut symbol_map = PitSymbolMap::new();
// Get the next trade
while let Some(rec) = client.next_record().await? {
if let Some(trade) = rec.get::<TradeMsg>() {
let symbol = &symbol_map[trade];
println!("Received trade for {symbol}: {trade:?}");
break;
}
symbol_map.on_record(rec)?;
}
Ok(())
}
To run this program, set the DATABENTO_API_KEY
environment variable with an API key and run cargo run --example historical
Here is a simple program that fetches 10 minutes worth of historical trades for the entire CME Globex market:
use std::error::Error;
use databento::{
dbn::{Schema, TradeMsg},
historical::timeseries::GetRangeParams,
HistoricalClient, Symbols,
};
use time::macros::{date, datetime};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let mut client = HistoricalClient::builder().key_from_env()?.build()?;
let mut decoder = client
.timeseries()
.get_range(
&GetRangeParams::builder()
.dataset("GLBX.MDP3")
.date_time_range((
datetime!(2022-06-10 14:30 UTC),
datetime!(2022-06-10 14:40 UTC),
))
.symbols(Symbols::All)
.schema(Schema::Trades)
.build(),
)
.await?;
let symbol_map = decoder
.metadata()
.symbol_map_for_date(date!(2022 - 06 - 10))?;
while let Some(trade) = decoder.decode_record::<TradeMsg>().await? {
let symbol = &symbol_map[trade];
println!("Received trade for {symbol}: {trade:?}");
}
Ok(())
}
To run this program, set the DATABENTO_API_KEY
environment variable with an API key and run cargo bin --example live
.
You can find more detailed examples and the full API documentation on the Databento docs site.
Distributed under the Apache 2.0 License.