Example #1
0
    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
Example #2
0
 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