diff --git a/app/core/action_engine.py b/app/core/action_engine.py index 6799403..26875b2 100644 --- a/app/core/action_engine.py +++ b/app/core/action_engine.py @@ -154,7 +154,7 @@ SRC_TARGET_PRICE = "target_price" # 用户设的目标价到价 —— 必 SRC_TECH_EXIT = "tech_exit" WHY_RESEARCH_WEAK_CONFIRM = "研究证据走弱触发的减持,必须交人裁决,不自动卖出" -WHY_TARGET_PRICE_CONFIRM = "你设的目标价到价,卖不卖由你决定,系统不自动卖出" +WHY_TARGET_PRICE_CONFIRM = "目标价到价,需人工确认,系统不自动卖出" # 必定强制入人工队列的来源: {来源: 交给人的原因}。 # 写成一份名单而不是一个 if, 是为了将来再出现「不许自动执行」的来源时加一行就够, @@ -435,7 +435,7 @@ def eval_dca(p: dict, params: dict, mkt: dict): c = _cand(p, A_DCA, BUY, qty, f"补仓评估: 浮亏 {_f(cushion):.2%} 触及 {depth:.0%} 档 (第 {stage} 档), " f"拟补 {qty} 股 (≤底仓 {max_ratio:.0%})" - + ("; **深档: 必须用户确认**, 研判须回答杀逻辑还是杀情绪" if is_deep else ""), + + ("; **深档补仓: 需人工确认**, 研判须回答杀逻辑还是杀情绪" if is_deep else ""), {"cushion_pct": cushion, "stage": stage, "trigger": depth, "base_qty": base_qty, "price": price, "stop_ref": p.get("stop_ref")}, confirm=is_deep) @@ -510,7 +510,7 @@ def eval_target(p: dict, params: dict = None, mkt: dict = None): note = "" if qty == total else f" (总持仓 {total} 股, 今天只能卖 T+1 可卖的 {qty} 股)" c = _cand(p, A_EXIT, SELL, qty, f"目标价到价: 现价 {price} 已到你设的目标价 {target}, " - f"拟清仓 {qty} 股 (含零股){note}; 卖不卖由你拍板, 系统不自动卖", + f"拟清仓 {qty} 股 (含零股){note}; 卖出需人工确认, 系统不自动卖", {"target_price": target, "price": price, "total_qty": total, "avail_qty": int(p.get("avail_qty") or 0), "cushion_pct": p.get("cushion_pct"), "avg_cost": p.get("avg_cost")}, @@ -545,7 +545,7 @@ def eval_weak_research(p: dict, params: dict, mkt: dict = None): qty = clamp_sell_qty(int(total * ratio // LOT) * LOT, p) if qty < lot_of(p.get("ts_code")): return None - why = logic_doubt_text(st, f"研究证据走弱: 拟减 {qty} 股 (持仓 {total} 股的 {ratio:.0%}), 卖不卖由你拍板") + why = logic_doubt_text(st, f"研究证据走弱: 拟减 {qty} 股 (持仓 {total} 股的 {ratio:.0%}), 卖出需人工确认") return reduce_on_weak_research( p["ts_code"], qty=qty, reason=why, hard_numbers={"logic_state": st, "price": p.get("price"), diff --git a/app/core/command_spec.py b/app/core/command_spec.py index 8089b0e..00097e8 100644 --- a/app/core/command_spec.py +++ b/app/core/command_spec.py @@ -135,7 +135,7 @@ SPECS = { "switch_key": "PMS_GLOBAL_BUY_HALT", "switch_value": False, }, "HALT_ALL": { - "cls": CLS_TASK, "label": "全局暂停执行(休假模式)", "group": "B", "scope": "global", + "cls": CLS_TASK, "label": "全局暂停执行", "group": "B", "scope": "global", "fields": {}, "planner": "halt_all", "instant": True, "switch_key": "PMS_GLOBAL_EXEC_HALT", "switch_value": True, "note": "所有自动动作暂停, 仅保留账本对账与日报", @@ -266,7 +266,7 @@ _CONFLICT_PAIRS = [ ({"LIQUIDATE_ALL"}, {"INCREASE_EXPOSURE", "OPEN_TARGET"}, "global", "一键清仓在途, 不应再建仓"), ({"HALT_BUY"}, {"INCREASE_EXPOSURE", "OPEN_TARGET"}, "global", "全局暂停买入生效中"), ({"HALT_ALL"}, {"REDUCE_EXPOSURE", "INCREASE_EXPOSURE", "OPEN_TARGET", - "EXIT_STOCK", "REDUCE_STOCK", "LIQUIDATE_ALL"}, "global", "休假模式生效中"), + "EXIT_STOCK", "REDUCE_STOCK", "LIQUIDATE_ALL"}, "global", "暂停执行生效中"), ({"OPEN_TARGET"}, {"EXIT_STOCK", "REDUCE_STOCK"}, "stock", "同股建仓与减持方向相反"), ({"EXIT_STOCK"}, {"OPEN_TARGET", "REDUCE_STOCK"}, "stock", "同股清仓在途"), ({"FREEZE_STOCK"}, {"OPEN_TARGET"}, "stock", "该股已被命令冻结(禁增持)"), diff --git a/app/core/planner.py b/app/core/planner.py index 1e48a34..f2c6d43 100644 --- a/app/core/planner.py +++ b/app/core/planner.py @@ -586,10 +586,10 @@ def plan_halt_buy(*, pending_buys: list) -> dict: def plan_halt_all(*, pending_instructions: list) -> dict: - """全局暂停执行 (休假模式): 撤销全部在途指令, 仅保留对账与日报。""" + """全局暂停执行: 撤销全部在途指令, 仅保留对账与日报。""" items = [_item(b.get("ts_code"), A_HALT, SIDE_NONE, b.get("qty") or 0, b.get("amount") or 0, P_HALT, - f"休假模式: 撤销在途{'买入' if b.get('side') == SIDE_BUY else '卖出'}指令", + f"暂停执行: 撤销在途{'买入' if b.get('side') == SIDE_BUY else '卖出'}指令", tier="停执行", cancel_instruction_id=b.get("instruction_id")) for b in (pending_instructions or [])] return {"ok": True, "items": items, "target_amount": 0.0, "planned_amount": 0.0, diff --git a/app/core/rule_gate.py b/app/core/rule_gate.py index b848ae6..37c5f63 100644 --- a/app/core/rule_gate.py +++ b/app/core/rule_gate.py @@ -108,7 +108,7 @@ def check(*, side: str, action: str, qty: int, price: float, ctx: dict) -> dict: if day.get("halted"): failed.append("HALTED: 停牌, 当日跳过顺延") if flg.get("exec_halt"): - failed.append("EXEC_HALT: 全局暂停执行 (休假模式) 生效中") + failed.append("EXEC_HALT: 全局暂停执行 生效中") _check_user_stop(warns, side, price, flg, hard) diff --git a/app/scheduler.py b/app/scheduler.py index af6677f..23dc6c4 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -20,7 +20,7 @@ 三条守卫: 1. 交易日守卫 —— 非交易日任务直接返回 (chinesecalendar; 未装则退化为周一至周五)。 2. 故障即守成 —— 任务内异常一律吞掉并记 ERROR 日志, 绝不因调度异常产生新指令。 - 3. 全局暂停执行 (休假模式) —— 除对账与日报外的任务全部跳过。 + 3. 全局暂停执行 —— 除对账与日报外的任务全部跳过。 启用: docker compose --profile sched up -d """ @@ -74,7 +74,7 @@ def guard(*, trade_day=True, session=False, respect_exec_halt=True): try: from app.services import param_store if param_store.get_bool("PMS_GLOBAL_EXEC_HALT", False): - logger.info("[%s] 全局暂停执行 (休假模式), 跳过", name) + logger.info("[%s] 全局暂停执行, 跳过", name) return {"skipped": "exec_halt"} except Exception as e: logger.warning("[%s] 读取暂停开关失败 (按未暂停继续): %s", name, e) @@ -148,7 +148,7 @@ def _brief(r): # ================================================================ 任务 @celery_app.task(name="pms.tech_pull") -@guard(trade_day=True, respect_exec_halt=False) # 取数动作, 休假模式照跑 (只落读数更新映射, 不产生指令) +@guard(trade_day=True, respect_exec_halt=False) # 取数动作, 暂停执行照跑 (只落读数更新映射, 不产生指令) def tech_pull(): """盘前很早 (06:30) 拉决策系统的全市场技术面读数, 落 pms_tech_daily 并建映射。 @@ -161,7 +161,7 @@ def tech_pull(): @celery_app.task(name="pms.plan_pull") -@guard(trade_day=True, respect_exec_halt=False) # 取数动作, 休假模式照跑 (只更新映射不产生指令) +@guard(trade_day=True, respect_exec_halt=False) # 取数动作, 暂停执行照跑 (只更新映射不产生指令) def plan_pull(): """盘前拉上游选股计划: 刷候选池缓存 + evidence.theme 灌进 pms_industry_map。 @@ -288,7 +288,7 @@ def strategy_attach(): @celery_app.task(name="pms.t0_close") -@guard(trade_day=True, respect_exec_halt=False) # 平回是守成收敛动作: 盘中开休假模式 +@guard(trade_day=True, respect_exec_halt=False) # 平回是守成收敛动作: 盘中开暂停执行 def t0_close(): # 也不能让当日 T 仓裸奔过夜 (2026-08-28) """T 仓强制平回 (14:50): 对挂了做T策略且当日仍有未平腿的票, 立刻发对向平仓腿打平, 绝不过夜 (设计 §六 rails)。平回后再自证账面 T 仓, 残留的记 WARN 交人工核查。 @@ -307,12 +307,12 @@ def t0_close(): # 也不能让当日 T 仓裸 @celery_app.task(name="pms.daily_settle") -@guard(trade_day=True, respect_exec_halt=False) # 对账属守成动作, 休假模式下照跑 +@guard(trade_day=True, respect_exec_halt=False) # 对账属守成动作, 暂停执行下照跑 def daily_settle(): from app.services import executor, ledger_service # 先把尾窗成交入账 (2026-08-28 审查修): replay_fills 15:05 停跑而这里 15:10 全量对账, # 15:05~15:10 落进 inbox 的成交若不先消化, 会被对账当数量差异按 RECON 补一次, - # 次日开盘回放又正常入账一次 —— 同一笔账两份。休假模式下 replay 任务被闸住, + # 次日开盘回放又正常入账一次 —— 同一笔账两份。暂停执行下 replay 任务被闸住, # 这一步同样兜住 (入账是守成, 不产生新指令)。 pre = {} try: @@ -337,7 +337,7 @@ def daily_settle(): @celery_app.task(name="pms.nav_snapshot") -@guard(trade_day=True, respect_exec_halt=False) # 记账类动作, 休假模式照跑 +@guard(trade_day=True, respect_exec_halt=False) # 记账类动作, 暂停执行照跑 def nav_snapshot(): """每日净值快照 (15:20): 按公示口径记一行净值 (pms_nav_daily), 供公示表导出的 净值序列使用。排在日终结算 (15:10) 之后 —— 尾窗成交已入账、收盘价已落定; diff --git a/app/services/param_store.py b/app/services/param_store.py index 291f768..3a81d1c 100644 --- a/app/services/param_store.py +++ b/app/services/param_store.py @@ -41,7 +41,7 @@ SECRET_KEYS = ("PMS_QMT_SIGN_SEED_HEX", "PMS_QMT_PEER_PUBKEY_B64", "PMS_SESSION_ # 运行态开关: key -> (默认值, 类型, 说明) RUNTIME_EXTRA = { "PMS_GLOBAL_BUY_HALT": (False, bool, "全局暂停买入 (HALT_BUY 命令置位)"), - "PMS_GLOBAL_EXEC_HALT": (False, bool, "全局暂停执行 / 休假模式"), + "PMS_GLOBAL_EXEC_HALT": (False, bool, "全局暂停执行"), "PMS_BRAKE_UNTIL": (0, int, "组合刹车解除日 YYYYMMDD, 0=未刹车"), "PMS_HIGH_WATER": (0.0, float, "组合市值高水位 (刹车判定基准)"), "PMS_REPLAY_CURSOR": ("", str, "成交回放游标 (trading_order.order_id)。留空=首次启动时自动对齐到当前最新成交且不追认历史; 填某个 order_id=从它之后开始; 填 ALL=从头全量回放"), @@ -63,7 +63,7 @@ RUNTIME_EXTRA = { "PMS_OPEN_REASK_ENABLED": (True, bool, "解锁重问总开关: 新建仓被研判驳回后, 盘中输入确实变了就解除当日闸、重问一次。关掉就回到「驳回即当天不再问」"), "PMS_OPEN_REASK_MIN_GAP_MIN": (20, int, "距上次驳回至少多少分钟才准重问。20 分钟等于四根五分钟线, 够量能确认成形"), "PMS_OPEN_REASK_MAX_PER_DAY": (1, int, "每只票每天最多重问几次。填 1 是硬约束: 两次以上等于取消当日闸, 而当日闸挡的是账本刷屏这个真问题"), - "PMS_OPEN_REASK_WINDOW": ("0945-1430", str, "重问时段。早于 09:45 时段折算量比不可靠; 晚于 14:30 即便放行也来不及走完提议到拍板到下单"), + "PMS_OPEN_REASK_WINDOW": ("0945-1430", str, "重问时段。早于 09:45 时段折算量比不可靠; 晚于 14:30 即便放行也来不及走完提议到确认到下单"), "PMS_OPEN_REASK_REF_DRIFT": (0.03, float, "解锁条件二: 昨夜支撑或压力相对驳回时漂过这个比例就算底牌变了。与 PMS_OPEN_REF_DRIFT_MAX 同值同语义, 复盘能对照"), "PMS_OPEN_REASK_UP": (0.02, float, "解锁条件三之一: 现价较驳回时至少涨这么多。低于 2% 是噪声"), "PMS_OPEN_REASK_VOL_MIN": (1.5, float, "解锁条件三之二: 时段折算量比的绝对下限"), @@ -108,10 +108,10 @@ RUNTIME_EXTRA = { "PMS_TECH_FLIP_FRESH_DAYS": (2, int, "SAR 翻向后这么多个交易日内算「刚转向」(转多/转空相位用)"), "PMS_TECH_STATE_MAP": ("", str, "技术面读数映射 (tech_pull 与 08:40 补拉写入的 JSON: 时刻/读数日/逐票紧凑立场), 扫描层与页面只读, 勿手改"), # ── 2026-09-11 三源合议工作包二 (台账 007/009): 基本面立场与合议分流的开关。 - "PMS_FUND_REQUIRED": (True, bool, "无买方评析不建仓 (拍板: 没有读数或超 120 天的候选一律不建仓)"), + "PMS_FUND_REQUIRED": (True, bool, "无买方评析不建仓 (既定: 没有读数或超 120 天的候选一律不建仓)"), "PMS_FUND_STALE_DAYS": (120, int, "买方评析报告超过这么多天算无读数"), "PMS_FUND_CONSENSUS_GOOD_MIN": (8, int, "十视角好达这么多个且估值贵 → 打共识已定价标记, 让首批推迟"), - "PMS_CONSENSUS_ROUTE": (True, bool, "三源合议参与新建仓分流 (拍板: 上线即开; 关掉即回到只按选股判决分流)"), + "PMS_CONSENSUS_ROUTE": (True, bool, "三源合议参与新建仓分流 (既定: 上线即开; 关掉即回到只按选股判决分流)"), # 2026-09-14 加固包 (方案第六节承诺、评审发现五): 方向看多但只有一方表态时是否交人。 "PMS_CONSENSUS_WEAK_CONFIRM": (True, bool, "合议方向看多但只有一方表态时交人确认 (默认开; 关掉则弱表态也放行)"), # ── 2026-09-11 三源合议工作包二·接入 (台账 006/009): 持仓增持门与候选按质地排序。 @@ -119,7 +119,7 @@ RUNTIME_EXTRA = { "PMS_PLAN_RANK_BY_QUALITY": (True, bool, "候选先按基本面立场分桶 (质地看多的桶排前) 再按分数, 在主题限额与截断之前生效; 技术面不参与排序 (关掉即回到只按分数排)"), "PMS_PLAN_OBSERVE_IF_FUND_BULL": (False, bool, "把观察档里质地看多的票也纳入候选池 (默认关, 守宁缺毋滥; 开了它们与主榜一同参与分桶排序)"), # ── 2026-09-11 三源合议工作包三·离场纪律 (台账 010): SAR 转空自动离场。翻向新鲜天数复用 PMS_TECH_FLIP_FRESH_DAYS。 - "PMS_TECH_EXIT_AUTONOMY": ("full", str, "技术面转空离场档位: off 不评 / propose_only 交人确认 / full 自动执行 (与保垫减仓同档, 按拍板默认)"), + "PMS_TECH_EXIT_AUTONOMY": ("full", str, "技术面转空离场档位: off 不评 / propose_only 交人确认 / full 自动执行 (与保垫减仓同档, 按既定默认)"), "PMS_TECH_EXIT_TRIM_RATIO": (0.3333, float, "转空未确认时的减持比例 (占总持仓; 确认转空则清仓全部可卖量; 默认三分之一)"), "PMS_TECH_EXIT_DONE": ("", str, "本次翻空已处理过的代码集 (scan_and_route 写入的 JSON: codes/at; 跨轮去重, 页面只读, 勿手改)"), # 跟踪止盈的盘中 SAR 止损线 (2026-09-11 工作包三 part 3): 每天 09:40 把技术面 SAR 值刷进自动跟踪止盈, 盘中跌破即卖。 diff --git a/app/services/proposal_service.py b/app/services/proposal_service.py index 831f83a..15e1e81 100644 --- a/app/services/proposal_service.py +++ b/app/services/proposal_service.py @@ -78,7 +78,7 @@ def scan_and_route(*, now=None, dry_run: bool = False) -> dict: out["skipped"].append({"why": "自主档位 off, 不扫描 (新建仓一并停 —— off 是总闸)"}) return out if param_store.get_bool("PMS_GLOBAL_EXEC_HALT", False): - out["skipped"].append({"why": "全局暂停执行 (休假模式)"}) + out["skipped"].append({"why": "全局暂停执行"}) return out open_autonomy = param_store.get("PMS_OPEN_AUTONOMY", AUTONOMY_FULL) out["open_autonomy"] = open_autonomy @@ -672,7 +672,7 @@ def disposition_snapshot(now=None) -> dict: res["notes"].append("自主档位 off —— 本轮不扫描候选池 (off 是总闸)") return res if param_store.get_bool("PMS_GLOBAL_EXEC_HALT", False): - res["notes"].append("全局暂停执行 (休假模式) —— 本轮不扫描候选池") + res["notes"].append("全局暂停执行 —— 本轮不扫描候选池") return res if res["open_autonomy"] == AUTONOMY_OFF: res["notes"].append("新建仓档位 off —— 不扫描候选池") @@ -708,7 +708,7 @@ def disposition_snapshot(now=None) -> dict: for _k in _system_declined_today_keys(): # 系统自决今日已放弃 (明日重评) skip[_k] = "今日系统已判放弃,明日重评" for _k in _inflight_keys(): # 在途; 前端多半已按指令/提议标成「已下单/待你确认」 - skip[_k] = "系统已经在处理这只票(见『等我拍板』或『今日在办』)" + skip[_k] = "系统正在处理这只票(见『待确认提议』或『当日指令』)" sink = {"skipped": []} # 丢弃用: _scan_open 只往里 append/extend, 不读它 would = _scan_open(view, params, stock_params, skip, {}, sink, now=now) except Exception as e: @@ -885,7 +885,7 @@ def _route_one(c, view, params, stock_params, brake_active, now, dry_run, out, # "这个变化够不够动用一个持仓名额"是边界情形, 按既有分工归人。 # 三, 这次要解决的是**连提议都不出**, 不是"一定要买到"。把牌摊在人面前, 人拍板; # 拍了板买不上是择时区间和追高原则在起作用, 那两条一个字没改。 - reask_why = ("盘中重问放行,交你拍板:" + str((c.get("reask") or {}).get("why") or "") + reask_why = ("盘中重问放行,需人工确认:" + str((c.get("reask") or {}).get("why") or "") + "。能不能买到由择时区间决定,可能当日买不上。") if c.get("reask") else None # 上游标了硬风险的票必须交人 (2026-09-10 补的洞)。 # @@ -901,7 +901,7 @@ def _route_one(c, view, params, stock_params, brake_active, now, dry_run, out, risk_why = None if _hn_risk: _rl = _hn_risk if isinstance(_hn_risk, (list, tuple)) else [_hn_risk] - risk_why = "选股系统标了风险,交你拍板:" + ";".join(str(x) for x in _rl if x) + risk_why = "选股系统标了风险,需人工确认:" + ";".join(str(x) for x in _rl if x) force_queue = (bool(c.get("needs_user_confirm")) or bool(src_why) or bool(verdict.get("degraded")) or bool(reask_why) or bool(risk_why)) auto_exec = (not force_queue) and (side == "sell" or autonomy == AUTONOMY_FULL) diff --git a/app/services/strategy_advisor.py b/app/services/strategy_advisor.py index 0846f27..2dacf3d 100644 --- a/app/services/strategy_advisor.py +++ b/app/services/strategy_advisor.py @@ -396,7 +396,7 @@ def scan(*, dry_run: bool = False, now=None) -> dict: "挂了也不会跑, 本轮不挂"}) return _record_scan(out, dry_run, now) if param_store.get_bool("PMS_GLOBAL_EXEC_HALT", False): - out["skipped"].append({"why": "全局暂停执行 (休假模式)"}) + out["skipped"].append({"why": "全局暂停执行"}) return _record_scan(out, dry_run, now) from app.services import command_service, portfolio, strategy_service diff --git a/app/web/static/index.html b/app/web/static/index.html index ad2c87e..2c92823 100644 --- a/app/web/static/index.html +++ b/app/web/static/index.html @@ -220,7 +220,7 @@ pre.json{background:var(--surface-2);border:1px solid var(--hair);border-radius: /* 运维视图保持原来的居中宽度; 交易员视图铺开用两侧留白 */ .ops-wrap{max-width:1280px;margin:0 auto;} -/* ── 融合消息栏: 上游告警 + 系统下单 + 等我拍板 + 策略与风控, 混成一条时间线 ── */ +/* ── 融合消息栏: 上游告警 + 系统下单 + 待确认提议 + 策略与风控, 混成一条时间线 ── */ .msgbar{position:sticky;top:46px;z-index:40;display:flex;align-items:center;gap:9px; background:var(--surface);border:1px solid var(--hair);border-left:3px solid var(--accent); border-radius:12px;padding:7px 12px;margin:10px 0 4px;box-shadow:var(--shadow);font-size:13px;} @@ -450,7 +450,7 @@ body.dock-r:not(.r-fold) .side-r .strip{display:none;} {{ marketState }} 买入 {{ ov.buy_halt ? '已暂停':'正常' }} 执行 {{ ov.exec_halt ? '已暂停':'正常' }} - 自主 {{ tx('autonomy', ov.autonomy) }}? + 自主 {{ tx('autonomy', ov.autonomy) }}? 选股计划 {{ planStatus.ok===false ? '读不到' : (planStatus.date || '-') }} 技术面 {{ techChipText }}? @@ -470,7 +470,7 @@ body.dock-r:not(.r-fold) .side-r .strip{display:none;} :title="h.ymd + ' · ' + (h.value==null ? '不可用' : h.value) + ' · ' + mzLabel(h.zone)">
近 {{ (mzSig.history||[]).length }} 个交易日 · 热 +{{ (macro.params||{}).hot_th }} / 冷 {{ (macro.params||{}).cold_th }} / 退出带 ±{{ (macro.params||{}).exit_band }} · 档位 {{ macro.autonomy==='full' ? '全自动' : (macro.autonomy==='propose_only' ? '只出建议' : '只算不动') }}
-
大盘偏热,系统已经停掉它自己发起的买入,以及策略里的买入动作。卖出不受影响,你自己下的命令也不受影响。
+
大盘偏热,系统已经停掉自身发起的买入,以及策略里的买入动作。卖出不受影响,人工下的命令也不受影响。
今日建议:{{ mzSig.advice.direction==='REDUCE' ? '降仓' : '升仓' }} {{ (mzSig.advice.pct*100).toFixed(1) }}% @@ -530,17 +530,17 @@ body.dock-r:not(.r-fold) .side-r .strip{display:none;} :title="'现在是影子模式,只记录不真下单 —— ' + (dm.hint || '')"> + :title="'大盘偏热,系统已经暂停两件事:自身发起的买入,以及策略里的买入动作。卖出不受影响,人工下的命令也不受影响。' + ((macro.gate||{}).why||'')"> + :title="'参数总规模与账户实际对不上 —— 参数里写的是 ' + money(ov.scale) + ',账户总资产是 ' + money(ov.total_asset) + '(差 ' + pct(scaleGap) + ')。仓位上限按参数算,钱够不够按账户算。两个数差得远,方案会通过检查但下不出去。'">
-
消息 @@ -642,7 +642,7 @@ body.dock-r:not(.r-fold) .side-r .strip{display:none;}