From 8ed2b0df7f431685a10152438584b832a5d32e9e Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 5 Jul 2026 09:36:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8C=87=E5=AE=9A=E5=86=B3?= =?UTF-8?q?=E7=AD=96=E6=97=A5=E8=B0=83=E5=BA=A6=E6=B5=8B=E8=AF=95=E7=AD=96?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/fidc-core/src/engine.rs | 39 ++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) 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,