Files
one_divine_lot/docs/05-需求池/已完成/R-002.md
T
2026-08-29 16:20:33 +08:00

247 lines
15 KiB
Markdown
Raw 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-002 分仓管理工具(持仓策略标签管理)· 已完成
> 归档日期:2026-08-28 需求状态:**已完成**
> 原索引:docs/05-需求池/需求池索引.md(主索引保留 R-002 条目,指向本归档)
> 讨论记录:docs/05-需求池/已完成/R-002-讨论记录.md(随需求一并归档)
## 需求摘要
在 DSH 中实现「分仓管理」:插件设置中管理持仓策略(策略=标签,增删改 + 显示/隐藏开关);主窗口上方 tab 栏(对话/轨迹/上下文后)显示策略标签,每个标签下加载对应持仓数据;QMT 读全量真实持仓(插件直连 QMT Bridge RESTful 接口,非 MCP),策略分仓数据本地保存管理。
## 核心逻辑(定稿版)
1. **插件设置管理**:DSH 设置中添加「神之一手」菜单,管理持仓策略(策略=标签,可增删改 + 显示/隐藏开关);
2. **tab 栏展示**:主窗口上方「对话 | 轨迹 | 上下文」后显示策略标签(全部持仓/网格策略持仓/做T持仓),每个标签下加载对应持仓数据;
3. **数据与存储**:QMT 读全量真实持仓(插件直连 REST http://192.168.3.43:8610),策略分仓数据本地保存(~/.dsh/one-divine-lot/allocations.json)。
## 实现记录
| 项 | 内容 |
|---|---|
| 实现迭代 | 01-分仓管理工具 |
| 实现方式 | 独立插件(one-divine-lot),外部挂载到 DSH web profile |
| 服务端 | S1-S6:数据源适配(REST)、设置管理、本地存储、分仓逻辑、HTTP API/odl/api/* 8 端点) |
| 客户端 | S7:三个 conversation.view tab + settings.section 设置菜单 |
| 宿主挂载 | S8dsh plugin add + bundle patch |
## 验收结果(2026-08-28 老师确认完成)
- ✅ 全部持仓显示(12 只真实持仓)
- ✅ 三个策略 tab
- ✅ 设置菜单「神之一手」
- ✅ 份额编辑(添加/移出/步进100/手动输入)
- ✅ 响应式布局
- ✅ 本地存储持久化
- ✅ 服务端 API 全部工作
## 经验沉淀
- 迭代复盘:docs/04-迭代记录/01-分仓管理工具/迭代复盘.md
- 设计约束:技术约束-003~007DSH 插件开发规范,2026-08-28 补充)
---
## 需求讨论记录(2026-08-27 整合)
> 本需求从提出到定稿的完整讨论过程(原独立文件 R-002-讨论记录.md 整合于此)。
> 整合日期:2026-08-28(老师要求:归档后讨论记录并入需求文件)
# R-002 分仓管理工具 · 需求讨论记录
> 需求状态:**讨论中** | 本文件记录需求明确过程的讨论结论,供定稿时汇总。
> 关联:docs/05-需求池/需求池索引.mdR-002
## 讨论进程
### 2026-08-27 · 第 1 轮:分仓对应策略,账户核心策略为「网格超市 + 手动做T」
**老师给出的需求信息**
1. **分仓对应不同的策略** —— 分仓的维度是策略,不是持仓周期/风险等级等;
2. **当前账户核心策略:网格超市** —— 十几个标的都在做网格交易;
3. **配合手动做T** —— 在网格基础上,手动做 T(高抛低吸/日内差价)。
**讨论推论(待确认)**
- 分仓标签 ≈ 策略标签:每个策略对应一个分仓;
- 「网格超市」可能是一个策略族(多个网格标的同属此策略),或每个网格标的独立成策略 —— 需明确粒度;
- 「手动做T」是独立策略仓,还是叠加在网格仓上的操作动作 —— 需明确与网格仓的关系。
**待确认问题**
1. 网格超市的粒度:所有网格标的是否同属一个「网格超市」策略仓?还是每个标的一个策略?
2. 手动做T:是独立的策略仓,还是对网格标的的增强操作(同一标的同时在网格+做T)?
3. 同一标的是否可能同时归属多个策略仓(如 网格 + 做T)?
4. 除了网格超市 + 做T,是否还有其他策略仓(如长线持有)?
### 2026-08-27 · 第 2 轮:分仓标签初步定为两个策略标签
**老师确认**
1. 分仓标签初步就是两个策略标签:**「网格超市」** 和 **「手动做T」**
2. 账户核心策略 = 网格超市(十几个标的做网格)+ 手动做T;
3. 分仓 = 按这两个策略标签划分。
**推论(待确认)**
- 「网格超市」标签下:所有做网格的标的(十几个)归入此仓;
- 「手动做T」标签下:做T 的标的归入此仓;
- 一个标的可能同时属于两个标签(既是网格标的,又手动做T)?—— 需确认是否允许多标签。
**待确认问题(第 3 轮)**
1. 同一标的是否允许同时打「网格超市」+「手动做T」两个标签?
2. 每个策略仓下要看什么?只有汇总(市值/盈亏),还是包含网格参数(区间/格距/档位)?
3. 未来是否可能增加第三个策略标签(预留扩展)?
### 2026-08-27 · 第 3 轮:本期范围收敛 —— 标签可维护,其他功能先不管
**老师确认**
1. **标签可以维护** —— 本期核心能力是标签的维护(创建/删除/重命名/查看);
2. **其他功能先不管** —— 网格参数管理、做T 记录、策略仓汇总等复杂功能本期不做。
**本期范围(初步收敛)**
- ✅ 全量持仓展示(数据基础)
- ✅ 标签维护(增/删/改/查)
- ✅ 持仓打标签 / 移除标签(标签与持仓关联)
- ❌ 网格参数管理(后续)
- ❌ 做T 交易记录(后续)
- ❌ 策略仓的复杂汇总/风控(后续)
**待确认(第 4 轮,定稿前)**
1. 上述范围是否准确反映了老师意图?
2. 若确认,R-002 状态可推进为「已定稿」,正式进入计划/迭代。
### 2026-08-27 · 第 4 轮:允许「持仓份额拆分」—— 同一标的可分配到多个策略仓
**老师确认(关键设计决策)**
1. **允许多标签**:一个票可以同时属于多个策略仓;
2. **但持仓数据会分开**:不是整个持仓打标签,而是**按数量拆分份额分配到不同策略仓**;
3. **示例**:一个票持仓 1000 股,可能网格有 600 股,余下 400 股是准备做 T 的前期买入仓。
**模型含义(持仓份额分配模型)**
- 数据基础:全量真实持仓(每只票的总数量);
- 分仓 = 将每只票的持仓**数量份额**分配到各策略仓(如 600719.SH 1800 股 → 网格仓 1000 股 + 做T仓 800 股);
- **约束:各策略仓份额之和 = 该票总持仓量**;
- 不再是「持仓↔标签」的整票多对多,而是「持仓份额 → 策略仓」的精确分配。
**待确认(第 5 轮)**
1. 份额由谁维护?人工指定(老师输入每仓数量)?还是本期不做份额分配、只预留模型?
2. 各仓份额的展示:是否要展示「每仓数量/市值/占比」?
3. 未被分配的数量(份额之和 < 总持仓)怎么处理?归入「未分配」?
### 2026-08-27 · 第 5 轮:完整产品形态明确(三条核心逻辑)
**老师给出的完整需求(分仓/持仓管理逻辑)**
1. **插件设置管理能力**:在设置里,添加「神之一手插件设置管理能力」——
- 可以添加不同的持仓策略;
- 一个策略对应一个标签;
- 配置该策略/标签**是否显示 / 隐藏**。
2. **会话标签展示**:在当前 DSH 的会话标签旁边,根据上面的设置,显示对应的标签;
- 每个标签下,加载对应的持仓数据。
3. **数据处理与存储**:插件需要能够处理数据、存储——
- 通过 QMT 能读取到**全部持仓数据**(真实持仓);
- 但**策略的分仓数据只能本地保存并更新管理**(QMT 没有分仓概念,分仓是本地维护的元数据)。
**产品形态转变**:从「纯命令行工具」→「带 UI 设置的完整插件」:
- 设置管理(策略 CRUD + 显示开关)→ DSH 设置/配置扩展点
- 会话标签旁展示 → DSH 客户端 UI 扩展点
- 本地存储 → 插件持久化存储
**技术探索需求**
1. DSH 插件设置管理能力如何提供(settings 扩展点)?
2. DSH 会话标签旁的 UI 扩展机制(client modules / client UI)?
3. 本地存储机制(文件/数据库)?
**待确认(第 6 轮)**
- 策略 = 标签 = 分仓,三者现在等同(一个策略对应一个标签,标签即分仓);
- 「显示/隐藏」开关:隐藏的策略标签不显示在会话标签旁;
- 分仓数据本地存储:格式与位置待定(JSON 文件?DSH 数据目录?)。
### 2026-08-27 · 技术探索结论(DSH 扩展点验证)
对 DSH 宿主环境的技术探索确认以下扩展点可用:
1. **设置管理**DSH 提供 `ctx.settings` 服务(@deepseek-ai/dsh-settings)—— 插件可 `settings.register(ns, schema)` 注册自己的设置 namespace,用户文档持久化,天然适配「策略/标签配置 + 显示开关」;
2. **会话标签旁 UI**DSH 客户端 UI 通过 `dsh.client` 平台扩展(React 组件,参考 dsh-client-ui-conversation 等),插件可作为 client plugin 注入;「会话标签旁显示策略标签」属于客户端 UI 扩展点,需修改宿主 composition 加载 client 插件;
3. **本地存储**:策略分仓数据(本地维护的元数据)可存为 JSON 文件(DSH 数据目录)或复用 settings 持久化;QMT 只提供全量真实持仓,分仓分配为本地状态。
**技术可行性结论**:老师描述的三条逻辑(设置管理 / 会话标签旁展示 / 本地存储)在 DSH 均有对应扩展机制,可实现。实现涉及修改宿主 composition(加载 client 插件),需加载 editing-cordis-compositions 技能按规范操作。
### 2026-08-27 · 第 6 轮:需求定稿(老师确认)
**老师确认**
1. **需求基本确定** —— R-002 可定稿;
2. **标签展示位置**:展示在 DSH 主窗口上方,放在「对话 | 轨迹 | 上下文 |」**后面添加**(即顶部 tab 导航栏扩展,策略标签作为新增 tab);
3. **独立插件,作为外部插件挂载** —— one_divine_lot 保持独立插件仓库,通过外部插件机制挂载到 DSH 宿主。
**定稿结论**:R-002 状态 → 已定稿,可进入计划与迭代。
### 2026-08-27 · 第 7 轮:数据源架构修正 —— 插件直连 QMT Bridge RESTful 接口
**老师指出的架构问题**
- QMT Bridge MCP 是**给智能体(Agent)用**的桥接层(封装成 MCP 工具,供 AI 调用);
- 我们的插件**不应通过 MCP**,而应**直接调用 QMT Bridge 同一服务端口下的 RESTful 接口**;
- REST 接口相关信息可通过 MCP 的 OpenAPI 规范获取(qmt_list_apis detail)。
**技术探索确认(2026-08-27**
- QMT Bridge 服务:**http://192.168.3.43:8610**(局域网 IP,配置于 ~/.dsh/profiles/web/cordis.patch.yml
- REST 端点(OpenAPI v3):/health、/trade/asset、/trade/positions、/trade/orders、/trade/trades、/data/kline、/data/quote、/data/instrument、/data/calendar/trading_dates、/data/subscribe、/data/tick、/data/unsubscribe
- MCP 端点:http://192.168.3.43:8610/mcp(同端口,MCP 封装给 Agent
- **REST 直连验证通过**/health、/trade/asset、/trade/positions 均正常返回,数据与 MCP 一致
**架构结论**
- 插件数据源适配器:直接 HTTP 调用 QMT Bridge RESTful 接口(不经过 MCP);
- MCP 仅作为 Agent 侧访问同一服务的封装层;
- 设计约束技术约束-001 仍成立(统一数据源抽象),但实现层从「MCP 调用」改为「REST 调用」。
### 2026-08-27 · S5 分仓逻辑设计讨论(Q1-Q4 结论)
**老师确认**
1. **Q1 按股数分配**:份额分配以股数为单位(不按比例);
2. **Q2 允许未分配余额**:可能有未对应策略的持股余额(临时手动操作,无对应策略)—— 即份额之和 ≤ 总持仓,允许「未分配」余量存在;
3. **Q3 策略仅为人为分组**:当前阶段策略只是人为的分组管理,**不实现策略的管理逻辑**(份额不随策略自动调整);
4. **Q4 不做统计信息**:分仓聚合**不加市值/盈亏/占比等统计**,只展示份额分配本身。
**对 S5 设计的影响**
- getSummary() 去掉市值/盈亏/占比聚合,只返回「各策略的持仓份额 + 未分配份额」;
- 份额分配:按股数,允许 sum ≤ 总持仓,剩余为「未分配」;
- 份额是人为静态指定,不涉及策略逻辑。
**待讨论(Q5**UI 上如何实现份额编辑操作。
### 2026-08-27 · Q5 UI 编辑交互设计讨论(老师明确)
**老师确认的 UI 形态**
1. **在策略 tab 内编辑**(不是单独的编辑界面);
2. **tab 结构**:理论上会有三类 tab
- **全部持仓**:初始有数据(全量真实持仓,来自 QMT);
- **网格策略持仓**:初始为空;
- **做T持仓**:初始为空;
3. **添加**:在策略持仓页(网格/做T)提供「添加持仓」操作 —— 从全部持仓中找到标的,指定份额,添加到该策略分组;
4. **移出**:提供「移出」操作 —— 该部分持仓不再按策略管理(回到全部持仓/未分配)。
**设计要点**
- 全部持仓是**数据源**(从 QMT 读的真实持仓),也是「未分配」的展示处;
- 策略持仓(网格/做T)是**从全部持仓挑份额**组成的分组;
- 份额编辑 = 添加(全量→策略,指定股数)+ 移出(策略→全量)。
**待确认细节**
1. 全部持仓 tab 是否也显示已分配到策略的份额(灰色/标注)?
2. 添加时份额输入:一次添加一股数?还是可拆多策略?
3. 「移出」是移出全部份额还是可指定数量?
4. 全部持仓 tab 与「未分配」概念的关系:全部持仓 = 未分配 + 已分配?
### 2026-08-27 · Q5 细节确认(老师确认)
**细节确认结论**
1. **细节1(全部持仓 tab**:A —— 显示完整持仓(1800 股),已分配部分标注(网格 1000 / 做T 800 / 未分配 400);
2. **细节2(添加粒度)+ 细节4(多策略)**
- 每个策略 tab 是独立编辑上下文;
- 添加时份额**默认 0**,用户编辑填入要分配到**当前策略**的份额;
- 每次操作只确定「分配到当前策略」的份额,并更新总持仓的已分配数量;
- **同一标的可在多个策略**(分别在各自策略 tab 下添加,如网格 600 + 做T 800);
- 例:网格 tab 添加 600719.SH 输入 600 → 网格 600;做T tab 再添加输入 800 → 做T 800;已分配 = 1400,未分配 = 400
3. **细节3(移出)**:B —— 指定数量移出(如做T 800 移出 200 → 做T 600,未分配 +200)。
**核心模型**:份额按策略独立维护;添加默认 0 起填;已分配 = 各策略份额之和;未分配 = 总持仓 - 已分配。