A high-performance WebSocket integration library for streaming public market data from leading cryptocurrency exchanges - batteries included. It is: * Easy: Barter-Data's simple StreamBuilder interface allows for easy & quick setup (see example below!). * Normalised: Barter-Data's unified interface for consuming public WebSocket data means every Exchange returns a normalised data model. * Real-Time: Barter-Data utilises real-time WebSocket integrations enabling the consumption of normalised tick-by-tick data. * Extensible: Barter-Data is highly extensible, and therefore easy to contribute to with coding new integrations!
See: [Barter
], [Barter-Integration
], [Barter-Execution
] & [Barter-Macro
]
[API Documentation] | [Chat]
Barter-Data is a high-performance WebSocket integration library for streaming public market data from leading cryptocurrency exchanges. It presents an easy-to-use and extensible set of interfaces that can deliver normalised exchange data in real-time.
From a user perspective, the major component is the StreamBuilder
structures that assists in initialising an
arbitrary number of exchange MarketStream
s using input Subscription
s. Simply build your dream set of
MarketStreams
and Barter-Data
will do the rest!
| Exchange | Constructor Code | InstrumentKinds | SubKinds |
|:---------------------:|:------------------------------:|:-------------------------:|:------------------------------------------------:|
| BinanceSpot | BinanceSpot::default()
| Spot | PublicTrades
OrderBooksL1
OrderBooksL2 | |
| BinanceFuturesUsd | BinanceFuturesUsd::default()
| FuturePerpetual | PublicTrades
OrderBooksL1
OrderBooksL2 |
| Bitfinex | Bitfinex
| Spot | PublicTrades |
| BybitSpot | BybitSpot::default()
| Spot | PublicTrades |
| BybitFuturesUsd | BybitFuturesUsd::default()
| FuturePerpetual | PublicTrades |
| Coinbase | Coinbase
| Spot | PublicTrades |
| GateioSpot | GateioSpot::default()
| Spot | PublicTrades |
| GateioFuturesUsd | GateioFuturesUsd::default()
| FuturePerpetual | PublicTrades |
| GateioFuturesBtc | GateioFuturesBtc::default()
| FuturePerpetual | PublicTrades |
| Kraken | Kraken
| Spot | PublicTrades
OrderBooksL1 |
| Okx | Okx
| Spot
FuturePerpetual | PublicTrades |
See barter-data-rs/examples for a more comprehensive selection of examples!
```rust,norun use barterdata::{ exchange::{ binance::{futures::BinanceFuturesUsd, spot::BinanceSpot}, coinbase::Coinbase, gateio::spot::GateioSpot, okx::Okx, }, streams::Streams, subscription::trade::PublicTrades, }; use barter_integration::model::InstrumentKind; use futures::StreamExt;
async fn main() { // Initialise PublicTrades Streams for various exchanges // '--> each call to StreamBuilder::subscribe() initialises a separate WebSocket connection let streams = Streams::builder() .subscribe([ (BinanceSpot::default(), "btc", "usdt", InstrumentKind::Spot, PublicTrades), (BinanceSpot::default(), "eth", "usdt", InstrumentKind::Spot, PublicTrades), ]) .subscribe([ (BinanceFuturesUsd::default(), "btc", "usdt", InstrumentKind::FuturePerpetual, PublicTrades), (BinanceFuturesUsd::default(), "eth", "usdt", InstrumentKind::FuturePerpetual, PublicTrades), ]) .subscribe([ (Coinbase, "btc", "usd", InstrumentKind::Spot, PublicTrades), (Coinbase, "eth", "usd", InstrumentKind::Spot, PublicTrades), ]) .subscribe([ (GateioSpot::default(), "btc", "usdt", InstrumentKind::Spot, PublicTrades), (GateioSpot::default(), "eth", "usdt", InstrumentKind::Spot, PublicTrades), ]) .subscribe([ (Okx, "btc", "usdt", InstrumentKind::Spot, PublicTrades), (Okx, "eth", "usdt", InstrumentKind::Spot, PublicTrades), (Okx, "btc", "usdt", InstrumentKind::FuturePerpetual, PublicTrades), (Okx, "eth", "usdt", InstrumentKind::FuturePerpetual, PublicTrades), ]) .init() .await .unwrap();
// Join all exchange PublicTrades streams into a single tokio_stream::StreamMap
// Notes:
// - Use `streams.select(ExchangeId)` to interact with the individual exchange streams!
// - Use `streams.join()` to join all exchange streams into a single mpsc::UnboundedReceiver!
let mut joined_stream = streams.join_map().await;
while let Some((exchange, trade)) = joined_stream.next().await {
println!("Exchange: {exchange}, Market<PublicTrade>: {trade:?}");
}
} ```
Firstly, see if the answer to your question can be found in the [API Documentation]. If the answer is not there, I'd be happy to help via [Chat] and try answer your question via Discord.
Thanks in advance for helping to develop the Barter ecosystem! Please do get hesitate to get touch via the Discord [Chat] to discuss development, new features, and the future roadmap.
Connector
trait implementation in src/exchange/SubKind
trait implementation in src/subscription/SubKind::Event
data model (eg/ see subscription::trade::PublicTrade).MarketStream
type the exchange Connector
will initialise for the new SubKind
: impl StreamSelector<SubKind> for <ExistingExchangeConnector> { ... }
In addition to the Barter-Execution crate, the Barter project also maintains:
* [Barter
]: High-performance, extensible & modular trading components with batteries-included. Contains a
pre-built trading Engine that can serve as a live-trading or backtesting system.
* [Barter-Integration
]: High-performance, low-level framework for composing flexible web integrations.
* [Barter-Execution
]: High-performance WebSocket integration library for streaming public market data from leading
cryptocurrency exchanges.
* [Barter-Macro
]: Barter ecosystem macros.
This project is licensed under the [MIT license].
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Barter-Data by you, shall be licensed as MIT, without any additional terms or conditions.