WIP: use `userref` field over `reqid`...
							parent
							
								
									808dbb12e6
								
							
						
					
					
						commit
						dc8072c6db
					
				|  | @ -31,6 +31,7 @@ import time | |||
| from typing import ( | ||||
|     Any, | ||||
|     AsyncIterator, | ||||
|     Optional, | ||||
|     Union, | ||||
| ) | ||||
| 
 | ||||
|  | @ -188,10 +189,10 @@ async def handle_order_requests( | |||
|                     'event': ep, | ||||
|                     'token': token, | ||||
| 
 | ||||
|                     # XXX: this seems to always get an error response? | ||||
|                     # 'userref': f"'{reqid}'", | ||||
|                     # XXX: Lol, you can only send one of these.. | ||||
|                     'userref': str(reqid), | ||||
|                     # 'reqid': reqid,  # remapped-to-int uid from ems | ||||
| 
 | ||||
|                     'reqid': reqid,  # remapped-to-int uid from ems | ||||
|                     'pair': pair, | ||||
|                     'price': str(order.price), | ||||
|                     'volume': str(order.size), | ||||
|  | @ -601,7 +602,8 @@ async def handle_order_updates( | |||
| 
 | ||||
|                 # format as tid -> trade event map | ||||
|                 # eg. received msg format, | ||||
|                 # [{'TOKWHY-SMTUB-G5DOI6': {'cost': '95.29047', | ||||
|                 # [{'TOKWHY-SMTUB-G5DOI6': { | ||||
|                 #           'cost': '95.29047', | ||||
|                 #           'fee': '0.24776', | ||||
|                 #           'margin': '0.00000', | ||||
|                 #           'ordertxid': 'OKSUXM-3OLSB-L7TN72', | ||||
|  | @ -611,7 +613,8 @@ async def handle_order_updates( | |||
|                 #           'price': '21268.20000', | ||||
|                 #           'time': '1657990947.640891', | ||||
|                 #           'type': 'buy', | ||||
|                 #           'vol': '0.00448042'}}] | ||||
|                 #           'vol': '0.00448042' | ||||
|                 # }}] | ||||
|                 trades = { | ||||
|                     tid: trade | ||||
|                     for entry in trades_msgs | ||||
|  | @ -622,12 +625,14 @@ async def handle_order_updates( | |||
|                 } | ||||
|                 for tid, trade in trades.items(): | ||||
|                     txid = trade['ordertxid'] | ||||
|                     reqid = trade.get('userref') | ||||
| 
 | ||||
|                     # NOTE: yet again, here we don't have any ref to the | ||||
|                     # reqid that's generated by us (as the client) and | ||||
|                     # sent in the order request, so we have to look it | ||||
|                     # up from our own registry... | ||||
|                     reqid = reqids2txids.inverse[txid] | ||||
|                     if not reqid: | ||||
|                         # NOTE: yet again, here we don't have any ref to the | ||||
|                         # reqid that's generated by us (as the client) and | ||||
|                         # sent in the order request, so we have to look it | ||||
|                         # up from our own registry... | ||||
|                         reqid = reqids2txids.inverse[txid] | ||||
| 
 | ||||
|                     action = trade['type'] | ||||
|                     price = float(trade['price']) | ||||
|  | @ -705,11 +710,11 @@ async def handle_order_updates( | |||
|                         case { | ||||
|                             'cancel_reason': 'Order replaced', | ||||
|                             'status': status, | ||||
|                             # 'userref': reqid,  # XXX: always zero bug XD | ||||
|                             'userref': reqid,  # XXX: always zero bug XD | ||||
|                             # **rest, | ||||
|                         }: | ||||
|                             log.info( | ||||
|                                 f'Order {txid} was replaced' | ||||
|                                 f'Order {txid}@reqid={reqid} was replaced' | ||||
|                             ) | ||||
|                             continue | ||||
| 
 | ||||
|  | @ -768,12 +773,17 @@ async def handle_order_updates( | |||
| 
 | ||||
|                             ourreqid = reqids2txids.inverse.get(txid) | ||||
| 
 | ||||
|                             # XXX: abs necessary in order to enable | ||||
|                             # mapping status response messages to the | ||||
|                             # reqid-dialog.. | ||||
|                             reqids2txids[reqid] = txid | ||||
| 
 | ||||
|                             if ourreqid != reqid: | ||||
|                                 log.warning( | ||||
|                                     'REQID MISMATCH due to kraken api bugs..\n' | ||||
|                                     'REQID MISMATCH due to design mess..\n' | ||||
|                                     f'msg:{reqid}, ours:{ourreqid}' | ||||
|                                 ) | ||||
|                                 reqid = ourreqid | ||||
|                                 # reqid = ourreqid | ||||
| 
 | ||||
|                             oid = ids.inverse.get(reqid) | ||||
| 
 | ||||
|  | @ -901,7 +911,7 @@ async def handle_order_updates( | |||
|             case { | ||||
|                 'event': etype, | ||||
|                 'status': status, | ||||
|                 'reqid': reqid, | ||||
|                 # 'reqid': reqid, | ||||
|                 **rest, | ||||
|             } as event if ( | ||||
|                 etype in { | ||||
|  | @ -914,9 +924,14 @@ async def handle_order_updates( | |||
|                     f'{etype}:\n' | ||||
|                     f'{pformat(msg)}' | ||||
|                 ) | ||||
|                 oid = ids.inverse.get(reqid) | ||||
| 
 | ||||
|                 txid = rest.get('txid') | ||||
|                 reqid = reqids2txids.inverse.get(txid) | ||||
|                 lasttxid = reqids2txids.get(reqid) | ||||
| 
 | ||||
|                 # TODO: relay these to EMS once it supports | ||||
|                 # open order loading. | ||||
|                 oid = ids.inverse.get(reqid) | ||||
|                 if not oid: | ||||
|                     log.warning( | ||||
|                         'Unknown order status update?:\n' | ||||
|  | @ -924,18 +939,17 @@ async def handle_order_updates( | |||
|                     ) | ||||
|                     continue | ||||
| 
 | ||||
|                 lasttxid = reqids2txids.get(reqid) | ||||
|                 txid = rest.get('txid') | ||||
| 
 | ||||
|                 # update the msg chain | ||||
|                 chain = apiflows[reqid] | ||||
|                 chain.maps.append(event) | ||||
|                 if reqid is not None: | ||||
|                     # update the msg chain | ||||
|                     chain = apiflows[reqid] | ||||
|                     chain.maps.append(event) | ||||
| 
 | ||||
|                 resps, errored = process_status( | ||||
|                     event, | ||||
|                     oid, | ||||
|                     token, | ||||
|                     chain, | ||||
|                     reqid=reqid, | ||||
|                 ) | ||||
|                 if resps: | ||||
|                     for resp in resps: | ||||
|  | @ -955,12 +969,13 @@ async def handle_order_updates( | |||
|                             'reqid': reqid or 0, | ||||
|                             'txid': [txid], | ||||
|                         }) | ||||
|                     else: | ||||
| 
 | ||||
|                     # else: | ||||
|                         # XXX: we **must** do this mapping for edit order | ||||
|                         # status updates since the `openOrders` sub above | ||||
|                         # never relays back the correct client-side `reqid` | ||||
|                         # that is put in the order request.. | ||||
|                         reqids2txids[reqid] = txid | ||||
|                         # reqids2txids[reqid] = txid | ||||
| 
 | ||||
|             case _: | ||||
|                 log.warning(f'Unhandled trades update msg: {msg}') | ||||
|  | @ -971,6 +986,7 @@ def process_status( | |||
|     oid: str, | ||||
|     token: str, | ||||
|     chain: ChainMap, | ||||
|     reqid: Optional[int] = None, | ||||
| 
 | ||||
| ) -> tuple[list[MsgUnion], bool]: | ||||
|     ''' | ||||
|  | @ -982,7 +998,7 @@ def process_status( | |||
|         case { | ||||
|             'event': etype, | ||||
|             'status': 'error', | ||||
|             'reqid': reqid, | ||||
|             # 'reqid': reqid, | ||||
|             'errorMessage': errmsg, | ||||
|         }: | ||||
|             # any of ``{'add', 'edit', 'cancel'}`` | ||||
|  | @ -1006,7 +1022,7 @@ def process_status( | |||
|         case { | ||||
|             'event': 'addOrderStatus', | ||||
|             'status': "ok", | ||||
|             'reqid': reqid,  # oid from ems side | ||||
|             # 'reqid': reqid,  # oid from ems side | ||||
|             'txid': txid, | ||||
|             'descr': descr,  # only on success? | ||||
|         }: | ||||
|  | @ -1021,7 +1037,7 @@ def process_status( | |||
|         case { | ||||
|             'event': 'editOrderStatus', | ||||
|             'status': "ok", | ||||
|             'reqid': reqid,  # oid from ems side | ||||
|             # 'reqid': reqid,  # oid from ems side | ||||
|             'descr': descr, | ||||
| 
 | ||||
|             # NOTE: for edit request this is a new value | ||||
|  | @ -1040,7 +1056,7 @@ def process_status( | |||
|         case { | ||||
|             "event": "cancelOrderStatus", | ||||
|             "status": "ok", | ||||
|             'reqid': reqid, | ||||
|             # 'reqid': reqid, | ||||
| 
 | ||||
|             # XXX: sometimes this isn't provided!? | ||||
|             # 'txid': txids, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue