apple-quant-algorithmic 0.3.0

Apple Quant's algorithmic library.
use std::range::Range;

use databento::{
	dbn::{decode::AsyncDbnDecoder, Dataset, Schema},
	historical::timeseries::GetRangeParams, HistoricalClient,
};

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
	}
}