Files

137 lines
4.4 KiB
Python

import os
import gc
import time
from utils.logger import setup_logging
from utils.tokens import fetch_tokens
from utils.orderbook import OrderBook, SIGNALES
from utils.clob_client import init_global_client, is_client_ready
from utils.market_time import is_in_trading_window, get_period_elapsed_seconds
from utils.trade_counter import reset_trades, get_trades_count, increment_trades
from utils.clob_orders import (
place_anchor_and_hedge,
cache_token_trading_infos,
)
from utils.cpu_affinity import set_cpu_affinity
from config import (
MAX_TRADES,
MAX_TRADING_BPS_THRESHOLD,
MIN_DELAY_BETWEEN_TRADES_SECONDS,
MAX_INVENTORY,
PROFIT_MARGIN,
)
gc.disable()
def main():
logger = setup_logging()
set_cpu_affinity()
logger.info("Polymarket HFT Market Maker started")
init_global_client()
time.sleep(2)
if not is_client_ready():
logger.error("ClobClient is not ready. Exiting.")
return
up_token, down_token, market_slug = fetch_tokens()
book = OrderBook(up_token, down_token, market_slug)
book.start()
time.sleep(5) # Allow some time for initial order book data
market_data = book.get_current_market_data()
up_bid_price = market_data["best_bid_price"]
up_ask_price = market_data["best_ask_price"]
down_ask_price = 1 - up_bid_price
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} | Inventory: {book.inventory} / {MAX_INVENTORY}",
flush=True,
)
while True:
if not is_in_trading_window():
book.stop()
logger.info("Trading session ended. Starting new session.")
gc.collect()
time.sleep(10)
reset_trades()
up_token, down_token, market_slug = fetch_tokens()
book = OrderBook(up_token, down_token, market_slug)
cache_token_trading_infos(book)
book.start()
market_data = book.get_current_market_data()
if not market_data:
continue
up_bid_price = market_data["best_bid_price"]
up_ask_price = market_data["best_ask_price"]
if not ((0.2 < up_ask_price < 0.35) or (0.65 < up_bid_price < 0.8)) or (
abs(market_data["micro_vs_mid_bps"]) > MAX_TRADING_BPS_THRESHOLD
):
continue
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)
and (book.inventory < MAX_INVENTORY)
):
trading_side = book.last_signal
if trading_side == SIGNALES.UP:
order_ids = place_anchor_and_hedge(
up_token,
down_token,
"UP",
round(up_bid_price, 2),
size=5,
signed_orders_cache=book.signed_orders_cache,
)
current_trades = increment_trades()
book.update_signed_orders_cache(
[round(up_bid_price, 2), round(1 - up_bid_price - PROFIT_MARGIN, 2)]
)
logger.info(
f"Placed UP anchor and hedge orders. Total trades: {current_trades}, Order IDs: {order_ids}"
)
time.sleep(MIN_DELAY_BETWEEN_TRADES_SECONDS)
elif trading_side == SIGNALES.DOWN:
order_ids = place_anchor_and_hedge(
up_token,
down_token,
"DOWN",
round(down_bid_price, 2),
size=5,
signed_orders_cache=book.signed_orders_cache,
)
current_trades = increment_trades()
book.update_signed_orders_cache(
[round(down_bid_price, 2), round(1 - down_bid_price - PROFIT_MARGIN, 2)]
)
logger.info(
f"Placed DOWN anchor and hedge orders. Total trades: {current_trades}, Order IDs: {order_ids}"
)
time.sleep(MIN_DELAY_BETWEEN_TRADES_SECONDS)
time.sleep(0.01)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\nMarket maker stopped by user")
except Exception as e:
print(f"Fatal error: {e}")
exit(1)