Wire futures order intents into engine

This commit is contained in:
boris
2026-04-23 20:38:36 -07:00
parent db4e385308
commit 3439b5d8d0
6 changed files with 214 additions and 14 deletions

View File

@@ -12,7 +12,7 @@ use crate::events::{
AccountEvent, FillEvent, OrderEvent, OrderSide, OrderStatus, PositionEvent, ProcessEvent,
ProcessEventKind,
};
use crate::futures::FuturesAccountState;
use crate::futures::{FuturesAccountState, FuturesExecutionReport};
use crate::metrics::{BacktestMetrics, compute_backtest_metrics};
use crate::portfolio::{CashReceivable, HoldingSummary, PortfolioState};
use crate::rules::EquityRuleHooks;
@@ -103,6 +103,7 @@ pub struct BacktestEngine<S, C, R> {
dynamic_universe: Option<BTreeSet<String>>,
subscriptions: BTreeSet<String>,
futures_account: Option<FuturesAccountState>,
next_futures_order_id: u64,
}
impl<S, C, R> BacktestEngine<S, C, R> {
@@ -122,6 +123,7 @@ impl<S, C, R> BacktestEngine<S, C, R> {
dynamic_universe: None,
subscriptions: BTreeSet::new(),
futures_account: None,
next_futures_order_id: 1,
}
}
@@ -454,6 +456,37 @@ where
},
)?;
}
crate::strategy::OrderIntent::Futures { intent } => {
let order_id = self.next_futures_order_id;
self.next_futures_order_id += 1;
let report = if let Some(account) = self.futures_account.as_mut() {
account.execute_order(execution_date, Some(order_id), intent)
} else {
let mut report = FuturesExecutionReport::default();
let side = intent.side();
report.order_events.push(OrderEvent {
date: execution_date,
order_id: Some(order_id),
symbol: intent.symbol,
side,
requested_quantity: intent.quantity,
filled_quantity: 0,
status: OrderStatus::Rejected,
reason: format!(
"{}: futures account is not enabled direction={} effect={}",
intent.reason,
intent.direction.as_str(),
intent.effect.as_str()
),
});
report
};
decision.diagnostics.push(format!(
"futures_order order_id={order_id} events={}",
report.order_events.len()
));
merge_futures_report(directive_report, report);
}
other => retained.push(other),
}
}
@@ -2246,6 +2279,14 @@ fn merge_broker_report(target: &mut BrokerExecutionReport, incoming: BrokerExecu
target.diagnostics.extend(incoming.diagnostics);
}
fn merge_futures_report(target: &mut BrokerExecutionReport, incoming: FuturesExecutionReport) {
target.order_events.extend(incoming.order_events);
target.fill_events.extend(incoming.fill_events);
target.position_events.extend(incoming.position_events);
target.account_events.extend(incoming.account_events);
target.diagnostics.extend(incoming.diagnostics);
}
mod date_format {
use chrono::NaiveDate;
use serde::Serializer;