import logging import secrets from threading import Lock from .http import get_json API_HOST = "http://139.224.247.176:13499" MARKET_URL, PERIOD, HTTP_TIMEOUT = "/a/market", "60m", 5.0 _market_lock = Lock() _market_status = "UNKNOWN" def status(payload) -> str: value = payload.get("data", payload) if isinstance(payload, dict) else payload if isinstance(value, list): value = value[-1] if value else None if isinstance(value, dict): value = value.get("action", value.get("status", value.get("signal"))) result = str(value).strip().upper() return result if result in {"UP", "DOWN", "NEUTRAL"} else "UNKNOWN" def refresh_market(api_host: str = API_HOST) -> str: """由后台调度线程刷新大盘状态;请求失败时缓存为 UNKNOWN。""" global _market_status url = f"{api_host}{MARKET_URL}?period={PERIOD}&t={secrets.token_urlsafe(12)}" try: result = status(get_json(url, HTTP_TIMEOUT)) except Exception as exc: result = "UNKNOWN" logging.error("获取大盘指数失败: %s %s", url, exc) with _market_lock: _market_status = result logging.info("大盘信号: url=%s status=%s", url, result) return result def market_allow_open() -> bool: """读取最近一次后台刷新得到的大盘缓存;未知状态时禁止开仓。""" with _market_lock: return _market_status == "UP"