def _exec_limit_order(self, order: OrderCommon): assert order.type == OrderType.Limit bid = self.current_quote.bid_price ask = self.current_quote.ask_price order_side = order.side() self._check_price_sanity(order) violated_post_only = order_side > 0 and order.price >= ask or order_side < 0 and order.price <= bid if violated_post_only: order.status = OrderStatus.Canceled order.status_msg = OrderCancelReason.cross_during_post_only self._exec_order_cancels([order]) return order.status = OrderStatus.New self.active_orders[order.client_id] = order order._made_spread = order_side > 0 and order.price > bid or order_side < 0 and order.price < ask
def _execute_liquidation(self, symbol, order_cancel_reason=OrderCancelReason.liquidation): self.can_call_handles = False orders = filter_symbol(self.active_orders, symbol) cancelled = self._cancel_orders_helper(orders, reason=order_cancel_reason) self.active_orders = drop_orders(self.active_orders, cancelled) self.can_call_handles = True try: assert len(filter_symbol(self.active_orders, symbol)) == 0 except: for i in filter_symbol(self.active_orders, symbol): print("-" + str(i[1].status)) print("-" + str(len(cancelled))) raise AttributeError() position = self.positions.get(symbol, None) if not position or not position.is_open: return assert position.is_open order = OrderCommon(symbol=symbol, signed_qty=-position.signed_qty, type=OrderType.Market, tactic=self.liquidator) order.status_msg = order_cancel_reason self.can_call_handles = False self.send_orders([order]) self.can_call_handles = True assert order.status == OrderStatus.Filled if position.is_open: raise AttributeError("position was not close during liquidation. position = %f" % position.signed_qty) if not self.is_last_tick(): self.n_liquidations[symbol.name] += 1 if order_cancel_reason == OrderCancelReason.liquidation: closed = self.closed_positions_hist[symbol][-1] # type: PositionSim if closed.realized_pnl >= 0: raise AttributeError("Liquidation caused profit! position = {},\n current price = {}" .format(str(position), self._estimate_price())) assert len(filter_symbol(self.active_orders, symbol)) == 0