From 02bb3eefeefe0607d545d51d5a07b9dd4f1cb4dc Mon Sep 17 00:00:00 2001 From: Nawaz Haider Date: Thu, 15 Jan 2026 19:26:51 +0600 Subject: [PATCH] Add inventory management with configurable limits and updater thread --- config.py | 3 ++- main.py | 5 +++-- utils/inventory.py | 15 +++++++++++++++ utils/orderbook.py | 29 +++++++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 utils/inventory.py diff --git a/config.py b/config.py index 0482b88..5f3cdf9 100644 --- a/config.py +++ b/config.py @@ -10,6 +10,7 @@ TRADING_BPS_THRESHOLD = 50 MAX_TRADING_BPS_THRESHOLD = 100 MARKET_SESSION_SECONDS = 900 TIMEZONE = "US/Eastern" -MAX_TRADES = 1 +MAX_TRADES = 30 +MAX_INVENTORY = 1 MIN_DELAY_BETWEEN_TRADES_SECONDS = 1 PLACE_OPPOSITE_ORDER = True # Hedge orders diff --git a/main.py b/main.py index fc12c35..c3cfb11 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ from config import ( MAX_TRADES, MAX_TRADING_BPS_THRESHOLD, MIN_DELAY_BETWEEN_TRADES_SECONDS, + MAX_INVENTORY ) @@ -46,7 +47,7 @@ def main(): down_bid_price = 1 - up_ask_price print( - f"Initial Prices - UP: {up_bid_price:.2f}/{up_ask_price:.2f} | DOWN: {down_bid_price:.2f}/{down_ask_price:.2f}", + f"Initial Prices - UP: {up_bid_price:.2f}/{up_ask_price:.2f} | DOWN: {down_bid_price:.2f}/{down_ask_price:.2f} | Inventory: {book.inventory} / {MAX_INVENTORY}", flush=True, ) @@ -78,7 +79,7 @@ def main(): down_ask_price = 1 - up_bid_price down_bid_price = 1 - up_ask_price - if (get_trades_count() < MAX_TRADES) and (get_period_elapsed_seconds() < 500): + if (get_trades_count() < MAX_TRADES) and (get_period_elapsed_seconds() < 500) and (book.inventory < MAX_INVENTORY): trading_side = book.last_signal if trading_side == SIGNALES.UP: diff --git a/utils/inventory.py b/utils/inventory.py new file mode 100644 index 0000000..cb0bc2e --- /dev/null +++ b/utils/inventory.py @@ -0,0 +1,15 @@ +import requests +import os + + +def get_inventory(slug=None): + + url = f"https://data-api.polymarket.com/positions?sizeThreshold=1&user={os.getenv('POLYMARKET_PROXY_ADDRESS')}&mergeable=false" + + response = requests.get(url).json() + size = 0 + for pos in response: + if pos and pos.get("slug") == slug: + size += pos.get("size") + print(pos) + return round(size / 5) diff --git a/utils/orderbook.py b/utils/orderbook.py index 7d05ea6..72aea25 100644 --- a/utils/orderbook.py +++ b/utils/orderbook.py @@ -10,6 +10,7 @@ from config import POLYMARKET_WS_MARKET_URL, TRADING_BPS_THRESHOLD from py_clob_client import OrderArgs from py_clob_client.order_builder.constants import BUY from utils.clob_client import get_client +from utils.inventory import get_inventory logger = logging.getLogger(__name__) @@ -46,6 +47,9 @@ class OrderBook: self.monitoring_running = False self.last_signal = SIGNALES.NEUTRAL + self.inventory = 0 + self.inventory_thread = None + self.inventory_running = False self.create_signed_orders_cache() def _on_message(self, ws, message): @@ -104,6 +108,7 @@ class OrderBook: self.running = True self.monitoring_running = True + self.inventory_running = True self.thread = threading.Thread(target=self._connect, daemon=True) self.thread.start() @@ -113,16 +118,36 @@ class OrderBook: ) self.monitoring_thread.start() - logger.info("WebSocket price stream and trading monitor started") + self.inventory_thread = threading.Thread( + target=self._inventory_updater, daemon=True + ) + self.inventory_thread.start() + + logger.info( + "WebSocket price stream, trading monitor, and inventory updater started" + ) def stop(self): self.running = False self.monitoring_running = False + self.inventory_running = False if self.ws: self.ws.close() - logger.info("🛑 WebSocket price stream and trading monitor stopped") + logger.info( + "🛑 WebSocket price stream, trading monitor, and inventory updater stopped" + ) + + def _inventory_updater(self): + logger.info("Started inventory updater thread") + while self.inventory_running: + try: + self.inventory = get_inventory(self.slug) + except Exception as e: + logger.error(f"Error updating inventory: {e}") + time.sleep(2) + logger.info("Stopped inventory updater thread") def is_connected(self): with self.lock: