Improve callback handling on order complete

This commit is contained in:
Jacob Plaster
2018-12-14 16:02:00 +00:00
parent 2b1912e6a7
commit c1aea594a8

View File

@@ -29,16 +29,17 @@ class OrderManager:
manages the local list of open orders. manages the local list of open orders.
""" """
if order.cId in self.pending_orders: if order.cId in self.pending_orders:
if self.pending_callbacks[order.cId][0]: await self._execute_confirm_callback(order.cId, order)
# call onConfirm callback if isClosed:
await self.pending_callbacks[order.cId][0](order) await self._execute_close_callback(order.cId, order)
if isClosed:
await self.pending_callbacks[order.cId][1](order)
del self.pending_callbacks[order.cId]
order.set_confirmed() order.set_confirmed()
# remove from pending orders list # remove from pending orders list
del self.pending_orders[order.cId] del self.pending_orders[order.cId]
self.bfxapi._emit('order_confirmed', order) self.bfxapi._emit('order_confirmed', order)
else:
await self._execute_confirm_callback(order.id, order)
if isClosed:
await self._execute_close_callback(order.id, order)
async def confirm_order_closed(self, raw_ws_data): async def confirm_order_closed(self, raw_ws_data):
# order created and executed # order created and executed
@@ -55,13 +56,17 @@ class OrderManager:
self.bfxapi._emit('order_closed', order) self.bfxapi._emit('order_closed', order)
async def build_from_order_snapshot(self, raw_ws_data): async def build_from_order_snapshot(self, raw_ws_data):
print (raw_ws_data)
#[0, 'os', [[1151363978, None, 1544460962979, 'tBTCUSD', 1544460959604, 1544460959626,
# -0.12620639, -0.12620639, 'EXCHANGE LIMIT', None, None,None, 0, 'ACTIVE', None, None, 18793,
# 0, 0, 0, None, None, None, 0, 0, None, None, None, 'API>BFX', None, None, None]]]
''' '''
Rebuild the user orderbook based on an incoming snapshot Rebuild the user orderbook based on an incoming snapshot
''' '''
osData = raw_ws_data[2] osData = raw_ws_data[2]
self.open_orders = {} self.open_orders = {}
for raw_order in osData: for raw_order in osData:
order = Order.from_raw_order(raw_ws_data[2]) order = Order.from_raw_order(raw_order)
order.set_open_state(True) order.set_open_state(True)
self.open_orders[order.id] = order self.open_orders[order.id] = order
self.bfxapi._emit('order_snapshot', self.get_open_orders()) self.bfxapi._emit('order_snapshot', self.get_open_orders())
@@ -148,7 +153,7 @@ class OrderManager:
payload['tif'] = time_in_force payload['tif'] = time_in_force
# submit the order # submit the order
self.pending_orders[cId] = payload self.pending_orders[cId] = payload
self.pending_callbacks[cId] = (onConfirm, onClose) self._create_callback(cId, onConfirm=onConfirm, onClose=onClose)
await self.bfxapi._send_auth_command('on', payload) await self.bfxapi._send_auth_command('on', payload)
self.logger.info("Order cid={} ({} {} @ {}) dispatched".format( self.logger.info("Order cid={} ({} {} @ {}) dispatched".format(
cId, symbol, amount, price)) cId, symbol, amount, price))
@@ -178,7 +183,7 @@ class OrderManager:
was closed due to being filled or cancelled was closed due to being filled or cancelled
""" """
order = self.open_orders[orderId] order = self.open_orders[orderId]
self.pending_callbacks[order.cId] = (onConfirm, onClose) self._create_callback(order.cId, onConfirm=onConfirm, onClose=onClose)
payload = { "id": orderId } payload = { "id": orderId }
if price is not None: if price is not None:
payload['price'] = str(price) payload['price'] = str(price)
@@ -207,8 +212,8 @@ class OrderManager:
@param onClose: function called when the bitfinex websocket receives signal that the order @param onClose: function called when the bitfinex websocket receives signal that the order
was closed due to being filled or cancelled was closed due to being filled or cancelled
""" """
order = self.open_orders[orderId] # order = self.open_orders[orderId]
self.pending_callbacks[order.cId] = (onConfirm, onClose) self._create_callback(orderId, onConfirm=onConfirm, onClose=onClose)
await self.bfxapi._send_auth_command('oc', { 'id': orderId }) await self.bfxapi._send_auth_command('oc', { 'id': orderId })
self.logger.info("Order cancel order_id={} dispatched".format(orderId)) self.logger.info("Order cancel order_id={} dispatched".format(orderId))
@@ -234,6 +239,25 @@ class OrderManager:
] ]
await asyncio.wait(*[ task_batch ]) await asyncio.wait(*[ task_batch ])
def _create_callback(self, order_identifier, onConfirm=None, onClose=None):
if order_identifier in self.pending_callbacks:
self.pending_callbacks[order_identifier] += [(onClose, onConfirm)]
else:
self.pending_callbacks[order_identifier] = [(onClose, onConfirm)]
async def _execute_close_callback(self, order_identifier, *args, **kwargs):
if order_identifier in self.pending_callbacks:
for c in self.pending_callbacks[order_identifier]:
if c[0]:
await c[0](*args, **kwargs)
del self.pending_callbacks[order_identifier]
async def _execute_confirm_callback(self, order_identifier, *args, **kwargs):
if order_identifier in self.pending_callbacks:
for c in self.pending_callbacks[order_identifier]:
if c[1]:
await c[1](*args, **kwargs)
def _calculate_flags(self, hidden, close, reduce_only, post_only, oco): def _calculate_flags(self, hidden, close, reduce_only, post_only, oco):
flags = 0 flags = 0
flags = flags + Order.Flags.HIDDEN if hidden else flags flags = flags + Order.Flags.HIDDEN if hidden else flags