补充指定决策日调度测试策略
This commit is contained in:
@@ -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<ScheduleRule> {
|
||||||
|
vec![self.rule.clone()]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_scheduled(
|
||||||
|
&mut self,
|
||||||
|
ctx: &StrategyContext<'_>,
|
||||||
|
rule: &ScheduleRule,
|
||||||
|
) -> Result<StrategyDecision, super::BacktestError> {
|
||||||
|
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)]
|
#[derive(Debug)]
|
||||||
struct ScheduledEligibleUniverseBuyStrategy {
|
struct ScheduledEligibleUniverseBuyStrategy {
|
||||||
rule: ScheduleRule,
|
rule: ScheduleRule,
|
||||||
@@ -4915,9 +4950,9 @@ mod tests {
|
|||||||
|
|
||||||
let result = BacktestEngine::new(
|
let result = BacktestEngine::new(
|
||||||
dataset,
|
dataset,
|
||||||
ScheduledBuyStrategy {
|
ScheduledBuyOnDecisionDateStrategy {
|
||||||
rule: ScheduleRule::daily("daily_open_signal", ScheduleStage::OpenAuction),
|
rule: ScheduleRule::daily("daily_open_signal", ScheduleStage::OpenAuction),
|
||||||
expected_decision_date: second,
|
decision_date: second,
|
||||||
},
|
},
|
||||||
broker,
|
broker,
|
||||||
config,
|
config,
|
||||||
|
|||||||
Reference in New Issue
Block a user