fix: validate historical trade chain changes

This commit is contained in:
王鹏
2026-07-08 17:36:37 +08:00
parent 6e73e90f99
commit e6794d6e33
2 changed files with 66 additions and 3 deletions

View File

@@ -143,6 +143,15 @@ class TradingService:
return self.save_trade(trade)
def delete_trade(self, trade_id: int) -> None:
trade = self.repository.get_trade(trade_id)
if trade is None:
return
remaining_trades = [
existing
for existing in self.repository.list_trades(account_id=trade.account_id)
if existing.id != trade_id
]
self._validate_trade_chain(remaining_trades)
self.repository.delete_trade(trade_id)
def list_trades(self, *, instrument_id: int | None = None) -> list[Trade]:
@@ -216,15 +225,21 @@ class TradingService:
)
def _validate_resulting_position(self, trade: Trade, existing_trades: list[Trade]) -> None:
self._validate_trade_chain([*existing_trades, trade])
def _validate_trade_chain(self, trades: list[Trade]) -> None:
if not trades:
return
instruments = self.repository.list_instruments()
as_of = max(item.trade_date for item in trades)
try:
calculate_positions(
instruments,
[*existing_trades, trade],
as_of=trade.trade_date,
trades,
as_of=as_of,
)
except CalculationError as exc:
raise ValueError(str(exc)) from exc
raise ValueError(f"后续成交重算失败:{exc}") from exc
def _instrument_cashflows(self, account_id: int) -> dict[int, Decimal]:
totals: dict[int, Decimal] = defaultdict(lambda: Decimal("0"))