# 迭代 04 复盘:WS 盘中价格实时更新(2026-09-01) > 复盘日期:2026-09-01 | 迭代状态:**已完成(验收通过)** > 关联需求:R-005(WS 盘中价格实时更新,已定稿)、R-006(策略数据 JSON data store schema,已定稿) > 关联计划:PLAN-004(WS 盘中价格实时更新)、PLAN-005(策略数据 JSON 标准化) ## 结果 迭代 04 达成:3 个监控表格(全部持仓 / 手动做T / 网格超市)实现盘中现价实时显示(服务端缓存 + 前端轮询),数据层标准化为 JSON data store(份额 + 行情持久化),并完成多项架构治理(api 拆分、component 目录、健康检查、膨胀修复)。 ## 过程事实 1. **R-005 WS 实时价格**:经历多次架构演进—— - 初版前端直连 WS(老师拍板)→ 实测发现 QMT Bridge REST 无 CORS 头、前端直连订阅被跨域拦截; - 改服务端代理订阅/快照 → 前端轮询;再演进为「服务端中转 + 行情缓存」(老师定); - 行情持久化(store.market.json)解决首屏无价;MarketFeed 启动 prime 主动拉持仓盘口; 2. **R-006 JSON data store**:策略数据集标准化(store.schema.json / store.json / store.market.json),旧 allocations.json 自动迁移(保留 .bak); 3. **架构治理**: - src/api.js(377 行)按领域拆分 → src/api/ 目录(positions / strategies / qmt-connections / market / common); - 创建 src/component/ 目录,market-cache 拆分为 MarketDataHub(缓存)+ MarketFeed(获取),业务模块陆续迁入; - 移除冗余端点(subscribe-ws/unsubscribe-ws/tick-snapshot)、前端去重(表格上报 code 替代 Provider 自拉); 4. **QMT 健康检查**:服务端定时探测(5 分钟)+ 缓存,前端 QMT chip 右侧圆点(绿/红),点击触发即时探测; 5. **数据误删事故**(严重教训):回归测试脚本误在真实数据执行写操作,导致大连热电/万顺新材份额丢失——已恢复 + 建立测试隔离机制(ODL_TEST_DATA_DIR)并沉淀技术约束-011; 6. **行情缓存膨胀 bug**(38MB):WS 全市场推送无过滤 + setMarketQuotes 合并残留——三层修复(watchCodes 过滤 / warmup 不认可全市场 / 整体替换),最终 store.market.json 13 条 11KB; 7. **WS 推送稳定性**:实测 QMT Bridge WS 推送是会话级/有状态(连接后 wsPushCount=0,纯 REST 轮询供数)——归属 QMT Bridge 工作空间; 8. **全市场缓存**:实测 whole 推送 26,751 条中标准 A股仅 2,775 只(其余为期权/衍生品代码段)——方案搁置,保持 watchCodes。 ## 经验(已沉淀) - **服务端重启 vs 客户端刷新**:服务端模块宿主启动时加载(改动需重启),客户端 bundle 刷新即载——版本差排查先看两侧加载时机(迭代 03 经验复用); - **前端对行情状态应无感**:行情刷新/获取是服务端职责,前端只拿结果——移除状态条,避免误报; - **测试隔离**:回归/测试脚本禁止在真实数据上执行写操作(技术约束-011,数据误删事故沉淀); - **缓存膨胀三要素**:全量数据源(WS 全市场)必须过滤(watchCodes)、加载不认可历史全量(warmup)、写盘必须整体替换(setMarketQuotes); - **WS 推送不可靠**:QMT Bridge WS 为会话级行为(连接后可能 0 推送),实时数据需 REST 轮询兜底; - **代码段过滤**:QMT whole 推送含大量非 A股品种(89%),全市场类操作需按标准股票代码过滤。 ## 遗留/后续 1. **WS 推送稳定性**:归属 QMT Bridge 工作空间(老师另开筛选解决); 2. **全市场缓存**:搁置(需先解决 WS 稳定 + 只缓存标准 A股); 3. **临时诊断端点 market-stats**:可保留观测或后续移除; 4. **数据存储设计文档**:docs/03-设计约束/数据存储设计.md(已沉淀,后续存储变更以此为据)。