use rotala::clock::{DateTime, Weekday};
pub trait TradingSchedule {
fn should_trade(date: &DateTime) -> bool;
}
pub struct DefaultTradingSchedule;
impl TradingSchedule for DefaultTradingSchedule {
fn should_trade(_date: &DateTime) -> bool {
true
}
}
pub struct LastBusinessDayTradingSchedule;
impl TradingSchedule for LastBusinessDayTradingSchedule {
fn should_trade(date: &DateTime) -> bool {
if (*date).day() < (28 - 7) {
return false;
}
match (*date).weekday() {
Weekday::Saturday | Weekday::Sunday => {
return false;
}
_ => (),
}
for i in 1..4 {
let seconds_in_day = 86400;
let offset_time = DateTime::from(**date + (i * seconds_in_day));
match offset_time.weekday() {
Weekday::Saturday | Weekday::Sunday => continue,
_ => {
if offset_time.month() as u8 == (*date).month() as u8 {
return false;
} else {
continue;
}
}
}
}
true
}
}
#[cfg(test)]
mod tests {
use super::{LastBusinessDayTradingSchedule, TradingSchedule};
#[test]
fn test_that_schedule_returns_true_for_last_day_of_month() {
assert!(LastBusinessDayTradingSchedule::should_trade(
&1633021200.into()
));
assert!(LastBusinessDayTradingSchedule::should_trade(
&1635526800.into()
));
}
#[test]
fn test_that_schedule_returns_false_for_non_last_day_of_month() {
assert!(!LastBusinessDayTradingSchedule::should_trade(
&1635757200.into()
));
assert!(!LastBusinessDayTradingSchedule::should_trade(
&1636736400.into()
));
assert!(!LastBusinessDayTradingSchedule::should_trade(
&1635670800.into()
));
assert!(!LastBusinessDayTradingSchedule::should_trade(
&1611306000.into()
));
}
}