apple-quant-algorithmic 0.1.0

Apple Quant's algorithmic trading api
Documentation
use std::range::Range;

use databento::{
	HistoricalClient,
	dbn::{Dataset, Schema, decode::AsyncDbnDecoder},
	historical::timeseries::GetRangeParams,
};
use time::{UtcDateTime, UtcOffset};
use tokio::io::AsyncReadExt;

use crate::{backends::databento::symbology::Symbology, instrument::InstrumentTicker};

pub(crate) struct DatabentoHistorical {
	historical_client: HistoricalClient,
}

impl DatabentoHistorical {
	pub(crate) fn new(api_key: &str) -> Self {
		let historical_client = HistoricalClient::builder()
			.key(api_key)
			.unwrap()
			.build()
			.unwrap();

		Self { historical_client }
	}

	pub(crate) async fn available_end(&mut self) -> Result<UtcDateTime, databento::Error> {
		let dataset_range = self
			.historical_client
			.metadata()
			.get_dataset_range(Dataset::GlbxMdp3)
			.await?;

		Ok(dataset_range.start.to_utc())
	}

	/// utc_date_time_range: inclusive start, exclusive end
	pub(crate) async fn stream(
		&mut self,
		instrument_ticker: &InstrumentTicker,
		utc_date_time_range: Range<UtcDateTime>,
	) -> Result<AsyncDbnDecoder<impl AsyncReadExt>, databento::Error> {
		let (symbol, stype) = instrument_ticker.symbol();

		let get_range_params = GetRangeParams::builder()
			.dataset(Dataset::GlbxMdp3)
			.symbols([symbol.as_str()])
			.schema(Schema::Trades)
			.stype_in(stype)
			.date_time_range((
				utc_date_time_range
					.start
					.to_offset(UtcOffset::UTC),
				utc_date_time_range
					.end
					.to_offset(UtcOffset::UTC),
			))
			.build();

		self.historical_client
			.timeseries()
			.get_range(&get_range_params)
			.await
	}
}