Files
profitable-expert-advisor/polymarket/gui/api/markets.py
T
zhutoutoutousan 98a87a69ca Update
2026-02-13 08:03:25 +01:00

172 lines
6.3 KiB
Python

"""
Markets API Routes
"""
from flask import Blueprint, jsonify
from polymarket.api import GammaClient, ClobClient
import os
markets_bp = Blueprint('markets', __name__)
# Initialize API clients
try:
gamma_client = GammaClient()
clob_client = ClobClient()
USE_REAL_API = True
except Exception as e:
print(f"[WARNING] Could not initialize API clients: {e}")
USE_REAL_API = False
gamma_client = None
clob_client = None
@markets_bp.route('/markets')
def get_markets():
"""Get markets from real Polymarket API"""
if not USE_REAL_API:
return jsonify({
'markets': [
{
'id': '1',
'question': 'Will Bitcoin reach $100k by 2025?',
'event': 'Crypto Markets',
'yes_price': 0.65,
'no_price': 0.35,
'bid': 0.64,
'ask': 0.66,
'spread': 0.02,
'token_id': 'token123'
}
]
})
try:
events_data = gamma_client.get_events(active=True, closed=False, limit=50)
if isinstance(events_data, dict):
events = events_data.get('data', events_data.get('events', []))
else:
events = events_data if isinstance(events_data, list) else []
print(f"[DEBUG] Fetched {len(events)} events from API")
markets = []
for event in events:
event_markets = event.get('markets', [])
if not event_markets:
continue
for market in event_markets:
try:
clob_token_ids = market.get('clobTokenIds', [])
if len(clob_token_ids) < 2:
continue
yes_token = clob_token_ids[0]
no_token = clob_token_ids[1]
import json
outcomes = json.loads(market.get('outcomes', '["Yes", "No"]'))
outcome_prices = json.loads(market.get('outcomePrices', '[0.5, 0.5]'))
yes_price = float(outcome_prices[0]) if len(outcome_prices) > 0 else 0.5
no_price = float(outcome_prices[1]) if len(outcome_prices) > 1 else 0.5
# Try to get better prices from orderbook
try:
yes_book = clob_client.get_orderbook(yes_token)
yes_bids = yes_book.get('bids', [])
yes_asks = yes_book.get('asks', [])
if yes_bids and yes_asks:
yes_bid = float(yes_bids[0].get('price', yes_price))
yes_ask = float(yes_asks[0].get('price', yes_price))
yes_price = (yes_bid + yes_ask) / 2
except Exception as e:
pass
spread = abs(yes_price - no_price)
try:
yes_book = clob_client.get_orderbook(yes_token)
yes_bids = yes_book.get('bids', [])
yes_asks = yes_book.get('asks', [])
if yes_bids and yes_asks:
best_bid = float(yes_bids[0].get('price', yes_price))
best_ask = float(yes_asks[0].get('price', yes_price))
spread = best_ask - best_bid
except:
pass
markets.append({
'id': market.get('id', ''),
'question': market.get('question', event.get('title', 'Unknown Market')),
'event': event.get('title', 'Unknown Event'),
'yes_price': yes_price,
'no_price': no_price,
'bid': yes_price - (spread / 2) if yes_price > (spread / 2) else 0.0,
'ask': yes_price + (spread / 2) if yes_price < (1 - spread / 2) else 1.0,
'spread': spread,
'token_id': yes_token,
'volume': market.get('volume', 0)
})
except Exception as e:
print(f"Error processing market: {e}")
continue
print(f"[DEBUG] Returning {len(markets)} markets to frontend")
return jsonify({'markets': markets})
except Exception as e:
import traceback
print(f"Error fetching markets: {e}")
print(traceback.format_exc())
return jsonify({'markets': [], 'error': str(e)})
@markets_bp.route('/market/<market_id>')
def get_market_details(market_id):
"""Get market details from real API"""
if not USE_REAL_API:
return jsonify({
'orderbook': {'bids': [], 'asks': []},
'best_bid_ask': {'bid': 0.5, 'ask': 0.5, 'spread': 0.0},
'depth': {'bid_depth': 0, 'ask_depth': 0}
})
try:
book = clob_client.get_orderbook(market_id)
bids = book.get('bids', [])
asks = book.get('asks', [])
best_bid = float(bids[0].get('price', 0.5)) if bids else 0.5
best_ask = float(asks[0].get('price', 0.5)) if asks else 0.5
bid_depth = sum(float(bid.get('size', 0)) for bid in bids)
ask_depth = sum(float(ask.get('size', 0)) for ask in asks)
return jsonify({
'orderbook': {
'bids': bids[:10],
'asks': asks[:10]
},
'best_bid_ask': {
'bid': best_bid,
'ask': best_ask,
'spread': best_ask - best_bid,
'mid': (best_bid + best_ask) / 2
},
'depth': {
'bid_depth': bid_depth,
'ask_depth': ask_depth,
'total_depth': bid_depth + ask_depth
}
})
except Exception as e:
print(f"Error fetching market details: {e}")
return jsonify({
'orderbook': {'bids': [], 'asks': []},
'best_bid_ask': {'bid': 0.5, 'ask': 0.5, 'spread': 0.0},
'depth': {'bid_depth': 0, 'ask_depth': 0},
'error': str(e)
})