通过实际登记链路构造待交付股份回归
This commit is contained in:
@@ -10758,14 +10758,16 @@ mod tests {
|
||||
Vec::new(), Vec::new(),
|
||||
).unwrap();
|
||||
let mut portfolio = PortfolioState::new(20_000.0);
|
||||
portfolio.position_mut("000001.SZ").buy(date.pred_opt().unwrap(), 1_000, 10.0);
|
||||
portfolio.apply_cash_delta(-10_000.0).unwrap();
|
||||
// Isolated broker fixture: these shares are an asset, but not delivered stock.
|
||||
portfolio.position_mut("000001.SZ").share_receivables.push(crate::portfolio::ShareReceivable {
|
||||
ex_date: date, record_date: date.pred_opt().unwrap(),
|
||||
effective_date: date.succ_opt().unwrap(), quantity: 500,
|
||||
holding_origin_date: date.pred_opt().unwrap(),
|
||||
});
|
||||
portfolio.position_mut("000001.SZ").buy(date.pred_opt().unwrap(), 1_000, 15.0);
|
||||
portfolio.apply_cash_delta(-15_000.0).unwrap();
|
||||
portfolio.record_closing_holdings(date.pred_opt().unwrap()).unwrap();
|
||||
portfolio.register_share_entitlement(&crate::CorporateAction {
|
||||
date, symbol: "000001.SZ".into(), record_date: date.pred_opt(),
|
||||
share_effective_date: date.succ_opt(), share_rounding_rule: None,
|
||||
payable_date: None, share_cash: 0.0, share_bonus: 0.5, share_gift: 0.0,
|
||||
issue_quantity: 0.0, issue_price: 0.0, reform: false, adjust_factor: None,
|
||||
successor_symbol: None, successor_ratio: None, successor_cash: None,
|
||||
}, Some(10.0)).unwrap();
|
||||
let mut report = BrokerExecutionReport::default();
|
||||
broker.process_target_value(date, &mut portfolio, &data, "000001.SZ", 15_000.0,
|
||||
"registered shares already meet target value", &mut BTreeMap::new(),
|
||||
@@ -10779,7 +10781,7 @@ mod tests {
|
||||
&mut IntradayExecutionLedger::default(), &mut None, &mut BTreeMap::new(), &mut report).unwrap();
|
||||
assert!(report.order_events.is_empty());
|
||||
assert!(report.fill_events.is_empty());
|
||||
assert_eq!(portfolio.cash(), 10_000.0);
|
||||
assert_eq!(portfolio.cash(), 5_000.0);
|
||||
let position = portfolio.position("000001.SZ").unwrap();
|
||||
assert_eq!(position.quantity, 1_000);
|
||||
assert_eq!(position.share_receivable_quantity(), 500);
|
||||
|
||||
Reference in New Issue
Block a user