diff --git a/live_market_utils.py b/live_market_utils.py new file mode 100644 index 0000000..bc5246b --- /dev/null +++ b/live_market_utils.py @@ -0,0 +1,49 @@ +import logging +import json +import time +from hyperliquid.info import Info +from hyperliquid.utils import constants + +from logging_utils import setup_logging + +def on_message(message, shared_prices_dict): + """ + Callback function to process incoming 'allMids' messages and update the + shared memory dictionary directly. + """ + try: + if message.get("channel") == "allMids": + new_prices = message.get("data", {}).get("mids", {}) + # Update the shared dictionary with the new price data + shared_prices_dict.update(new_prices) + except Exception as e: + # It's important to log errors inside the process + logging.error(f"Error in WebSocket on_message: {e}") + +def start_live_feed(shared_prices_dict, log_level='off'): + """ + Main function for the WebSocket process. It takes a shared dictionary + and continuously feeds it with live market data. + """ + setup_logging(log_level, 'LiveMarketFeed') + + # The Info object manages the WebSocket connection. + info = Info(constants.MAINNET_API_URL, skip_ws=False) + + # We need to wrap the callback in a lambda to pass our shared dictionary + callback = lambda msg: on_message(msg, shared_prices_dict) + + # Subscribe to the allMids channel + subscription = {"type": "allMids"} + info.subscribe(subscription, callback) + logging.info("Subscribed to 'allMids' for live mark prices.") + + logging.info("Starting live price feed process. Press Ctrl+C in main app to stop.") + try: + # The background thread in the SDK handles messages. This loop just keeps the process alive. + while True: + time.sleep(1) + except KeyboardInterrupt: + logging.info("Stopping WebSocket listener...") + info.ws_manager.stop() + logging.info("Listener stopped.")