|
19 | 19 | from copy import copy
|
20 | 20 | from functools import partial
|
21 | 21 | from itertools import repeat, product, chain
|
| 22 | +from math import copysign |
22 | 23 | from numbers import Number
|
23 | 24 | from typing import Callable, Dict, List, Optional, Sequence, Tuple, Type, Union
|
24 | 25 |
|
@@ -379,6 +380,7 @@ def __init__(self, broker: '_Broker',
|
379 | 380 | tp_price: float = None,
|
380 | 381 | parent_trade: 'Trade' = None):
|
381 | 382 | self.__broker = broker
|
| 383 | + assert size != 0 |
382 | 384 | self.__size = size
|
383 | 385 | self.__limit_price = limit_price
|
384 | 386 | self.__stop_price = stop_price
|
@@ -530,9 +532,9 @@ def _copy(self, **kwargs):
|
530 | 532 | def close(self, portion: float = 1.):
|
531 | 533 | """Place new `Order` to close `portion` of the trade at next market price."""
|
532 | 534 | assert 0 < portion <= 1, "portion must be a fraction between 0 and 1"
|
533 |
| - # TODO: check this insert |
534 |
| - self.__broker.orders.insert(0, Order(self.__broker, -round(self.size * portion), |
535 |
| - parent_trade=self)) |
| 535 | + size = copysign(max(1, round(abs(self.__size) * portion)), -self.__size) |
| 536 | + order = Order(self.__broker, size, parent_trade=self) |
| 537 | + self.__broker.orders.insert(0, order) |
536 | 538 |
|
537 | 539 | # Fields getters
|
538 | 540 |
|
@@ -819,17 +821,18 @@ def _process_orders(self):
|
819 | 821 | # If order is a SL/TP order, it should close an existing trade it was contingent upon
|
820 | 822 | if order.parent_trade:
|
821 | 823 | trade = order.parent_trade
|
| 824 | + _prev_size = trade.size |
822 | 825 | # If this trade isn't already closed (e.g. on multiple `trade.close(.5)` calls)
|
823 | 826 | if trade in self.trades:
|
824 | 827 | self._reduce_trade(trade, price, order.size, time_index)
|
825 |
| - assert order.size != -trade.size or trade not in self.trades |
| 828 | + assert order.size != -_prev_size or trade not in self.trades |
826 | 829 | if order in (trade._sl_order,
|
827 | 830 | trade._tp_order):
|
828 | 831 | assert order.size == -trade.size
|
829 | 832 | assert order not in self.orders # Removed when trade was closed
|
830 | 833 | else:
|
831 | 834 | # It's a trade.close() order, now done
|
832 |
| - assert abs(trade.size) >= abs(order.size) >= 1 |
| 835 | + assert abs(_prev_size) >= abs(order.size) >= 1 |
833 | 836 | self.orders.remove(order)
|
834 | 837 | continue
|
835 | 838 |
|
|
0 commit comments