Skip to content

Commit 79def76

Browse files
committed
Improve execution client debug logging for Polymarket
1 parent c648e2a commit 79def76

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

RELEASES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ None
5151
- Improved Cython-Rust indicator parity for `WilderMovingAverage` (RMA) (#2653), thanks @nicolad
5252
- Improved zero size trade logging for Binance Futures (#2588), thanks @bartolootrit
5353
- Improved error handling on API key authentication errors for Polymarket
54+
- Improved execution client debug logging for Polymarket
5455
- Improved exception on deserializing order from cache database
5556
- Improved `None` condition checks for value types, which now raise a `TypeError` instead of an obscure `AttributeError`
5657
- Implemented remaining Display for orders in Rust (#2614), thanks @nicolad

examples/live/polymarket/polymarket_market_maker.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
passphrase=None, # 'POLYMARKET_PASSPHRASE' env var
112112
instrument_provider=instrument_provider_config,
113113
generate_order_history_from_trades=False,
114+
log_raw_ws_messages=False,
114115
),
115116
},
116117
timeout_connection=60.0,

nautilus_trader/adapters/polymarket/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ class PolymarketExecClientConfig(LiveExecClientConfig, frozen=True):
116116
If True, uses trades history to generate reports for orders which are no longer active.
117117
The Polymarket API only returns active orders and trades.
118118
This feature is experimental and is not currently recommended (leave set to False).
119+
log_raw_ws_messages : bool, default False
120+
If raw websocket messages should be logged with debug level.
121+
Note: there will be a performance penalty parsing the JSON without an efficient msgspec decoder.
119122
120123
"""
121124

@@ -132,3 +135,4 @@ class PolymarketExecClientConfig(LiveExecClientConfig, frozen=True):
132135
retry_delay_initial_ms: PositiveInt | None = None
133136
retry_delay_max_ms: PositiveInt | None = None
134137
generate_order_history_from_trades: bool = False
138+
log_raw_ws_messages: bool = False

nautilus_trader/adapters/polymarket/execution.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# -------------------------------------------------------------------------------------------------
1515

1616
import asyncio
17+
import json
1718
from collections import defaultdict
1819
from collections.abc import Coroutine
1920
from typing import Any
@@ -157,6 +158,7 @@ def __init__(
157158
self._log.info(f"{config.retry_delay_initial_ms=}", LogColor.BLUE)
158159
self._log.info(f"{config.retry_delay_max_ms=}", LogColor.BLUE)
159160
self._log.info(f"{config.generate_order_history_from_trades=}", LogColor.BLUE)
161+
self._log.info(f"{config.log_raw_ws_messages=}", LogColor.BLUE)
160162

161163
account_id = AccountId(f"{name or POLYMARKET_VENUE.value}-001")
162164
self._set_account_id(account_id)
@@ -864,9 +866,13 @@ async def _submit_order(self, command: SubmitOrder) -> None:
864866
await self._retry_manager_pool.release(retry_manager)
865867

866868
def _handle_ws_message(self, raw: bytes) -> None:
867-
# Uncomment for development
868-
# self._log.info(str(json.dumps(msgspec.json.decode(raw), indent=4)), color=LogColor.MAGENTA)
869869
try:
870+
if self._config.log_raw_ws_messages:
871+
self._log.debug(
872+
str(json.dumps(msgspec.json.decode(raw), indent=4)),
873+
color=LogColor.MAGENTA,
874+
)
875+
870876
ws_message = self._decoder_user_msg.decode(raw)
871877
for msg in ws_message:
872878
if isinstance(msg, PolymarketUserOrder):
@@ -928,6 +934,8 @@ async def _wait_for_ack_trade(
928934
self._handle_ws_trade_msg(msg, wait_for_ack=False)
929935

930936
def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
937+
self._log.debug(f"Handling order message, {wait_for_ack=}")
938+
931939
venue_order_id = msg.venue_order_id()
932940
instrument_id = get_polymarket_instrument_id(msg.market, msg.asset_id)
933941
instrument = self._cache.instrument(instrument_id)
@@ -939,6 +947,7 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
939947
return
940948

941949
client_order_id = self._cache.client_order_id(venue_order_id)
950+
self._log.debug(f"Processing order update for {client_order_id!r}")
942951

943952
strategy_id = None
944953
if client_order_id:
@@ -956,6 +965,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
956965

957966
match msg.type:
958967
case PolymarketEventType.PLACEMENT:
968+
self._log.debug(f"PLACEMENT: {client_order_id!r}", LogColor.MAGENTA)
969+
959970
self.generate_order_accepted(
960971
strategy_id=strategy_id,
961972
instrument_id=instrument_id,
@@ -964,6 +975,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
964975
ts_event=self._clock.timestamp_ns(),
965976
)
966977
case PolymarketEventType.CANCELLATION:
978+
self._log.debug(f"CANCELLATION: {client_order_id!r}", LogColor.MAGENTA)
979+
967980
self.generate_order_canceled(
968981
strategy_id=strategy_id,
969982
instrument_id=instrument_id,
@@ -972,6 +985,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
972985
ts_event=millis_to_nanos(int(msg.timestamp)),
973986
)
974987
case PolymarketEventType.UPDATE: # Matched
988+
self._log.debug(f"UPDATE: {client_order_id!r}", LogColor.MAGENTA)
989+
975990
assert msg.associate_trades is not None # Type checking
976991
order = self._cache.order(client_order_id)
977992

@@ -999,6 +1014,7 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
9991014
return
10001015

10011016
if order.is_closed:
1017+
self._log.warning(f"Order already closed - skipping fill: {order}")
10021018
return # Already closed (only status update)
10031019

10041020
matched_qty = instrument.make_qty(float(msg.size_matched))
@@ -1023,6 +1039,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
10231039
)
10241040

10251041
self._loop.create_task(self._update_account_state())
1042+
case _:
1043+
raise RuntimeError(f"Unknown `PolymarketEventType`, was '{msg.type.value}'")
10261044

10271045
def _handle_ws_trade_msg(self, msg: PolymarketUserTrade, wait_for_ack: bool):
10281046
self._log.debug(f"Handling trade message, {wait_for_ack=}")
@@ -1063,6 +1081,7 @@ def _handle_ws_trade_msg(self, msg: PolymarketUserTrade, wait_for_ack: bool):
10631081
order = self._cache.order(client_order_id)
10641082

10651083
if order.is_closed:
1084+
self._log.warning(f"Order already closed - skipping trade: {order}")
10661085
return # Already closed (only status update)
10671086

10681087
last_qty = instrument.make_qty(msg.last_qty(self._wallet_address))

0 commit comments

Comments
 (0)