Add CTP auto-connect toggle to stop off-hours reconnect attempts.

When disabled, disconnect immediately and skip auto-reconnect, premarket connect, and TCP probes that fail outside SimNow trading hours.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-26 18:53:49 +08:00
parent 3a150dd3d6
commit 631aa2c0ab
9 changed files with 231 additions and 18 deletions
+50
View File
@@ -546,6 +546,12 @@ class CtpBridge:
}
def connect(self, mode: str, *, force: bool = False) -> None:
from ctp_settings import CTP_DISABLED_HINT, is_ctp_auto_connect_enabled
if not is_ctp_auto_connect_enabled():
self._last_error = CTP_DISABLED_HINT
_persist_last_error(CTP_DISABLED_HINT)
raise RuntimeError(CTP_DISABLED_HINT)
if self._connect_in_progress:
raise RuntimeError("CTP 正在连接中,请稍候")
if self._is_login_cooldown_active() and not force:
@@ -644,6 +650,18 @@ class CtpBridge:
def start_connect_async(self, mode: str, *, force: bool = False) -> dict[str, Any]:
"""后台连接,不阻塞 HTTP 请求。"""
from ctp_settings import CTP_DISABLED_HINT, is_ctp_auto_connect_enabled
if not is_ctp_auto_connect_enabled():
self._last_error = CTP_DISABLED_HINT
_persist_last_error(CTP_DISABLED_HINT)
return {
"started": False,
"connecting": False,
"connected": False,
"disabled": True,
"error": CTP_DISABLED_HINT,
}
if self._connected_mode == mode and self.ping() and not force:
return {"started": False, "connecting": False, "connected": True}
if self._connect_in_progress:
@@ -787,9 +805,13 @@ class CtpBridge:
def reconnect_after_settings_saved(self, mode: str) -> dict[str, Any]:
"""保存前置/账号后关闭旧连接,并用数据库中的新配置重连。"""
from ctp_settings import is_ctp_auto_connect_enabled
self._close_gateway()
self._last_error = ""
_persist_last_error("")
if not is_ctp_auto_connect_enabled():
return {"started": False, "connecting": False, "connected": False, "disabled": True}
return self.start_connect_async(mode, force=True)
def _schedule_fee_sync(self, mode: str) -> None:
@@ -1623,6 +1645,20 @@ def vnpy_available() -> bool:
return get_bridge().available()
def ctp_disconnect(*, set_disabled_hint: bool = False) -> None:
"""主动断开 CTP 并清理内存状态。"""
from ctp_settings import CTP_DISABLED_HINT
b = get_bridge()
b._close_gateway()
if set_disabled_hint:
b._last_error = CTP_DISABLED_HINT
_persist_last_error(CTP_DISABLED_HINT)
else:
b._last_error = ""
_persist_last_error("")
def ctp_connect(mode: str, *, force: bool = False) -> dict[str, Any]:
b = get_bridge()
b.connect(mode, force=force)
@@ -1639,6 +1675,10 @@ def ctp_start_connect(mode: str, *, force: bool = False) -> dict[str, Any]:
def ctp_try_auto_reconnect(mode: str) -> bool:
"""断线时静默异步重连;已连接且交易通道正常则不再重复 connect。"""
from ctp_settings import is_ctp_auto_connect_enabled
if not is_ctp_auto_connect_enabled():
return False
b = get_bridge()
if not b.available():
return False
@@ -1673,7 +1713,17 @@ def ctp_try_auto_reconnect(mode: str) -> bool:
def ctp_status(mode: str) -> dict[str, Any]:
from ctp_settings import CTP_DISABLED_HINT, is_ctp_auto_connect_enabled
auto = is_ctp_auto_connect_enabled()
st = get_bridge().status(mode)
st["auto_connect_enabled"] = auto
if not auto:
st["disabled_hint"] = CTP_DISABLED_HINT
if not st.get("connected") and not st.get("connecting"):
st["last_error"] = ""
st["td_reachable"] = None
return st
if not st.get("connected") and not st.get("connecting"):
setting = _setting_for_mode(mode)
td = setting.get("交易服务器", "")