@@ -822,17 +822,20 @@ def _process_orders(self):
822822 if order .parent_trade :
823823 trade = order .parent_trade
824824 _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 )
825828 # If this trade isn't already closed (e.g. on multiple `trade.close(.5)` calls)
826829 if trade in self .trades :
827- self ._reduce_trade (trade , price , order . size , time_index )
830+ self ._reduce_trade (trade , price , size , time_index )
828831 assert order .size != - _prev_size or trade not in self .trades
829832 if order in (trade ._sl_order ,
830833 trade ._tp_order ):
831834 assert order .size == - trade .size
832835 assert order not in self .orders # Removed when trade was closed
833836 else :
834837 # 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
836839 self .orders .remove (order )
837840 continue
838841
@@ -913,6 +916,7 @@ def _reduce_trade(self, trade: Trade, price: float, size: float, time_index: int
913916 assert abs (trade .size ) >= abs (size )
914917
915918 size_left = trade .size + size
919+ assert size_left * trade .size >= 0
916920 if not size_left :
917921 close_trade = trade
918922 else :
0 commit comments