diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index 42bb5bb..105f9da 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -4251,6 +4251,41 @@ mod tests { } } + #[derive(Debug)] + struct ScheduledBuyOnDecisionDateStrategy { + rule: ScheduleRule, + decision_date: NaiveDate, + } + + impl Strategy for ScheduledBuyOnDecisionDateStrategy { + fn name(&self) -> &str { + "scheduled_buy_on_decision_date" + } + + fn schedule_rules(&self) -> Vec { + vec![self.rule.clone()] + } + + fn on_scheduled( + &mut self, + ctx: &StrategyContext<'_>, + rule: &ScheduleRule, + ) -> Result { + assert_eq!(rule.name, self.rule.name); + if ctx.decision_date != self.decision_date { + return Ok(StrategyDecision::default()); + } + Ok(StrategyDecision { + order_intents: vec![OrderIntent::Shares { + symbol: SYMBOL.to_string(), + quantity: 100, + reason: "scheduled_decision_date_buy".to_string(), + }], + ..StrategyDecision::default() + }) + } + } + #[derive(Debug)] struct ScheduledEligibleUniverseBuyStrategy { rule: ScheduleRule, @@ -4915,9 +4950,9 @@ mod tests { let result = BacktestEngine::new( dataset, - ScheduledBuyStrategy { + ScheduledBuyOnDecisionDateStrategy { rule: ScheduleRule::daily("daily_open_signal", ScheduleStage::OpenAuction), - expected_decision_date: second, + decision_date: second, }, broker, config,