@@ -822,17 +822,20 @@ def _process_orders(self):
822
822
if order .parent_trade :
823
823
trade = order .parent_trade
824
824
_prev_size = trade .size
825
+ # If order.size is "greater" than trade.size, this order is a trade.close()
826
+ # order and part of the trade was already closed beforehand
827
+ size = copysign (min (abs (_prev_size ), abs (order .size )), order .size )
825
828
# If this trade isn't already closed (e.g. on multiple `trade.close(.5)` calls)
826
829
if trade in self .trades :
827
- self ._reduce_trade (trade , price , order . size , time_index )
830
+ self ._reduce_trade (trade , price , size , time_index )
828
831
assert order .size != - _prev_size or trade not in self .trades
829
832
if order in (trade ._sl_order ,
830
833
trade ._tp_order ):
831
834
assert order .size == - trade .size
832
835
assert order not in self .orders # Removed when trade was closed
833
836
else :
834
837
# It's a trade.close() order, now done
835
- assert abs (_prev_size ) >= abs (order . size ) >= 1
838
+ assert abs (_prev_size ) >= abs (size ) >= 1
836
839
self .orders .remove (order )
837
840
continue
838
841
@@ -913,6 +916,7 @@ def _reduce_trade(self, trade: Trade, price: float, size: float, time_index: int
913
916
assert abs (trade .size ) >= abs (size )
914
917
915
918
size_left = trade .size + size
919
+ assert size_left * trade .size >= 0
916
920
if not size_left :
917
921
close_trade = trade
918
922
else :
0 commit comments