diff --git a/app.py b/app.py index 0c081c5..913f8ca 100644 --- a/app.py +++ b/app.py @@ -1715,20 +1715,26 @@ def settings(): from ctp_settings import save_ctp_settings_from_form save_ctp_settings_from_form(request.form, set_setting) + flash_msg = "CTP 配置已保存,正在使用新地址重连…" try: - from vnpy_bridge import get_bridge, _persist_last_error + from vnpy_bridge import get_bridge + from trading_context import get_trading_mode b = get_bridge() - b.mark_disconnected() if (request.form.get("simnow_password") or "").strip() or ( request.form.get("ctp_live_password") or "" ).strip(): b._clear_login_cooldown() - b._last_error = "" - _persist_last_error("") - except Exception: - pass - flash("CTP 配置已保存,请在持仓监控页重连 CTP") + mode = get_trading_mode(get_setting) + info = b.reconnect_after_settings_saved(mode) + if info.get("cooldown"): + flash_msg = "CTP 配置已保存;当前处于登录冷却,请稍后再连" + elif not info.get("started") and info.get("connected"): + flash_msg = "CTP 配置已保存,当前连接正常" + except Exception as exc: + app.logger.warning("CTP reconnect after settings save: %s", exc) + flash_msg = "CTP 配置已保存,请稍后在持仓监控页重连" + flash(flash_msg) elif action == "nav": items = {k: request.form.get(f"nav_{k}") == "on" for k in NAV_TOGGLES} save_nav_items(set_setting, items) diff --git a/templates/settings.html b/templates/settings.html index 800865f..8da65ce 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -131,7 +131,7 @@
- 投资者代码、密码、前置地址在此维护(优先于 .env)。保存后请在持仓监控页点击「重连 CTP」。
+ 投资者代码、密码、前置地址在此维护(优先于 .env)。保存后将自动断开并用新地址重连 CTP。
{% if ctp_status.connected %}
已连接
{% elif ctp_status.connecting %}
diff --git a/vnpy_bridge.py b/vnpy_bridge.py
index 3269221..0c85c03 100644
--- a/vnpy_bridge.py
+++ b/vnpy_bridge.py
@@ -546,6 +546,13 @@ class CtpBridge:
def mark_disconnected(self) -> None:
self._connected_mode = None
+ def reconnect_after_settings_saved(self, mode: str) -> dict[str, Any]:
+ """保存前置/账号后关闭旧连接,并用数据库中的新配置重连。"""
+ self._close_gateway()
+ self._last_error = ""
+ _persist_last_error("")
+ return self.start_connect_async(mode, force=True)
+
def _schedule_fee_sync(self, mode: str) -> None:
"""连接成功后触发每日同步检查(非每次全量)。"""