From 136773197d1bd6cf13242e4f7ae3acc966dcec9d Mon Sep 17 00:00:00 2001 From: Jacob Plaster Date: Tue, 4 Dec 2018 11:26:36 +0000 Subject: [PATCH] Remove order onComplete and add onConfirma and onClose --- README.md | 8 +++---- .../ws/{candel_order.py => cancel_order.py} | 2 +- bfxapi/examples/ws/send_order.py | 2 +- bfxapi/websockets/OrderManager.py | 22 ++++++++++--------- 4 files changed, 18 insertions(+), 16 deletions(-) rename bfxapi/examples/ws/{candel_order.py => cancel_order.py} (95%) diff --git a/README.md b/README.md index 10d9ad2..4d38965 100644 --- a/README.md +++ b/README.md @@ -148,15 +148,15 @@ The websocket exposes a collection of events that are triggered when certain dat Unsubscribe and subscribe to all data feeds -#### `submit_order(symbol, price, amount, market_type, hidden=False, onComplete=None, onError=None, *args, **kwargs)` +#### `submit_order(symbol, price, amount, market_type, hidden=False, onConfirm=None, onClose=None, *args, **kwargs)` - Submits an order to the Bitfinex api. If the order is successful then the order_closed event will be triggered and the onComplete function will also be called if provided in the parameters. + Submits an order to the Bitfinex api. When it has been verified that bitfine xhas received the order then the `onConfirm` callback will be called followed by the `order_confirmed` event. Once it has been verified that the order has completely closed due to either being filled or canceled then the `onClose` function will be called, followed by the `order_closed` event. -#### `update_order(orderId, price=None, amount=None, delta=None, price_aux_limit=None, price_trailing=None, flags=None, time_in_force=None, onComplete=None, onError=None)` +#### `update_order(orderId, price=None, amount=None, delta=None, price_aux_limit=None, price_trailing=None, flags=None, time_in_force=None, onConfirm=None, onClose=None)` Attempts to update an order with the given values. If the order is no longer open then the update will be ignored. -#### `close_order(self, orderId, onComplete=None, onError=None):` +#### `close_order(self, orderId, onConfirm=None, onClose=None):` Close the order with the given orderId if it still open. diff --git a/bfxapi/examples/ws/candel_order.py b/bfxapi/examples/ws/cancel_order.py similarity index 95% rename from bfxapi/examples/ws/candel_order.py rename to bfxapi/examples/ws/cancel_order.py index b13b3af..2da2a44 100644 --- a/bfxapi/examples/ws/candel_order.py +++ b/bfxapi/examples/ws/cancel_order.py @@ -24,7 +24,7 @@ async def trade_completed(order, trade): print ("Order confirmed.") print (order) print (trade) - await bfx.ws.cancel_order(order.id) + await bfx.ws.close_order(order.id) @bfx.ws.on('error') def log_error(msg): diff --git a/bfxapi/examples/ws/send_order.py b/bfxapi/examples/ws/send_order.py index b7a6fce..e61442c 100644 --- a/bfxapi/examples/ws/send_order.py +++ b/bfxapi/examples/ws/send_order.py @@ -42,6 +42,6 @@ async def submit_order(auth_message): # You can also provide a callback # await ws.submit_order('tBTCUSD', 0, 0.01, -# 'EXCHANGE MARKET', onComplete=trade_complete) +# 'EXCHANGE MARKET', onClose=trade_complete) bfx.ws.run() diff --git a/bfxapi/websockets/OrderManager.py b/bfxapi/websockets/OrderManager.py index 51c2e07..c6976d1 100644 --- a/bfxapi/websockets/OrderManager.py +++ b/bfxapi/websockets/OrderManager.py @@ -23,19 +23,21 @@ class OrderManager: def get_pending_orders(self): return list(self.pending_orders.values()) - async def _confirm_order(self, order): + async def _confirm_order(self, order, isClosed=False): ''' Called once when we first recieve infomation back from the bitfinex api that the order has been accepted. ''' if order.cId in self.pending_orders: if self.pending_callbacks[order.cId][0]: - # call onComplete callback + # call onConfirm callback await self.pending_callbacks[order.cId][0](order) + if isClosed: + await self.pending_callbacks[order.cId][1](order) + del self.pending_callbacks[order.cId] order.set_confirmed() # remove from pending orders list del self.pending_orders[order.cId] - del self.pending_callbacks[order.cId] self.bfxapi._emit('order_confirmed', order) async def confirm_order_closed(self, raw_ws_data): @@ -48,7 +50,7 @@ class OrderManager: order.set_open_state(False) if order.id in self.open_orders: del self.open_orders[order.id] - await self._confirm_order(order) + await self._confirm_order(order, isClosed=True) self.logger.info("Order closed: {} {}".format(order.symbol, order.status)) self.bfxapi._emit('order_closed', order) @@ -94,7 +96,7 @@ class OrderManager: return int(round(time.time() * 1000)) async def submit_order(self, symbol, price, amount, market_type, - hidden=False, onComplete=None, onError=None, *args, **kwargs): + hidden=False, onConfirm=None, onClose=None, *args, **kwargs): cId = self._gen_unqiue_cid() # send order over websocket payload = { @@ -105,24 +107,24 @@ class OrderManager: "price": str(price) } self.pending_orders[cId] = payload - self.pending_callbacks[cId] = (onComplete, onError) + self.pending_callbacks[cId] = (onConfirm, onClose) await self.bfxapi._send_auth_command('on', payload) self.logger.info("Order cid={} ({} {} @ {}) dispatched".format( cId, symbol, amount, price)) - async def update_order(self, orderId, *args, onComplete=None, onError=None, **kwargs): + async def update_order(self, orderId, *args, onConfirm=None, onClose=None, **kwargs): if orderId not in self.open_orders: raise Exception("Order id={} is not open".format(orderId)) order = self.open_orders[orderId] - self.pending_callbacks[order.cId] = (onComplete, onError) + self.pending_callbacks[order.cId] = (onConfirm, onClose) await order.update(*args, **kwargs) self.logger.info("Update Order order_id={} dispatched".format(orderId)) - async def close_order(self, orderId, onComplete=None, onError=None): + async def close_order(self, orderId, onConfirm=None, onClose=None): if orderId not in self.open_orders: raise Exception("Order id={} is not open".format(orderId)) order = self.open_orders[orderId] - self.pending_callbacks[order.cId] = (onComplete, onError) + self.pending_callbacks[order.cId] = (onConfirm, onClose) await order.cancel() self.logger.info("Order cancel order_id={} dispatched".format(orderId))