use crate::prelude::*;
use crate::reporting::FinancialPeriod;
pub struct PriceRange {
pub open: Money,
pub close: Money,
pub high: Money,
pub low: Money,
pub volume: Option<u64>,
}
pub struct QuotePrice {
pub price: Money,
pub change: Option<Money>,
pub percentage: Option<f64>,
}
pub struct QuotePriceDelayed {
pub latest: QuotePrice,
pub delayed_by: u16,
pub high: Money,
pub low: Money,
pub trade_size: Option<u64>,
pub volume: Option<u64>,
pub previous_close_date: Option<DateTime>,
}
pub type DelayedQuote = Snapshot<QuotePriceDelayed>;
#[derive(Debug)]
pub enum QuoteSource {
RealTime,
Delayed,
Close,
PreviousClose,
Unknown,
}
pub struct QuotePriceFull {
pub range: PriceRange,
pub latest: QuotePrice,
pub latest_source: QuoteSource,
pub trade_size: Option<u64>,
pub previous_close_date: Option<DateTime>,
pub extended: Option<QuotePrice>,
}
pub type Quote = Snapshot<QuotePriceFull>;
#[derive(Debug)]
pub enum SeriesInterval {
Day,
FiveDays,
OneMonth,
ThreeMonths,
SixMonths,
YearToDate,
OneYear,
TwoYears,
FiveYears,
}
pub type PriceRangeSeries = Series<SeriesInterval, Snapshot<PriceRange>>;
pub trait FetchPriceQuote {
fn latest_price_only(&self, for_symbol: Symbol) -> RequestResult<Money>;
fn real_time(&self, for_symbol: Symbol) -> RequestResult<Quote>;
fn delayed(&self, for_symbol: Symbol) -> RequestResult<DelayedQuote>;
}
pub trait FetchPriceRangeSeries {
fn intra_day(
&self,
for_symbol: Symbol,
interval_minutes: u8,
) -> RequestResult<Option<PriceRangeSeries>>;
fn last(&self, for_symbol: Symbol, interval: SeriesInterval)
-> RequestResult<PriceRangeSeries>;
fn from(
&self,
for_symbol: Symbol,
start_date: DateTime,
interval: SeriesInterval,
) -> RequestResult<PriceRangeSeries>;
fn for_period(
&self,
for_symbol: Symbol,
period: FinancialPeriod,
) -> RequestResult<PriceRangeSeries>;
}