#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum DateRange {
Day1,
Day5,
#[default]
Month1,
Month3,
Month6,
YTD,
Year1,
Year5,
All,
}
impl DateRange {
pub fn label(&self) -> &'static str {
match self {
DateRange::Day1 => "1D",
DateRange::Day5 => "5D",
DateRange::Month1 => "1M",
DateRange::Month3 => "3M",
DateRange::Month6 => "6M",
DateRange::YTD => "YTD",
DateRange::Year1 => "1Y",
DateRange::Year5 => "5Y",
DateRange::All => "All",
}
}
pub fn tooltip(&self) -> &'static str {
match self {
DateRange::Day1 => "1 day in 1 minute intervals",
DateRange::Day5 => "5 days in 5 minutes intervals",
DateRange::Month1 => "1 month in 30 minutes intervals",
DateRange::Month3 => "3 months in 1 hour intervals",
DateRange::Month6 => "6 months in 2 hours intervals",
DateRange::YTD => "Year to day in 1 day intervals",
DateRange::Year1 => "1 year in 1 day intervals",
DateRange::Year5 => "5 years in 1 week intervals",
DateRange::All => "All data in 1 month intervals",
}
}
pub fn default_presets() -> Vec<DateRange> {
vec![
DateRange::Day1,
DateRange::Day5,
DateRange::Month1,
DateRange::Month3,
DateRange::Month6,
DateRange::YTD,
DateRange::Year1,
DateRange::Year5,
DateRange::All,
]
}
pub fn start_timestamp(&self) -> Option<chrono::DateTime<chrono::Utc>> {
use chrono::{Datelike, Duration, NaiveDate, Utc};
let now = Utc::now();
match self {
DateRange::Day1 => Some(now - Duration::days(1)),
DateRange::Day5 => Some(now - Duration::days(5)),
DateRange::Month1 => Some(now - Duration::days(30)),
DateRange::Month3 => Some(now - Duration::days(90)),
DateRange::Month6 => Some(now - Duration::days(180)),
DateRange::YTD => {
let year_start = NaiveDate::from_ymd_opt(now.year(), 1, 1)?;
Some(chrono::DateTime::from_naive_utc_and_offset(
year_start.and_hms_opt(0, 0, 0)?,
Utc,
))
}
DateRange::Year1 => Some(now - Duration::days(365)),
DateRange::Year5 => Some(now - Duration::days(365 * 5)),
DateRange::All => None,
}
}
pub fn to_timestamps(
&self,
) -> (
Option<chrono::DateTime<chrono::Utc>>,
chrono::DateTime<chrono::Utc>,
) {
(self.start_timestamp(), chrono::Utc::now())
}
pub fn estimated_bars(&self, bar_duration_seconds: u64) -> usize {
let duration_seconds = match self {
DateRange::Day1 => 24 * 3600,
DateRange::Day5 => 5 * 24 * 3600,
DateRange::Month1 => 30 * 24 * 3600,
DateRange::Month3 => 90 * 24 * 3600,
DateRange::Month6 => 180 * 24 * 3600,
DateRange::YTD => {
let now = chrono::Utc::now();
let days_since_year_start = chrono::Datelike::ordinal(&now) as u64;
days_since_year_start * 24 * 3600
}
DateRange::Year1 => 365 * 24 * 3600,
DateRange::Year5 => 5 * 365 * 24 * 3600,
DateRange::All => 10 * 365 * 24 * 3600,
};
(duration_seconds / bar_duration_seconds.max(1)) as usize
}
}
impl std::fmt::Display for DateRange {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.label())
}
}