修复迟到成交和换股批次的FIFO与持有期

This commit is contained in:
boris
2026-09-14 19:15:01 +08:00
parent b2eaaa0d26
commit e9c9ecbd48
5 changed files with 536 additions and 0 deletions
+13
View File
@@ -157,6 +157,8 @@ impl Position {
);
if previous_quantity == 0 {
self.opened_date = Some(date);
} else if let Some(opened) = self.opened_date {
self.opened_date = Some(opened.min(date));
}
let previous_average_price = self.average_price;
let previous_average_cost = self.average_cost;
@@ -232,6 +234,17 @@ impl Position {
));
}
// A delayed receipt or a successor conversion can append an older
// acquisition after a newer lot. Deplete by actual acquisition date;
// stable ordering preserves same-day receipts and their attached fees.
if quantity > 0
&& self
.lots
.windows(2)
.any(|pair| pair[0].acquired_date > pair[1].acquired_date)
{
self.lots.sort_by_key(|lot| lot.acquired_date);
}
let mut remaining = quantity;
let mut remaining_proceeds = total_proceeds;
let mut realized = FixedMoney::ZERO;