修复实盘顶栏误显示模拟盘会话资金:无交易所余额时显示 —,切模式清缓存。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-04 09:16:45 +08:00
parent e33d289e39
commit 131bb36930
5 changed files with 65 additions and 6 deletions
+24 -6
View File
@@ -2652,6 +2652,8 @@ friendly_exchange_error = friendly_okx_error
def invalidate_account_balance_cache() -> None:
ACCOUNT_BALANCE_CACHE["updated_at"] = 0
ACCOUNT_BALANCE_CACHE["funding_usdt"] = None
ACCOUNT_BALANCE_CACHE["trading_usdt"] = None
def get_exchange_capitals(force=False):
@@ -2664,11 +2666,15 @@ def get_exchange_capitals(force=False):
try:
funding = _fetch_usdt_by_types(["funding"])
trading = _fetch_usdt_by_types(["swap", "trading", "spot"])
# 显式写入(含 0 / None),避免模式切换后残留旧缓存
ACCOUNT_BALANCE_CACHE["funding_usdt"] = funding
ACCOUNT_BALANCE_CACHE["trading_usdt"] = trading
ACCOUNT_BALANCE_CACHE["updated_at"] = now_ts
except Exception:
pass
# 拉取失败不沿用旧值
ACCOUNT_BALANCE_CACHE["funding_usdt"] = None
ACCOUNT_BALANCE_CACHE["trading_usdt"] = None
ACCOUNT_BALANCE_CACHE["updated_at"] = 0
return ACCOUNT_BALANCE_CACHE["funding_usdt"], ACCOUNT_BALANCE_CACHE["trading_usdt"]
@@ -5258,7 +5264,13 @@ def render_main_page(page="options", embed_mode=None):
else:
funding_capital, trading_capital = None, None
funding_usdt = round(funding_capital, FUNDS_DECIMALS) if funding_capital is not None else None
current_capital = round(trading_capital, FUNDS_DECIMALS) if trading_capital is not None else round(local_current_capital, FUNDS_DECIMALS)
# 顶栏交易账户只展示交易所余额;勿回退会话 current_capital(模拟盘残留会污染实盘显示)
current_capital = (
round(trading_capital, FUNDS_DECIMALS) if trading_capital is not None else None
)
capital_for_sizing = (
current_capital if current_capital is not None else round(local_current_capital, FUNDS_DECIMALS)
)
options_trading_usdc = None
options_funding_usdc = None
options_funding_usdt = None
@@ -5309,7 +5321,7 @@ def render_main_page(page="options", embed_mode=None):
options_trading_btc = None
options_margin_mode = "coin"
options_underly = "ETH"
recommended_capital = get_recommended_capital(current_capital)
recommended_capital = get_recommended_capital(capital_for_sizing)
key_list = (
conn.execute("SELECT * FROM key_monitors").fetchall() if plan.key_list else []
)
@@ -5336,7 +5348,7 @@ def render_main_page(page="options", embed_mode=None):
if plan.orders:
raw_order_list = conn.execute("SELECT * FROM order_monitors WHERE status='active'").fetchall()
for o in raw_order_list:
order_list.append(enrich_order_item(row_to_dict(o), current_capital))
order_list.append(enrich_order_item(row_to_dict(o), capital_for_sizing))
enrich_orders_force_close(
order_list,
FORCE_CLOSE_ENABLED,
@@ -5705,7 +5717,13 @@ def api_account_snapshot():
force_refresh = (request.args.get("force") or "").strip().lower() in ("1", "true", "yes")
funding_capital, trading_capital = get_exchange_capitals(force=force_refresh)
funding_usdt = round(funding_capital, FUNDS_DECIMALS) if funding_capital is not None else None
current_capital = round(trading_capital, FUNDS_DECIMALS) if trading_capital is not None else round(local_current_capital, FUNDS_DECIMALS)
# 顶栏只展示交易所余额;勿用会话资金回退(避免模拟盘 30U 残留到实盘)
current_capital = (
round(trading_capital, FUNDS_DECIMALS) if trading_capital is not None else None
)
capital_for_sizing = (
current_capital if current_capital is not None else round(local_current_capital, FUNDS_DECIMALS)
)
options_trading_usdc = None
options_funding_usdc = None
options_funding_usdt = None
@@ -5739,7 +5757,7 @@ def api_account_snapshot():
options_trading_btc = None
options_margin_mode = "coin"
options_underly = "ETH"
recommended_capital = get_recommended_capital(current_capital)
recommended_capital = get_recommended_capital(capital_for_sizing)
from lib.trade.trade_labels_lib import count_position_limit_active_monitors
position_limit_count = count_position_limit_active_monitors(conn)
+7
View File
@@ -71,6 +71,13 @@ def apply_env_reload(env_path: str, get_db: Callable, changed_keys: list[str], g
set_trading_mode(get_db, raw)
except Exception:
pass
# 清余额缓存,避免模拟盘资金残留到实盘顶栏
try:
from app import invalidate_account_balance_cache
invalidate_account_balance_cache()
except Exception:
pass
from lib.env.env_schema import updates_need_restart
return {"restart_required": updates_need_restart(groups, changed_keys)}
@@ -1212,9 +1212,13 @@ function applyAccountSnapshot(data){
applyOptionsFundsVisibility(!coinMode);
if(data.funding_usdt != null && data.funding_usdt !== ""){
setFundsFieldText("total-capital", `${Number(data.funding_usdt).toFixed(2)}U`);
} else if("funding_usdt" in data){
setFundsFieldText("total-capital", "—");
}
if(data.total_funds != null && data.total_funds !== ""){
setFundsFieldText("total-funds", `${Number(data.total_funds).toFixed(2)}U`);
} else if("total_funds" in data){
setFundsFieldText("total-funds", "—");
}
if(data.current_capital != null && data.current_capital !== "" && !Number.isNaN(Number(data.current_capital))){
setFundsFieldText(
@@ -1226,6 +1230,16 @@ function applyAccountSnapshot(data){
data.options_margin_mode
)
);
} else if("current_capital" in data){
setFundsFieldText(
"current-capital",
formatTradingAccountLabel(
null,
data.options_trading_eth,
data.options_trading_btc,
data.options_margin_mode
)
);
}
if(!coinMode && (data.options_funding_usdc != null || data.options_funding_usdt != null || data.options_funding_eth != null)){
const optFunding = formatOptionsFundingLabel(
+14
View File
@@ -1691,9 +1691,13 @@ function applyAccountSnapshot(data){
applyOptionsFundsVisibility(!coinMode);
if(data.funding_usdt != null && data.funding_usdt !== ""){
setFundsFieldText("total-capital", `${Number(data.funding_usdt).toFixed(2)}U`);
} else if("funding_usdt" in data){
setFundsFieldText("total-capital", "—");
}
if(data.total_funds != null && data.total_funds !== ""){
setFundsFieldText("total-funds", `${Number(data.total_funds).toFixed(2)}U`);
} else if("total_funds" in data){
setFundsFieldText("total-funds", "—");
}
if(data.current_capital != null && data.current_capital !== "" && !Number.isNaN(Number(data.current_capital))){
setFundsFieldText(
@@ -1705,6 +1709,16 @@ function applyAccountSnapshot(data){
data.options_margin_mode
)
);
} else if("current_capital" in data){
setFundsFieldText(
"current-capital",
formatTradingAccountLabel(
null,
data.options_trading_eth,
data.options_trading_btc,
data.options_margin_mode
)
);
}
if(!coinMode && (data.options_funding_usdc != null || data.options_funding_usdt != null || data.options_funding_eth != null)){
const optFunding = formatOptionsFundingLabel(
+6
View File
@@ -92,6 +92,12 @@ def install_sim_trading(app: Flask, repo_root: str, app_module: Any = None) -> N
saved = set_trading_mode(get_db, mode)
except ValueError as e:
return jsonify({"ok": False, "msg": str(e)}), 400
try:
from app import invalidate_account_balance_cache
invalidate_account_balance_cache()
except Exception:
pass
return jsonify({"ok": True, "mode": saved, **_status_payload()})
@app.route("/api/sim/reset", methods=["POST"])