Files
py_polymarket_hft_mm/main.py
T

130 lines
3.7 KiB
Python

import os
import gc
import asyncio
import requests
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
from utils.market_time import is_in_trading_window
from utils.clob_orders import (
place_anchor_and_hedge,
cache_tocken_trading_infos,
)
from utils.cpu_affinity import set_cpu_affinity
from config import MAX_TRADES
gc.disable()
session = requests.Session()
requests.get = session.get
requests.post = session.post
requests.put = session.put
requests.patch = session.patch
requests.delete = session.delete
requests.head = session.head
requests.options = session.options
async def main():
trades = 0
logger = setup_logging()
set_cpu_affinity()
logger.info("Polymarket HFT Market Maker started")
init_global_client()
await asyncio.sleep(2)
up_token, down_token, market_slug = await fetch_tokens()
book = OrderBook(up_token, down_token, market_slug)
await asyncio.create_task(cache_tocken_trading_infos(book))
book.start()
await asyncio.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}",
flush=True,
)
while True:
if not is_in_trading_window():
book.stop()
logger.info("Trading session ended. Starting new session.")
gc.collect()
await asyncio.sleep(10)
trades = 0
up_token, down_token, market_slug = await fetch_tokens()
book = OrderBook(up_token, down_token, market_slug)
asyncio.create_task(cache_tocken_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)):
continue
down_ask_price = 1 - up_bid_price
down_bid_price = 1 - up_ask_price
up_trend = up_bid_price > down_bid_price
if trades < MAX_TRADES:
trading_side = book.last_signal
if (trading_side == SIGNALES.UP) and not up_trend:
await place_anchor_and_hedge(
up_token,
down_token,
"UP",
up_ask_price - 0.01,
size=5,
)
trades += 1
logger.info(
f"Placed UP anchor and hedge orders. Total trades: {trades}"
)
elif (trading_side == SIGNALES.DOWN) and up_trend:
await place_anchor_and_hedge(
up_token,
down_token,
"DOWN",
down_ask_price - 0.01,
size=5,
)
trades += 1
logger.info(
f"Placed DOWN anchor and hedge orders. Total trades: {trades}"
)
await asyncio.sleep(0.01)
if __name__ == "__main__":
try:
if os.name == "nt":
asyncio.run(main())
else:
import uvloop
uvloop.run(main())
except KeyboardInterrupt:
print("\nMarket maker stopped by user")
except Exception as e:
print(f"Fatal error: {e}")
exit(1)