Expose futures account runtime view

This commit is contained in:
boris
2026-04-23 20:35:32 -07:00
parent 2669350154
commit db4e385308
7 changed files with 191 additions and 9 deletions

View File

@@ -6,9 +6,10 @@ use chrono::{NaiveDate, NaiveDateTime};
use fidc_core::{
BacktestConfig, BacktestEngine, BenchmarkSnapshot, BrokerSimulator, CandidateEligibility,
ChinaAShareCostModel, ChinaEquityRuleHooks, DailyFactorSnapshot, DailyMarketSnapshot, DataSet,
Instrument, IntradayExecutionQuote, OpenOrderView, OrderIntent, OrderSide, OrderStatus,
PortfolioState, PriceField, ProcessEventKind, ScheduleRule, ScheduleStage, ScheduleTimeRule,
Strategy, StrategyContext, StrategyDecision,
FuturesAccountState, FuturesContractSpec, FuturesDirection, Instrument, IntradayExecutionQuote,
OpenOrderView, OrderIntent, OrderSide, OrderStatus, PortfolioState, PriceField,
ProcessEventKind, ScheduleRule, ScheduleStage, ScheduleTimeRule, Strategy, StrategyContext,
StrategyDecision,
};
fn d(year: i32, month: u32, day: u32) -> NaiveDate {
@@ -1330,6 +1331,7 @@ fn strategy_context_exposes_rqalpha_style_account_runtime_view() {
decision_index: 0,
data: &data,
portfolio: &portfolio,
futures_account: None,
open_orders: &open_orders,
dynamic_universe: None,
subscriptions: &subscriptions,
@@ -1358,6 +1360,39 @@ fn strategy_context_exposes_rqalpha_style_account_runtime_view() {
ctx.accounts().keys().cloned().collect::<Vec<_>>(),
vec!["STOCK".to_string()]
);
let spec = FuturesContractSpec::new(300.0, 0.12, 0.14);
let mut futures_account = FuturesAccountState::new(500_000.0);
futures_account.open("IF2501", FuturesDirection::Long, spec, 2, 4000.0, 12.0);
futures_account.mark_price("IF2501", FuturesDirection::Long, 4010.0);
let future_ctx = StrategyContext {
execution_date: date,
decision_date: date,
decision_index: 0,
data: &data,
portfolio: &portfolio,
futures_account: Some(&futures_account),
open_orders: &open_orders,
dynamic_universe: None,
subscriptions: &subscriptions,
process_events: &[],
active_process_event: None,
active_datetime: None,
order_events: &[],
fills: &[],
};
let future_account = future_ctx.future_account().expect("future account");
assert_eq!(future_account.account_type, "FUTURE");
assert!((future_account.starting_cash - 500_000.0).abs() < 1e-6);
assert!((future_account.cash - 211_268.0).abs() < 1e-6);
assert!((future_account.market_value - 2_406_000.0).abs() < 1e-6);
assert!((future_account.total_value - 505_988.0).abs() < 1e-6);
assert!((future_ctx.account_by_type("future").unwrap().cash - 211_268.0).abs() < 1e-6);
assert_eq!(
future_ctx.accounts().keys().cloned().collect::<Vec<_>>(),
vec!["FUTURE".to_string(), "STOCK".to_string()]
);
}
#[test]

View File

@@ -27,6 +27,7 @@ fn strategy_emits_target_weights_and_diagnostics() {
decision_index: 0,
data: &data,
portfolio: &portfolio,
futures_account: None,
open_orders: &[],
dynamic_universe: None,
subscriptions: &subscriptions,
@@ -73,6 +74,7 @@ fn jq_strategy_emits_same_day_decision() {
decision_index: 0,
data: &data,
portfolio: &portfolio,
futures_account: None,
open_orders: &[],
dynamic_universe: None,
subscriptions: &subscriptions,