mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-16 01:06:56 +08:00
update Exchange.deal_order
This commit is contained in:
@@ -246,8 +246,8 @@ class Exchange:
|
|||||||
order, trade_account.current if trade_account else position
|
order, trade_account.current if trade_account else position
|
||||||
)
|
)
|
||||||
# update account
|
# update account
|
||||||
if trade_val > 0:
|
if order.deal_amount > 1e-5:
|
||||||
# If the order can only be deal 0 trade_val. Nothing to be updated
|
# If the order can only be deal 0 aomount. Nothing to be updated
|
||||||
# Otherwise, it will result some stock with 0 amount in the position
|
# Otherwise, it will result some stock with 0 amount in the position
|
||||||
if trade_account:
|
if trade_account:
|
||||||
trade_account.update_order(order=order, trade_val=trade_val, cost=trade_cost, trade_price=trade_price)
|
trade_account.update_order(order=order, trade_val=trade_val, cost=trade_cost, trade_price=trade_price)
|
||||||
@@ -454,30 +454,21 @@ class Exchange:
|
|||||||
trade_price = self.get_deal_price(order.stock_id, order.start_time, order.end_time)
|
trade_price = self.get_deal_price(order.stock_id, order.start_time, order.end_time)
|
||||||
if order.direction == Order.SELL:
|
if order.direction == Order.SELL:
|
||||||
# sell
|
# sell
|
||||||
current_amount = position.get_stock_amount(order.stock_id)
|
|
||||||
|
|
||||||
if position is not None:
|
if position is not None:
|
||||||
|
current_amount = (
|
||||||
|
position.get_stock_amount(order.stock_id) if position.check_stock(order.stock_id) else 0
|
||||||
|
)
|
||||||
if np.isclose(order.amount, current_amount):
|
if np.isclose(order.amount, current_amount):
|
||||||
# when selling last stock. The amount don't need rounding
|
# when selling last stock. The amount don't need rounding
|
||||||
order.deal_amount = order.amount
|
order.deal_amount = order.amount
|
||||||
elif order.amount > current_amount:
|
elif order.amount > current_amount:
|
||||||
self.logger.warning(
|
|
||||||
f"order amount {order.amount} is greater than current amount {current_amount}, {current_amount} amount of stock is dealed"
|
|
||||||
)
|
|
||||||
order.deal_amount = self.round_amount_by_trade_unit(current_amount, order.factor)
|
order.deal_amount = self.round_amount_by_trade_unit(current_amount, order.factor)
|
||||||
else:
|
else:
|
||||||
order.deal_amount = self.round_amount_by_trade_unit(order.amount, order.factor)
|
order.deal_amount = self.round_amount_by_trade_unit(order.amount, order.factor)
|
||||||
else:
|
else:
|
||||||
# TODO: We don't know current position.
|
# TODO: We don't know current position.
|
||||||
# We choose to sell all
|
# We choose to sell all
|
||||||
|
order.deal_amount = order.amount
|
||||||
if not np.isclose(order.amount, current_amount) and order.amount > current_amount:
|
|
||||||
self.logger.warning(
|
|
||||||
f"order amount {order.amount} is greater than current amount {current_amount}, {current_amount} amount of stock is dealed"
|
|
||||||
)
|
|
||||||
order.deal_amount = current_amount
|
|
||||||
else:
|
|
||||||
order.deal_amount = order.amount
|
|
||||||
|
|
||||||
order.deal_amount = self._get_amount_by_volume(
|
order.deal_amount = self._get_amount_by_volume(
|
||||||
order.stock_id, order.start_time, order.end_time, order.deal_amount
|
order.stock_id, order.start_time, order.end_time, order.deal_amount
|
||||||
|
|||||||
@@ -73,6 +73,9 @@ class Position:
|
|||||||
def del_stock(self, stock_id):
|
def del_stock(self, stock_id):
|
||||||
del self.position[stock_id]
|
del self.position[stock_id]
|
||||||
|
|
||||||
|
def check_stock(self, stock_id):
|
||||||
|
return stock_id in self.position
|
||||||
|
|
||||||
def update_order(self, order, trade_val, cost, trade_price):
|
def update_order(self, order, trade_val, cost, trade_price):
|
||||||
# handle order, order is a order class, defined in exchange.py
|
# handle order, order is a order class, defined in exchange.py
|
||||||
if order.direction == Order.BUY:
|
if order.direction == Order.BUY:
|
||||||
|
|||||||
Reference in New Issue
Block a user