减少每日诊断文本临时分配
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user