# Copyright (c) 2025-2026 马建军. All rights reserved. # 专有软件 — 未经授权禁止复制、传播、转售。 # 严禁用于:带单/代客理财、向他人推荐期货品种或买卖建议、融资配资等业务。 # 详见 LICENSE.zh-CN.txt 与 docs/软件购买与使用协议.md """CTP 断线自动重连(后台线程)。""" from __future__ import annotations import logging import os import threading import time from typing import Callable from modules.ctp.ctp_premarket_connect import premarket_minutes_before, should_auto_connect_now from modules.market.market_sessions import in_premarket_connect_window, is_trading_session from modules.ctp.vnpy_bridge import ctp_try_auto_reconnect logger = logging.getLogger(__name__) RECONNECT_INTERVAL_SEC = 60 TRADING_RECONNECT_INTERVAL_SEC = 15 PREMARKET_RECONNECT_INTERVAL_SEC = 30 def _auto_reconnect_enabled() -> bool: return (os.getenv("CTP_AUTO_RECONNECT", "true") or "true").strip().lower() in ( "1", "true", "yes", ) def start_ctp_reconnect_worker( *, get_mode_fn: Callable[[], str], get_setting_fn: Callable[[str, str], str] | None = None, interval: int = RECONNECT_INTERVAL_SEC, ) -> None: """交易时段 / 盘前窗口内检测 CTP;断线则后台自动重连。""" def _loop() -> None: while True: sleep_sec = max(5, interval) try: if _auto_reconnect_enabled() and should_auto_connect_now(): mode = get_mode_fn() ctp_try_auto_reconnect(mode) if is_trading_session(): sleep_sec = TRADING_RECONNECT_INTERVAL_SEC elif in_premarket_connect_window( minutes_before=premarket_minutes_before(), ): sleep_sec = PREMARKET_RECONNECT_INTERVAL_SEC except Exception as exc: logger.warning("CTP reconnect worker: %s", exc) time.sleep(sleep_sec) threading.Thread(target=_loop, daemon=True, name="ctp-reconnect-worker").start()