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:
@@ -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("交易服务器", "")
|
||||
|
||||
Reference in New Issue
Block a user