diff --git a/application/paper_liquidation_service.py b/application/paper_liquidation_service.py index 347fd75..86651ae 100644 --- a/application/paper_liquidation_service.py +++ b/application/paper_liquidation_service.py @@ -6,6 +6,18 @@ from typing import Any +ACCEPTED_ORDER_STATUSES = { + "PendingSubmit", + "ApiPending", + "ApiPendingSubmit", + "Submitted", + "PreSubmitted", + "Filled", + "PartiallyFilled", + "Partial", +} + + def _position_symbol(position: Any, *, fallback: str | None = None) -> str: if isinstance(position, dict): return str(position.get("symbol") or fallback or "").strip().upper() @@ -88,7 +100,7 @@ def execute_paper_liquidation( report = submit_order_intent(ib, intent) payload = _report_to_dict(report) status = str(payload.get("status") or "") - if status in {"Submitted", "PreSubmitted", "Filled", "PartiallyFilled", "Partial"}: + if status in ACCEPTED_ORDER_STATUSES: summary["orders_submitted"].append(payload) else: summary["orders_skipped"].append({**payload, "reason": status or "submit_failed"}) diff --git a/tests/test_paper_liquidation_service.py b/tests/test_paper_liquidation_service.py index 8ce8939..b0c17da 100644 --- a/tests/test_paper_liquidation_service.py +++ b/tests/test_paper_liquidation_service.py @@ -90,3 +90,26 @@ def submit(_ib, intent): assert [(intent.symbol, intent.side, intent.quantity) for intent in submitted] == [("AAPL", "sell", 3)] assert summary["execution_status"] == "submitted" assert summary["orders_submitted"][0]["symbol"] == "AAPL" + + +def test_execute_paper_liquidation_treats_pending_submit_as_submitted(): + def submit(_ib, intent): + return SimpleNamespace( + symbol=intent.symbol, + side=intent.side, + quantity=intent.quantity, + status="PendingSubmit", + broker_order_id="1", + ) + + summary = execute_paper_liquidation( + object(), + {"AAPL": {"symbol": "AAPL", "quantity": 3}}, + submit_order_intent=submit, + order_intent_cls=OrderIntent, + dry_run_only=False, + ) + + assert summary["execution_status"] == "submitted" + assert summary["orders_submitted"][0]["status"] == "PendingSubmit" + assert summary["orders_skipped"] == []