mirror of
https://github.com/aljazceru/bitfinex-api-py.git
synced 2025-12-20 15:24:21 +01:00
Improve callback handling on order complete
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user