减少每日诊断文本临时分配

This commit is contained in:
boris
2026-08-26 06:43:36 +08:00
parent 8b246a63f0
commit 670686681d
+44 -19
View File
@@ -1935,14 +1935,14 @@ where
.ok_or(BacktestError::MissingBenchmark { .ok_or(BacktestError::MissingBenchmark {
date: execution_date, date: execution_date,
})?; })?;
let notes = corporate_action_notes.join(" | "); let notes = join_text_parts(corporate_action_notes.into_iter());
let diagnostics = std::iter::once(format!( let diagnostics = join_text_parts(
"decision_lag_warmup lag_days={} execution_index={}", std::iter::once(format!(
self.config.decision_lag_trading_days, execution_idx "decision_lag_warmup lag_days={} execution_index={}",
)) self.config.decision_lag_trading_days, execution_idx
.chain(broker_diagnostics.into_iter()) ))
.collect::<Vec<_>>() .chain(broker_diagnostics.into_iter()),
.join(" | "); );
let holdings_for_day = portfolio.holdings_summary(execution_date); let holdings_for_day = portfolio.holdings_summary(execution_date);
let holding_start = result.daily_holdings.len(); let holding_start = result.daily_holdings.len();
let holding_count = holdings_for_day.len(); let holding_count = holdings_for_day.len();
@@ -3012,17 +3012,17 @@ where
.ok_or(BacktestError::MissingBenchmark { .ok_or(BacktestError::MissingBenchmark {
date: execution_date, date: execution_date,
})?; })?;
let notes = corporate_action_notes let notes = join_text_parts(
.into_iter() corporate_action_notes
.chain(decision.notes.into_iter()) .into_iter()
.collect::<Vec<_>>() .chain(decision.notes.into_iter()),
.join(" | "); );
let diagnostics = decision let diagnostics = join_text_parts(
.diagnostics decision
.into_iter() .diagnostics
.chain(broker_diagnostics.into_iter()) .into_iter()
.collect::<Vec<_>>() .chain(broker_diagnostics.into_iter()),
.join(" | "); );
let holdings_for_day = portfolio.holdings_summary(execution_date); let holdings_for_day = portfolio.holdings_summary(execution_date);
let holding_start = result.daily_holdings.len(); let holding_start = result.daily_holdings.len();
let holding_count = holdings_for_day.len(); let holding_count = holdings_for_day.len();
@@ -4303,6 +4303,22 @@ fn futures_limit_satisfied(side: OrderSide, price: f64, limit_price: Option<f64>
} }
} }
fn join_text_parts<I>(parts: I) -> String
where
I: IntoIterator<Item = String>,
{
let mut iterator = parts.into_iter();
let Some(first) = iterator.next() else {
return String::new();
};
let mut result = first;
for part in iterator {
result.push_str(" | ");
result.push_str(&part);
}
result
}
fn futures_cancel_report( fn futures_cancel_report(
date: NaiveDate, date: NaiveDate,
order: FuturesOpenOrder, order: FuturesOpenOrder,
@@ -4392,6 +4408,15 @@ mod tests {
const SYMBOL: &str = "000001.SZ"; const SYMBOL: &str = "000001.SZ";
#[test]
fn join_text_parts_matches_vec_join_contract() {
assert_eq!(super::join_text_parts(Vec::<String>::new()), "");
assert_eq!(
super::join_text_parts(vec!["a".to_string(), "".to_string(), "c".to_string()]),
"a | | c"
);
}
#[derive(Debug)] #[derive(Debug)]
struct BuyWhenDecisionDateStrategy { struct BuyWhenDecisionDateStrategy {
decision_date: NaiveDate, decision_date: NaiveDate,