Expose futures account runtime view
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user