use super::identifiers::ContractId;
use super::money::{CurrencyCode, Money, Quantity};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MarketDataStatus {
Live,
Delayed,
Stale,
Unavailable,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum StalePolicy {
Warn,
Refuse,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MissingTimestampPolicy {
Refuse,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct MarketDataPolicy {
pub max_snapshot_age_seconds: u64,
pub allow_delayed: bool,
pub stale_policy: StalePolicy,
pub missing_timestamp_policy: MissingTimestampPolicy,
}
impl Default for MarketDataPolicy {
fn default() -> Self {
Self {
max_snapshot_age_seconds: 900,
allow_delayed: true,
stale_policy: StalePolicy::Warn,
missing_timestamp_policy: MissingTimestampPolicy::Refuse,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct MarketSnapshot {
pub contract_id: ContractId,
pub bid: Option<Money>,
pub ask: Option<Money>,
pub last: Option<Money>,
pub currency: CurrencyCode,
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub source_timestamp: OffsetDateTime,
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub received_at: OffsetDateTime,
pub data_status: MarketDataStatus,
pub staleness_seconds: u64,
pub warnings: Vec<String>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct HistoricalBarsRequest {
pub contract_id: ContractId,
pub duration: String,
pub bar_size: String,
pub outside_regular_trading_hours: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct HistoricalBar {
#[serde(with = "time::serde::rfc3339")]
#[schemars(with = "String")]
pub timestamp: OffsetDateTime,
pub open: Money,
pub high: Money,
pub low: Money,
pub close: Money,
pub volume: Quantity,
pub currency: CurrencyCode,
}