分离过程事件分发与结果保留
This commit is contained in:
@@ -71,6 +71,23 @@ impl Default for FuturesValidationConfig {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum ProcessEventRetention {
|
||||
/// Retain every phase and business event in the returned result.
|
||||
All,
|
||||
/// Retain only lifecycle events useful for a durable business audit.
|
||||
Business,
|
||||
/// Dispatch events to listeners and the strategy, but do not retain them
|
||||
/// in the returned result.
|
||||
None,
|
||||
}
|
||||
|
||||
impl Default for ProcessEventRetention {
|
||||
fn default() -> Self {
|
||||
Self::All
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DailyEquityPoint {
|
||||
#[serde(with = "date_format")]
|
||||
@@ -425,6 +442,7 @@ pub struct BacktestEngine<S, C, R> {
|
||||
cash_dividends_enabled: bool,
|
||||
cash_dividend_adjusts_cost_basis: bool,
|
||||
process_event_bus: ProcessEventBus,
|
||||
process_event_retention: ProcessEventRetention,
|
||||
dynamic_universe: Option<BTreeSet<String>>,
|
||||
subscriptions: BTreeSet<String>,
|
||||
futures_account: Option<FuturesAccountState>,
|
||||
@@ -455,6 +473,7 @@ impl<S, C, R> BacktestEngine<S, C, R> {
|
||||
cash_dividends_enabled: true,
|
||||
cash_dividend_adjusts_cost_basis: true,
|
||||
process_event_bus: ProcessEventBus::new(),
|
||||
process_event_retention: ProcessEventRetention::All,
|
||||
dynamic_universe: None,
|
||||
subscriptions: BTreeSet::new(),
|
||||
futures_account: None,
|
||||
@@ -488,6 +507,11 @@ impl<S, C, R> BacktestEngine<S, C, R> {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn with_process_event_retention(mut self, retention: ProcessEventRetention) -> Self {
|
||||
self.process_event_retention = retention;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn with_cash_dividends(mut self, enabled: bool) -> Self {
|
||||
self.cash_dividends_enabled = enabled;
|
||||
self
|
||||
@@ -2118,7 +2142,7 @@ where
|
||||
let holding_count = holdings_for_day.len();
|
||||
result.daily_holdings.extend(holdings_for_day);
|
||||
let progress_process_start = result.process_events.len();
|
||||
result.process_events.append(&mut process_events);
|
||||
self.retain_process_events(&mut result.process_events, &mut process_events);
|
||||
let aggregate_cash = self.aggregate_cash(&portfolio);
|
||||
let aggregate_market_value = self.aggregate_market_value(&portfolio);
|
||||
let aggregate_total_equity = self.aggregate_total_equity(&portfolio);
|
||||
@@ -3193,7 +3217,7 @@ where
|
||||
let holding_count = holdings_for_day.len();
|
||||
result.daily_holdings.extend(holdings_for_day);
|
||||
let progress_process_start = result.process_events.len();
|
||||
result.process_events.append(&mut process_events);
|
||||
self.retain_process_events(&mut result.process_events, &mut process_events);
|
||||
let aggregate_cash = self.aggregate_cash(&portfolio);
|
||||
let aggregate_market_value = self.aggregate_market_value(&portfolio);
|
||||
let aggregate_total_equity = self.aggregate_total_equity(&portfolio);
|
||||
@@ -3280,7 +3304,23 @@ where
|
||||
result.fills.append(&mut report.fill_events);
|
||||
result.position_events.append(&mut report.position_events);
|
||||
result.account_events.append(&mut report.account_events);
|
||||
result.process_events.append(&mut report.process_events);
|
||||
self.retain_process_events(&mut result.process_events, &mut report.process_events);
|
||||
}
|
||||
|
||||
fn retain_process_events(
|
||||
&self,
|
||||
target: &mut Vec<ProcessEvent>,
|
||||
incoming: &mut Vec<ProcessEvent>,
|
||||
) {
|
||||
match self.process_event_retention {
|
||||
ProcessEventRetention::All => target.append(incoming),
|
||||
ProcessEventRetention::Business => target.extend(
|
||||
incoming
|
||||
.drain(..)
|
||||
.filter(|event| event.kind.is_business_lifecycle()),
|
||||
),
|
||||
ProcessEventRetention::None => incoming.clear(),
|
||||
}
|
||||
}
|
||||
|
||||
fn apply_corporate_actions(
|
||||
|
||||
Reference in New Issue
Block a user