diff --git a/Initialization/HandleOrderEvents.py b/Initialization/HandleOrderEvents.py index 9b7230a..129428c 100644 --- a/Initialization/HandleOrderEvents.py +++ b/Initialization/HandleOrderEvents.py @@ -41,6 +41,9 @@ def Call(self): context.executionTimer.start() + if self.context.LiveMode: + self.context.positions_store.store_positions() + if not (orderEvent.Status == OrderStatus.Filled or orderEvent.Status == OrderStatus.PartiallyFilled): return diff --git a/Tests/specs/initialization/handle_order_events_spec.py b/Tests/specs/initialization/handle_order_events_spec.py index e9a4bce..cfc62ce 100644 --- a/Tests/specs/initialization/handle_order_events_spec.py +++ b/Tests/specs/initialization/handle_order_events_spec.py @@ -36,6 +36,7 @@ self.algorithm.charting = MagicMock() self.algorithm.recentlyClosedDTE = [] self.algorithm.logger = MagicMock() + self.algorithm.positions_store = MagicMock() # Always initialize positions_store self.handler = HandleOrderEvents(self.algorithm, self.order_event) @@ -89,6 +90,72 @@ self.algorithm.executionTimer.start.assert_called_once() self.algorithm.executionTimer.stop.assert_called_once() + with it('stores positions in live mode'): + # Setup LiveMode + self.algorithm.LiveMode = True + + # Setup mock position and order + position = MagicMock( + orderTag="TEST_POS", + legs=[MagicMock(symbol=self.order_event.Symbol)] + ) + mock_order = MagicMock() + mock_order.Tag = "TEST_POS" + self.algorithm.Transactions.GetOrderById.return_value = mock_order + + self.handler.getPositionFromOrderEvent = MagicMock( + return_value=(position, None, "close", mock_order) + ) + + self.handler.Call() + + # Verify positions were stored + self.algorithm.positions_store.store_positions.assert_called_once() + + with it('does not store positions in backtest mode'): + # Setup LiveMode + self.algorithm.LiveMode = False + + # Setup mock position and order + position = MagicMock( + orderTag="TEST_POS", + legs=[MagicMock(symbol=self.order_event.Symbol)] + ) + mock_order = MagicMock() + mock_order.Tag = "TEST_POS" + self.algorithm.Transactions.GetOrderById.return_value = mock_order + + self.handler.getPositionFromOrderEvent = MagicMock( + return_value=(position, None, "close", mock_order) + ) + + self.handler.Call() + + # Verify positions were not stored + self.algorithm.positions_store.store_positions.assert_not_called() + + with it('handles missing positions_store in live mode'): + # Setup LiveMode but remove positions_store + self.algorithm.LiveMode = True + # No need to remove positions_store as it doesn't exist by default + + # Setup mock position and order + position = MagicMock( + orderTag="TEST_POS", + legs=[MagicMock(symbol=self.order_event.Symbol)] + ) + mock_order = MagicMock() + mock_order.Tag = "TEST_POS" + self.algorithm.Transactions.GetOrderById.return_value = mock_order + + self.handler.getPositionFromOrderEvent = MagicMock( + return_value=(position, None, "close", mock_order) + ) + + # Should not raise an error + self.handler.Call() + # Test passes if no exception is raised + with context('getPositionFromOrderEvent'): with it('finds position by order tag'): # Setup mock order and position diff --git a/main.py b/main.py index cb5f717..5e94bab 100644 --- a/main.py +++ b/main.py @@ -137,10 +137,6 @@ def OnOrderEvent(self, orderEvent): self.executionTimer.stop() def OnEndOfAlgorithm(self) -> None: - # store positions in live mode - if self.LiveMode: - self.positions_store.store_positions() - # Convert the dictionary into a Pandas Data Frame # dfAllPositions = pd.DataFrame.from_dict(self.allPositions, orient = "index") # Convert the dataclasses into Pandas Data Frame