14
14
# -------------------------------------------------------------------------------------------------
15
15
16
16
import asyncio
17
+ import json
17
18
from collections import defaultdict
18
19
from collections .abc import Coroutine
19
20
from typing import Any
@@ -157,6 +158,7 @@ def __init__(
157
158
self ._log .info (f"{ config .retry_delay_initial_ms = } " , LogColor .BLUE )
158
159
self ._log .info (f"{ config .retry_delay_max_ms = } " , LogColor .BLUE )
159
160
self ._log .info (f"{ config .generate_order_history_from_trades = } " , LogColor .BLUE )
161
+ self ._log .info (f"{ config .log_raw_ws_messages = } " , LogColor .BLUE )
160
162
161
163
account_id = AccountId (f"{ name or POLYMARKET_VENUE .value } -001" )
162
164
self ._set_account_id (account_id )
@@ -864,9 +866,13 @@ async def _submit_order(self, command: SubmitOrder) -> None:
864
866
await self ._retry_manager_pool .release (retry_manager )
865
867
866
868
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)
869
869
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
+
870
876
ws_message = self ._decoder_user_msg .decode (raw )
871
877
for msg in ws_message :
872
878
if isinstance (msg , PolymarketUserOrder ):
@@ -928,6 +934,8 @@ async def _wait_for_ack_trade(
928
934
self ._handle_ws_trade_msg (msg , wait_for_ack = False )
929
935
930
936
def _handle_ws_order_msg (self , msg : PolymarketUserOrder , wait_for_ack : bool ):
937
+ self ._log .debug (f"Handling order message, { wait_for_ack = } " )
938
+
931
939
venue_order_id = msg .venue_order_id ()
932
940
instrument_id = get_polymarket_instrument_id (msg .market , msg .asset_id )
933
941
instrument = self ._cache .instrument (instrument_id )
@@ -939,6 +947,7 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
939
947
return
940
948
941
949
client_order_id = self ._cache .client_order_id (venue_order_id )
950
+ self ._log .debug (f"Processing order update for { client_order_id !r} " )
942
951
943
952
strategy_id = None
944
953
if client_order_id :
@@ -956,6 +965,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
956
965
957
966
match msg .type :
958
967
case PolymarketEventType .PLACEMENT :
968
+ self ._log .debug (f"PLACEMENT: { client_order_id !r} " , LogColor .MAGENTA )
969
+
959
970
self .generate_order_accepted (
960
971
strategy_id = strategy_id ,
961
972
instrument_id = instrument_id ,
@@ -964,6 +975,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
964
975
ts_event = self ._clock .timestamp_ns (),
965
976
)
966
977
case PolymarketEventType .CANCELLATION :
978
+ self ._log .debug (f"CANCELLATION: { client_order_id !r} " , LogColor .MAGENTA )
979
+
967
980
self .generate_order_canceled (
968
981
strategy_id = strategy_id ,
969
982
instrument_id = instrument_id ,
@@ -972,6 +985,8 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
972
985
ts_event = millis_to_nanos (int (msg .timestamp )),
973
986
)
974
987
case PolymarketEventType .UPDATE : # Matched
988
+ self ._log .debug (f"UPDATE: { client_order_id !r} " , LogColor .MAGENTA )
989
+
975
990
assert msg .associate_trades is not None # Type checking
976
991
order = self ._cache .order (client_order_id )
977
992
@@ -999,6 +1014,7 @@ def _handle_ws_order_msg(self, msg: PolymarketUserOrder, wait_for_ack: bool):
999
1014
return
1000
1015
1001
1016
if order .is_closed :
1017
+ self ._log .warning (f"Order already closed - skipping fill: { order } " )
1002
1018
return # Already closed (only status update)
1003
1019
1004
1020
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):
1023
1039
)
1024
1040
1025
1041
self ._loop .create_task (self ._update_account_state ())
1042
+ case _:
1043
+ raise RuntimeError (f"Unknown `PolymarketEventType`, was '{ msg .type .value } '" )
1026
1044
1027
1045
def _handle_ws_trade_msg (self , msg : PolymarketUserTrade , wait_for_ack : bool ):
1028
1046
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):
1063
1081
order = self ._cache .order (client_order_id )
1064
1082
1065
1083
if order .is_closed :
1084
+ self ._log .warning (f"Order already closed - skipping trade: { order } " )
1066
1085
return # Already closed (only status update)
1067
1086
1068
1087
last_qty = instrument .make_qty (msg .last_qty (self ._wallet_address ))
0 commit comments