diff --git a/crates/fidc-core/src/engine.rs b/crates/fidc-core/src/engine.rs index 189275a..a1a6ab5 100644 --- a/crates/fidc-core/src/engine.rs +++ b/crates/fidc-core/src/engine.rs @@ -2952,20 +2952,27 @@ where merge_broker_report(&mut directive_report, futures_daily_settlement_report); let futures_expiration_report = self.settle_futures_expirations(execution_date); merge_broker_report(&mut directive_report, futures_expiration_report); - let dynamic_universe_snapshot = self.dynamic_universe.clone(); - let subscriptions_snapshot = self.subscriptions.clone(); - let management_fee_report = self.apply_management_fee( - execution_date, - decision_date, - decision_index, - &mut portfolio, - &post_close_open_orders, - dynamic_universe_snapshot.as_ref(), - &subscriptions_snapshot, - &mut process_events, - result.order_events.as_slice(), - result.fills.as_slice(), - )?; + let management_fee_report = if portfolio.management_fee_rate() <= 0.0 { + BrokerExecutionReport::default() + } else { + // The strategy context needs an immutable view while the + // engine mutably invokes the strategy. Avoid cloning these + // potentially large sets unless management fees are enabled. + let dynamic_universe_snapshot = self.dynamic_universe.clone(); + let subscriptions_snapshot = self.subscriptions.clone(); + self.apply_management_fee( + execution_date, + decision_date, + decision_index, + &mut portfolio, + &post_close_open_orders, + dynamic_universe_snapshot.as_ref(), + &subscriptions_snapshot, + &mut process_events, + result.order_events.as_slice(), + result.fills.as_slice(), + )? + }; merge_broker_report(&mut directive_report, management_fee_report); publish_phase_event( &mut self.strategy,