修复迟到成交和换股批次的FIFO与持有期
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user