Skip to content

Commit 69f9c3a

Browse files
committed
Improve external order handling for OKX and Coinbase Intx
1 parent ad37d24 commit 69f9c3a

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

nautilus_trader/adapters/coinbase_intx/execution.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
from nautilus_trader.model.functions import time_in_force_to_pyo3
5858
from nautilus_trader.model.identifiers import AccountId
5959
from nautilus_trader.model.identifiers import ClientId
60+
from nautilus_trader.model.identifiers import ClientOrderId
6061
from nautilus_trader.model.identifiers import VenueOrderId
6162
from nautilus_trader.model.orders import LimitOrder
6263
from nautilus_trader.model.orders import MarketOrder
@@ -618,6 +619,9 @@ async def _submit_stop_limit_order(
618619
reduce_only=order.is_reduce_only if order.is_reduce_only else None,
619620
)
620621

622+
def _is_external_order(self, client_order_id: ClientOrderId) -> bool:
623+
return not client_order_id or not self._cache.strategy_id_for_order(client_order_id)
624+
621625
def _handle_msg(self, msg: Any) -> None: # noqa: C901 (too complex)
622626
# Note: These FIX execution reports are using a default precision of 8 for now,
623627
# this avoids the need to track a separate cache down in Rust. Ensure all price
@@ -626,8 +630,9 @@ def _handle_msg(self, msg: Any) -> None: # noqa: C901 (too complex)
626630

627631
if isinstance(msg, nautilus_pyo3.OrderStatusReport):
628632
report = OrderStatusReport.from_pyo3(msg)
629-
if report.order_status is None:
630-
self._log.warning(f"No ClientOrderId to process {report}")
633+
634+
if self._is_external_order(report.client_order_id):
635+
self._send_order_status_report(report)
631636
return
632637

633638
order = self._cache.order(report.client_order_id)
@@ -686,8 +691,9 @@ def _handle_msg(self, msg: Any) -> None: # noqa: C901 (too complex)
686691
self._log.warning(f"Received unhandled execution report {report}")
687692
elif isinstance(msg, nautilus_pyo3.FillReport):
688693
report = FillReport.from_pyo3(msg)
689-
if report.client_order_id is None:
690-
self._log.warning(f"No ClientOrderId to process {report}")
694+
695+
if self._is_external_order(report.client_order_id):
696+
self._send_order_status_report(report)
691697
return
692698

693699
order = self._cache.order(report.client_order_id)

nautilus_trader/adapters/okx/execution.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
from nautilus_trader.model.functions import order_type_to_pyo3
5555
from nautilus_trader.model.identifiers import AccountId
5656
from nautilus_trader.model.identifiers import ClientId
57+
from nautilus_trader.model.identifiers import ClientOrderId
5758
from nautilus_trader.model.orders import Order
5859

5960

@@ -601,6 +602,9 @@ async def _submit_order(self, command: SubmitOrder) -> None:
601602

602603
# -- WEBSOCKET HANDLERS -----------------------------------------------------------------------
603604

605+
def _is_external_order(self, client_order_id: ClientOrderId) -> bool:
606+
return not client_order_id or not self._cache.strategy_id_for_order(client_order_id)
607+
604608
def _handle_msg(self, msg: Any) -> None:
605609
if isinstance(msg, nautilus_pyo3.OKXWebSocketError):
606610
self._log.error(repr(msg))
@@ -663,6 +667,10 @@ def _handle_order_modify_rejected_pyo3(
663667
def _handle_order_status_report_pyo3(self, msg: nautilus_pyo3.OrderStatusReport) -> None:
664668
report = OrderStatusReport.from_pyo3(msg)
665669

670+
if self._is_external_order(report.client_order_id):
671+
self._send_order_status_report(report)
672+
return
673+
666674
order = self._cache.order(report.client_order_id)
667675
if order is None:
668676
self._log.error(
@@ -731,8 +739,9 @@ def _handle_fill_report_pyo3(self, msg: nautilus_pyo3.FillReport) -> None:
731739
Handle PyO3 FillReport (both fills channel and order status derived).
732740
"""
733741
report = FillReport.from_pyo3(msg)
734-
if report.client_order_id is None:
735-
self._log.warning(f"No ClientOrderId to process {report}")
742+
743+
if self._is_external_order(report.client_order_id):
744+
self._send_order_status_report(report)
736745
return
737746

738747
order = self._cache.order(report.client_order_id)

0 commit comments

Comments
 (0)