Files

69 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 需求:R-016 策略 tab 历史持仓展示(显示/隐藏已清仓持仓 + 清仓时间范围筛选)
> 登记:2026-09-07 | 来源:老师指令(优化功能需求讨论)| 状态:**已定稿(2026-09-07Q1-Q7 老师拍板)**
> 归属:迭代 14 | 计划:PLAN-015 实现状态:**已实现(2026-09-07,待老师人工验收)**
> **归档头(2026-09-08)** | 需求状态:已完成 | 归档日期:2026-09-08 | 实现迭代:14-策略tab历史持仓展示(策略 tab 历史持仓展示)
> 讨论记录索引:R-016.md 正文;实现细节见 04-迭代记录/14-策略tab历史持仓展示/
> 归档路径:05-需求池/已完成/R-016.md
> 迭代状态标记:已实现(迭代 14)→ 已归档(2026-09-08 老师归档指令确认验收)
## 需求描述(老师原始诉求)
**两个策略 tab**(做T / 网格超市)**title 旁边**添加以下功能:
1. **显示/隐藏已清仓的历史持仓**(开关);
2. 显示历史持仓时,**默认显示近一周清仓的持仓**,同时提供 **近 1 个月 / 近 3 个月 / 近半年 / 近 1 年** 几个范围选项。
## 背景
- 策略持仓行 = QMT 快照驱动(R-014),卖出清仓后 QMT 无该持仓 → 幽灵清仓把 strategy_holdings 行转历史(closed_at 非空)→ 策略 tab 当场少一行;
- 典型场景(2026-09-07 实际发生):早盘卖出大连热电 1000 股(做T),约 70 秒后该持仓行从做T tab 消失——当日交易记录还在(R-009 已入库、归属 holding_id=15 正确),但 tab 上锚点不可见;
- 历史数据一直在库(strategy_holdings 全量保留),只是**没有展示入口**;
- R-010 持仓行展开(关联委托汇总)以 holding_id 为锚,历史持仓行天然可复用——历史行展开 = 该轮做T/清仓的完整交易复盘(**本需求的核心目标:追溯该持仓相关的历史操作**,老师 2026-09-07 定调)。
## 讨论记录(2026-09-07Q1-Q7 老师拍板)
| # | 问题 | 结论(老师拍板) |
|---|---|---|
| Q1 | 历史行展示哪些字段? | **按建议**:代码 / 名称(取该 holding 最近关联委托的 name 兜底,无则 —)/ 清仓时间 / 持有天数;实时行情列(现价/涨幅/涨停等)历史行显示 **—**(不参与行情订阅);行展开沿用 R-010 看关联委托;成本价从委托推导本期不做 |
| Q2 | 清仓时份额怎么显示?(closeHolding 现把 shares 置 0 | **显示 0 就好了**(老师改判,否决 AI 的「保留 shares」方案):即使显示清仓时的份额也没多少意义,主要目标是追溯该持仓相关的历史操作;**不改 closeHolding 语义**,历史行份额直接显示 DB 原值(0) |
| Q3 | 排序与视觉区分? | **按建议**:当前持仓在前(维持现状排序),历史行追加在后按清仓时间降序;历史行灰显 + 「已清仓」徽标(含清仓日期);标题计数(N 只)只数当前持仓 |
| Q4 | 开关与范围选择要不要记住偏好? | **按建议**:会话级即可(默认关,进 tab 重置为「只看当前」)——查看历史是临时行为,「策略 tab = 当前持仓」是主语义 |
| Q5 | 范围选项集合? | **按建议**:近一周(默认)/ 近 1 个月 / 近 3 个月 / 近半年 / 近 1 年,共 5 档;语义 = closed_at ∈ [now 范围, now];不加「全部历史」 |
| Q6 | 自定义字段值(R-013 values)在历史行怎么处理? | **按建议**:values 数据随行保留,历史行**只读展示**(无编辑入口;服务端本就拒绝已清仓行写入) |
| Q7 | 接口形态? | **按建议**:新增独立只读端点(strategy-holdings/historyargs: strategyId + range),当前持仓路径(strategy-positions / R-014 快照语义)零改动;前端两份结果合并渲染 |
## 边界(定稿)
**做**:两个策略 tab 的历史持仓开关 + 范围筛选(title 旁按钮区);历史行展示(Q1 字段集 + Q2 份额显示 0)+ 行展开复用 R-010;配套后端历史查询端点(SqliteStore 范围查询 + DataStore 门面 + API)。
**不做**:全部持仓 tab 不加此功能(老师点名两个策略 tab);历史行盈亏统计(R-002 Q4 不做统计原则);清仓方式标记(手动清仓 vs 幽灵自动清仓,数据未区分);历史行实时行情;成本价/收益推导;**不改 closeHolding 存储语义**shares 置 0 维持,Q2);范围记忆/偏好持久化(Q4 会话级);「全部历史」档位。
## 关联观察(上一轮会话遗留,不在本需求范围)
- 交易记录 tab 的归属候选(orders/attribution-candidates)只回**当前持仓**——清仓后当日委托无法再通过下拉关联到对应 holding(2026-09-07 大连热电实际遇到);是否立独立需求(如候选纳入近期清仓持仓)待老师定。
## 二轮补充(2026-09-07,Q8-Q9 老师拍板:今日已清仓默认层)
> 追加定稿记录(不改写 Q1-Q7 首轮定稿;本轮在首轮验收前补充,老师 2026-09-07 人工验收前的诉求收窄「历史持仓关 = 当天已清仓也看不见」的体验缺口)。
**老师原始补充诉求**:两个策略 tab 显示历史持仓的交互需要小的逻辑调整——**当前已清仓的持仓默认也显示**;「历史持仓」开关**不控制当天已清仓的持仓**(历史持仓关 ≠ 当天已清仓也被藏起)。
| # | 问题 | 结论(老师拍板 2026-09-07 |
|---|---|---|
| Q8 | 「当天」的边界口径? | **本地自然日 00:00 起**(今天清仓的始终显示;跨零点后自动归入更早历史,由「历史持仓」开关控制) |
| Q9 | 今日已清仓行的视觉与计数? | **沿用历史行灰显 + 「已清仓」徽标**;标题计数(N 只)仍只算当前持仓,不含已清仓行 |
**定稿语义(相对首轮 Q4「默认关 = 只看当前」的修订)**
- 已清仓行分两层:**L1 今日已清仓**range='today'closed_at ≥ 本地自然日 00:00**默认恒显示**,进 tab 即出现、随持仓重载刷新;**L2 历史范围层**week/month/quarter/halfYear/year,仅今天之前)仍由「历史持仓」开关控制(默认关);
- 交互文案同步收窄:「历史持仓」开关 = 显示/隐藏**今天之前**已清仓的历史持仓(title/提示更新);当天清仓的持仓始终显示;
- 展示(灰显/徽标/行情列 —/份额 0/只读字段/行展开)与计数(不含已清仓行)维持 Q1/Q2/Q3/Q6 不变,两层视觉无差异;
- 实现:range='today' 特判本地自然日零点(不走回溯毫秒档);前端 rowsToRender 在开关关时也追加 L1(按 holdingId 去重 L1∩L2,开启历史范围不重复出两行);零写路径变更维持。
**边界修订**:Q5 档位集语义微调为「**今天之前的**回溯范围」;「开关默认关 = 只看当前」修订为「开关默认关 = 当前持仓 + 今日已清仓」;其余边界(不做全部持仓 tab / 不做统计 / 不改 closeHolding / 会话级不持久化等)不变。
## 验收
`docs/04-迭代记录/14-策略tab历史持仓展示/验收标准.md`