diff --git a/pyproject.toml b/pyproject.toml index 67ae55a..adec99e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "meatpy" -version = "0.2.7" +version = "0.2.10" description = "Read and process limit order book data" authors = [ { name = "Vincent Grégoire", email = "vincent.gregoire@hec.ca" }, diff --git a/src/meatpy/itch50/itch50_exec_trade_recorder.py b/src/meatpy/itch50/itch50_exec_trade_recorder.py index edd3679..1871874 100644 --- a/src/meatpy/itch50/itch50_exec_trade_recorder.py +++ b/src/meatpy/itch50/itch50_exec_trade_recorder.py @@ -97,7 +97,7 @@ def message_event( "Queue": "Ask", "Volume": message.shares, "OrderID": message.order_ref, - "Price": message.price, + "Price": message.execution_price, } (queue, i, j) = lob.find_order(message.order_ref) record["OrderTimestamp"] = queue[i].queue[j].timestamp @@ -110,7 +110,7 @@ def message_event( "Queue": "Bid", "Volume": message.shares, "OrderID": message.order_ref, - "Price": message.price, + "Price": message.execution_price, } (queue, i, j) = lob.find_order(message.order_ref) record["OrderTimestamp"] = queue[i].queue[j].timestamp diff --git a/src/meatpy/itch50/itch50_market_processor.py b/src/meatpy/itch50/itch50_market_processor.py index bcb135f..51b2140 100644 --- a/src/meatpy/itch50/itch50_market_processor.py +++ b/src/meatpy/itch50/itch50_market_processor.py @@ -157,6 +157,7 @@ def process_message( ): if message.stock != self.instrument: return + self._order_refs.add(message.order_ref) if self.track_lob: if message.bsindicator == b"B": order_type = OrderType.BID @@ -197,7 +198,7 @@ def process_message( volume=message.shares, order_id=message.order_ref, trade_ref=message.match, - price=message.price, + price=message.execution_price, ) elif isinstance(message, OrderCancelMessage): if message.order_ref not in self._order_refs: diff --git a/src/meatpy/itch50/itch50_order_event_recorder.py b/src/meatpy/itch50/itch50_order_event_recorder.py index 9ab05c8..18c7609 100644 --- a/src/meatpy/itch50/itch50_order_event_recorder.py +++ b/src/meatpy/itch50/itch50_order_event_recorder.py @@ -111,7 +111,7 @@ def message_event(self, market_processor, timestamp, message) -> None: "order_ref": message.order_ref, "bsindicator": "", "shares": message.shares, - "price": message.price, + "price": message.execution_price, "neworder_ref": "", "MessageType": "OrderExecutedPrice", } diff --git a/src/meatpy/itch50/itch50_top_of_book_message_recorder.py b/src/meatpy/itch50/itch50_top_of_book_message_recorder.py index 0c0a955..4d1e724 100644 --- a/src/meatpy/itch50/itch50_top_of_book_message_recorder.py +++ b/src/meatpy/itch50/itch50_top_of_book_message_recorder.py @@ -123,7 +123,7 @@ def message_event(self, market_processor, timestamp, message) -> None: "Queue": "Ask", "Volume": message.shares, "OrderID": message.order_ref, - "Price": message.price, + "Price": message.execution_price, } self.records.append((timestamp, record)) elif len(lob.bid_levels) > 0 and lob.bid_levels[0].order_on_book( @@ -134,7 +134,7 @@ def message_event(self, market_processor, timestamp, message) -> None: "Queue": "Bid", "Volume": message.shares, "OrderID": message.order_ref, - "Price": message.price, + "Price": message.execution_price, } self.records.append((timestamp, record)) elif isinstance(message, OrderCancelMessage): diff --git a/src/meatpy/market_processor.py b/src/meatpy/market_processor.py index a923e78..05ad8ba 100644 --- a/src/meatpy/market_processor.py +++ b/src/meatpy/market_processor.py @@ -84,7 +84,7 @@ def before_lob_update(self, new_timestamp: Timestamp) -> None: new_timestamp: The new timestamp for the upcoming update """ for x in self.handlers: - x.before_lob_update(self.current_lob, new_timestamp) + x.before_lob_update(self, new_timestamp) def message_event(self, timestamp: Timestamp, message: MarketMessage) -> None: """Notify handlers of a raw message event. diff --git a/tests/test_market_processor.py b/tests/test_market_processor.py index 26f7d8b..8e2b82e 100644 --- a/tests/test_market_processor.py +++ b/tests/test_market_processor.py @@ -74,13 +74,17 @@ def setup_method(self): def test_before_lob_update(self): """Test before_lob_update method.""" self.processor.before_lob_update(self.timestamp) - self.handler.before_lob_update.assert_called_once_with(self.lob, self.timestamp) + self.handler.before_lob_update.assert_called_once_with( + self.processor, self.timestamp + ) def test_before_lob_update_with_no_lob(self): """Test before_lob_update method with no LOB.""" self.processor.current_lob = None self.processor.before_lob_update(self.timestamp) - self.handler.before_lob_update.assert_called_once_with(None, self.timestamp) + self.handler.before_lob_update.assert_called_once_with( + self.processor, self.timestamp + ) def test_message_event(self): """Test message_event method.""" @@ -224,12 +228,16 @@ def test_pre_lob_event(self): """Test pre_lob_event method.""" self.processor.pre_lob_event(self.timestamp) # This method should call before_lob_update on handlers - self.handler.before_lob_update.assert_called_once_with(self.lob, self.timestamp) + self.handler.before_lob_update.assert_called_once_with( + self.processor, self.timestamp + ) def test_pre_lob_event_with_new_snapshot(self): """Test pre_lob_event method with new snapshot flag.""" self.processor.pre_lob_event(self.timestamp, new_snapshot=True) - self.handler.before_lob_update.assert_called_once_with(self.lob, self.timestamp) + self.handler.before_lob_update.assert_called_once_with( + self.processor, self.timestamp + ) class TestMarketProcessorCleanup: diff --git a/uv.lock b/uv.lock index cf452c1..dfbe331 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.12'", @@ -1005,7 +1005,7 @@ wheels = [ [[package]] name = "meatpy" -version = "0.2.6" +version = "0.2.8" source = { editable = "." } dependencies = [ { name = "pyarrow" },