diff --git a/rqalpha/mod/simulation/simulation_broker.py b/rqalpha/mod/simulation/simulation_broker.py index a59de8fa5..76256a8bc 100644 --- a/rqalpha/mod/simulation/simulation_broker.py +++ b/rqalpha/mod/simulation/simulation_broker.py @@ -172,7 +172,5 @@ def _match(self): self._open_orders = [(a, o) for a, o in self._open_orders if not o._is_final()] for account, order in final_orders: - if order.status == ORDER_STATUS.REJECTED: + if order.status == ORDER_STATUS.REJECTED or order.status == ORDER_STATUS.CANCELLED: self._env.event_bus.publish_event(EVENT.ORDER_UNSOLICITED_UPDATE, account, order) - elif order.status == ORDER_STATUS.CANCELLED: - self._env.event_bus.publish_event(EVENT.ORDER_CANCELLATION_PASS, account, order) diff --git a/rqalpha/model/account/future_account.py b/rqalpha/model/account/future_account.py index 691d8b4d7..a6c3e0ed8 100644 --- a/rqalpha/model/account/future_account.py +++ b/rqalpha/model/account/future_account.py @@ -135,19 +135,25 @@ def order_pending_cancel(self, account, order): pass def order_cancellation_pass(self, account, order): + self._cancel_order_cal(account, order) + + def order_cancellation_reject(self, account, order): + pass + + def order_unsolicited_update(self, account, order): + self._cancel_order_cal(account, order) + + def _cancel_order_cal(self, account, order): if self != account: return order_book_id = order.order_book_id - position = self.portfolio.positions[order_book_id] - canceled_quantity = order.unfilled_quantity - canceled_value = -order._frozen_price * canceled_quantity * position._contract_multiplier - frozen_margin = self.margin_decider.cal_margin(order_book_id, order.order_book_id, canceled_value) - self._update_order_data(position, order, -canceled_quantity, canceled_value) + position = self.portfolio.positions[order.order_book_id] + rejected_quantity = order.unfilled_quantity + rejected_value = -order._frozen_price * rejected_quantity * position._contract_multiplier + frozen_margin = self.margin_decider.cal_margin(order_book_id, order.side, rejected_value) + self._update_order_data(position, order, -rejected_quantity, rejected_value) self._update_frozen_cash(order, frozen_margin) - def order_cancellation_reject(self, account, order): - pass - def trade(self, account, trade): if self != account: return @@ -185,17 +191,6 @@ def trade(self, account, trade): self._update_market_value(position, bar_dict[order_book_id].close) self._last_trade_id = trade.exec_id - def order_unsolicited_update(self, account, order): - if self != account: - return - order_book_id = order.order_book_id - position = self.portfolio.positions[order.order_book_id] - rejected_quantity = order.unfilled_quantity - rejected_value = -order._frozen_price * rejected_quantity * position._contract_multiplier - frozen_margin = self.margin_decider.cal_margin(order_book_id, order.side, rejected_value) - self._update_order_data(position, order, -rejected_quantity, rejected_value) - self._update_frozen_cash(order, frozen_margin) - @staticmethod def _update_holding_by_settle(position, settle_price): position._prev_settle_price = settle_price diff --git a/rqalpha/model/account/stock_account.py b/rqalpha/model/account/stock_account.py index 505665d91..bed06a4d8 100644 --- a/rqalpha/model/account/stock_account.py +++ b/rqalpha/model/account/stock_account.py @@ -134,16 +134,22 @@ def order_pending_cancel(self, account, order): pass def order_cancellation_pass(self, account, order): - if self != account: - return - canceled_quantity = order.unfilled_quantity - canceled_value = order._frozen_price * canceled_quantity - self._update_order_data(order, -canceled_quantity, -canceled_value) - self._update_frozen_cash(order, -canceled_value) + self._cancel_order_cal(account, order) def order_cancellation_reject(self, account, order): pass + def order_unsolicited_update(self, account, order): + self._cancel_order_cal(account, order) + + def _cancel_order_cal(self, account, order): + if self != account: + return + rejected_quantity = order.unfilled_quantity + rejected_value = order._frozen_price * rejected_quantity + self._update_order_data(order, -rejected_quantity, -rejected_value) + self._update_frozen_cash(order, -rejected_value) + def trade(self, account, trade): if self != account: return @@ -183,14 +189,6 @@ def trade(self, account, trade): self._last_trade_id = trade.exec_id - def order_unsolicited_update(self, account, order): - if self != account: - return - rejected_quantity = order.unfilled_quantity - rejected_value = order._frozen_price * rejected_quantity - self._update_order_data(order, -rejected_quantity, -rejected_value) - self._update_frozen_cash(order, -rejected_value) - def _update_order_data(self, order, inc_order_quantity, inc_order_value): position = self.portfolio.positions[order.order_book_id] if order.side == SIDE.BUY: