fix: persist uncertain cancel outcomes

This commit is contained in:
jordan
2026-07-29 17:17:14 +09:00
parent a656350a35
commit 3dd8eefc92
21 changed files with 416 additions and 76 deletions
+26 -5
View File
@@ -24,6 +24,8 @@ import httpx
from trex_core.application.broker_port import (
BalanceItem,
BrokerBalanceError,
CancelOutcome,
CancelState,
FillStatus,
OrderAck,
OrderRequest,
@@ -756,7 +758,7 @@ class KISBroker:
def cancel_order(
self, broker_order_id: str, *, side: str, symbol: str, qty: int, venue: str = "KRX"
) -> bool:
) -> CancelOutcome:
"""Cancel a previously submitted order (REQ-118).
venue: exchange venue of the original order. Must match the EXCG_ID_DVSN_CD
@@ -764,7 +766,10 @@ class KISBroker:
Real-account NXT cancel (EXCG=NXT) confirmed rt_cd=0 on 2026-07-06.
"""
if broker_order_id.startswith(_SUBMISSION_UNKNOWN_PREFIX):
return False
return CancelOutcome(
CancelState.UNKNOWN,
"submission_outcome_unknown",
)
cano, product = self._account()
parts = broker_order_id.split(":")
orgno, odno = (parts[0], parts[1]) if len(parts) == 2 else ("", parts[-1])
@@ -789,6 +794,22 @@ class KISBroker:
json=body,
timeout=self._timeout,
)
return str(resp.json().get("rt_cd")) == "0"
except (httpx.HTTPError, ValueError):
return False
except httpx.HTTPError:
return CancelOutcome(CancelState.UNKNOWN, "transport_failed")
if getattr(resp, "status_code", 200) >= 500:
return CancelOutcome(CancelState.UNKNOWN, "broker_unavailable")
try:
payload = resp.json()
except ValueError:
return CancelOutcome(CancelState.UNKNOWN, "malformed_response")
rt_cd = payload.get("rt_cd")
if str(rt_cd) == "0":
return CancelOutcome(CancelState.REQUESTED)
if rt_cd is None:
if getattr(resp, "status_code", 200) >= 400:
return CancelOutcome(CancelState.REJECTED, "http_rejected")
return CancelOutcome(CancelState.UNKNOWN, "missing_result_code")
return CancelOutcome(
CancelState.REJECTED,
str(payload.get("msg_cd") or "broker_rejected"),
)