tradingSystem/docs/技术面接入与三源合议_进度交接_2026-09-11.md

112 lines
11 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.

# 技术面接入与三源合议 · 进度交接2026-09-11
> 这份文档给下一次接手新开上下文用。对照《技术面接入与三源合议方案_2026-09-11.md》
> 说清做到哪、剩什么、剩下的接入怎么做、有哪些坑。配合 DEVLOG.md 最新几条节点一起读。
## 一句话现状
技术面接入(工作包一)已完成并在模拟仓 155 真机判收通过;三源合议(工作包二)的三块「大脑」——纯逻辑、装配服务、仓位矩阵——已完成、开发机全量绿、已提交;剩下的是把它们**接进下单链路**(扫描分流、增持门、候选排序、页面合议行),这是全工作包风险最高的地方,留给下一轮专注做。另有提议卡重构(用户临时要求)已完成。
## 一、对照方案的工作包进度
| 工作包 | 内容 | 状态 |
|---|---|---|
| 一 技术面取数落表映射与页面 | 新表、tech_repo、tech_service、调度位、三接口、页面四项 | **完成 + 155 真机判收**(映射覆盖 176/177 |
| 二 三源合议与仓位矩阵 | 见下方拆解 | 三块大脑完成,接入未做 |
| 三 离场纪律 | eval_tech_exit、SAR 盘中止损线、紧止盈自动挂载 | **未做** |
| 四 选股系统打分 | akg-factor-bridge 仓库改质地调整分 | **未做**(另一仓库,单独审批) |
| 五 文档台账登记 | 台账 006-011、README 调度总表、接口契约 | 部分(见下) |
| 额外 | 提议卡重构(卡面结论 + 弹窗详情 + 技术面行) | **完成**,本地冒烟过,未 155 真机判收 |
**工作包二拆解:**
- 纯逻辑三模块 `app/core/fund_rules.py`、`timing_rules.py`、`consensus.py`**完成**tech_rules 工作包一已做)。
- 装配服务 `app/services/consensus_service.py` + `downstream_repo.fetch_nightly_verdicts`(批量读昨夜定性):**完成**。
- `advice_service.advise_v2()` 基本面×技术面仓位矩阵:**完成**(旧 advise 原样保留)。
- 新建仓扫描接入合议路由:**未做**。
- 持仓增持门:**未做**。
- 候选按基本面立场排序:**未做**。
- 提议卡合议行(页面):**未做**(提议卡已重构成四行来源,合议行加第五行或顶部结论)。
## 二、提交与部署状态
远程origin 在 192.168.18.24,分支 main当前到 `0dd5b68`。八个提交:
```
0dd5b68 三源合议工作包二(三)advise_v2 基本面×技术面仓位矩阵
be7884d 三源合议工作包二(二):装配服务与批量读昨夜定性
84207d5 三源合议工作包二(一):基本面/择时/合议三个纯逻辑模块
5fa6881 修技术面分页:按 matched 拉完,不再用页大小判最后一页
a33bae5 修 batch20 提议卡守卫断言propVerdictLine 重构后移进详情弹窗
83022e1 提议卡重构:卡面留结论、详情进弹窗、加技术面
d895802 技术面接入工作包一(页面):顶栏新鲜度芯片、持仓研究面列、单票抽屉技术面节
0d39845 技术面接入工作包一(后端):取数落表、相位合成与映射打通
```
**模拟仓 155 当前部署到 `be7884d`**(分页修复那次 git pull 拉到的)。`0dd5b68`advise_v2已推远程但 155 未拉——advise_v2 是新函数、还没被调用155 缺它不影响运行,下次部署接入时一起拉即可。
**真实仓 188 未动**(本次全部在模拟仓 155
## 三、真机判收状态(只写「真机见过」或「未判收」)
- 工作包一技术面:**真机见过**。155 上 `make test` ALL SUITES PASS、20 张表就绪pms_tech_daily 建出)、`pull_and_map` 分页拉全 4991、映射覆盖 176/177 只(看空 54 / 中性 111 / 看多 11。明天 6:30 调度会自动这样拉。
- 提议卡重构:**未判收**。开发机注入假提议起本地服务截图确认卡面四行结论、技术面弹窗三指标块、公司深度弹窗四段分组渲染正确、不白屏155 上要等真实提议才判收。
- 工作包二三块:**未判收**(还没接入,没有运行路径;开发机全量单测 771 例绿)。
## 四、真机抓到并修掉的两个坑(脱库单测测不到,都加了哨兵)
1. **upsert 的 ON DUPLICATE 用绑定参数触发 pymysql 批量陷阱**`ON DUPLICATE KEY UPDATE col = :col` 在 executemany 多行合并时UPDATE 子句的占位符不展开却仍算参数5000 行批量落表参数错位、SQL 留裸 % 报 1064。改用 `VALUES(列)` 引用插入值。哨兵在 test_batch27。
2. **分页误判最后一页**:接口每页上限 1000 < 页大小 1500旧逻辑返回数小于页大小第一页就判到底只落 1000/4991改为优先按 `matched` 终止空页停页大小设 1000哨兵在 test_batch27
两个都是脱库单测 mock 了落表 / 注入了 fetch测不到真实 SQL 与真实接口分页」, 155 真机首验才暴露下一轮接入后同样要 155 判收别只信开发机单测
## 五、剩下的接入怎么做(下一轮的活)
**核心洞察:合议接入完全复用现有「判决分流」的手法。** `action_engine.scan_open` 循环里`app/core/action_engine.py` 780-800 已经有一套判决分流在名额判断**之前** verdict 分流——仅展示不占名额关注打 needs_user_confirm候选放行而且开关`params["open_route_by_verdict"]`关掉时那段一行不执行旧行为逐字保留合议路由要的是同一件事照抄这个位置和手法
**四处改动,每处都要守「开关关掉即逐字回旧」:**
1. **`proposal_service._scan_open` 289 行调 `ae.scan_open` 之前**`PMS_CONSENSUS_ROUTE` 开着时对候选 `cands` 批量装配合议——一次取昨夜定性`consensus_service.nightly_map`和技术面映射`consensus_service.state_map`逐只 `consensus_service.assemble` `consensus` route/四块 `hard_keys` 的六键挂到每个 cand开关关掉整段不做cands 原样进 `scan_open`
2. **`action_engine.scan_open` 792 判决分流 `VERDICT_DISPLAY` 那段之后名额判断之前**加合议分流纯逻辑读 cand 上挂好的 `consensus.route`跳过/观察 skipped观察的处置词 `wait_tech`)、`continue`不占名额不占金额交人 needs_user_confirm 与原因放行 照常开关走 `params["consensus_route"]`
3. **`advice_service`**候选定档改用 `advise_v2(c, params, fund=..., tech=...)`矩阵fund/tech cand 挂的合议四块取六键进硬数字**六键一个都不进 `judge.OPEN_JUDGE_KEYS`**附录丁)。`advise_v2` 已写好开发机验过矩阵逐格落点在候选组装 `action_engine._open_candidate` 611-716 `proposal_service._make_proposal` 848 现在那里调 apply_judge/resize要接上 advise_v2 那一档并让数量按它重算沿用 resize_to_advice)。
4. **持仓增持门(`action_engine`**合议看空停增持侧三类回踩补足 eval_fill盈利加仓 eval_add补仓 eval_dca技术面看空跳过回踩补足与盈利加仓基本面看空跳过补仓**减持侧不受门影响**。持仓行的合议由 `consensus_service` 早上装配类似 logic_state decorate_positions挂到持仓行给动作引擎读
**候选排序(工作包二第 4 点)**`plan_feed.select_candidates` 先按基本面立场分桶看多桶在前再按分数在主题限额与截断之前生效技术面不参与排序只当门观察档里质地看多的行进池默认关`PMS_PLAN_OBSERVE_IF_FUND_BULL` 默认 False)。
**页面合议行**提议卡已重构成四行来源选股系统/决策系统/公司深度/技术面合议再加一行合议显示三方多数方向与强弱点开看三票与路由理由候选栏每行加质地与技术芯片处置词 `wait_tech`等技术面开口管理视图持仓总览修一处证据列印两遍的显示错误并加研究面列
**哨兵与登记**动作求值器次序若加 eval_tech_exit工作包三要改哨兵六键不进 OPEN_JUDGE_KEYS 要在 test_batch28 或新批次加断言`PMS_CONSENSUS_WEAK_CONFIRM`合议一方表态强制交人目前未登记consensus.decide 内置了一方表态交人」,若要开关控制需 decide 加参数并登记)。
**参数**`PMS_FUND_REQUIRED`、`PMS_FUND_STALE_DAYS`、`PMS_FUND_CONSENSUS_GOOD_MIN`、`PMS_CONSENSUS_ROUTE` 已登记进 param_store RUNTIME_EXTRA接入时若读新参数 `PMS_TECH_GATE_INCREASE` 增持门、`PMS_PLAN_RANK_BY_QUALITY` 排序、`PMS_TECH_VOL_CONFIRM` 盘中放量要同步登记且保证有读取处否则死参数扫描红)。
## 六、pending 清单
1. **155 部署 advise_v2 与后续接入**现部署在 be7884d 0dd5b68 及之后的接入接入做完一起部署收盘后或盘前先经用户审批本次曾把宿主 UTC 误当北京时间盘中当盘前部署过务必看容器内时间容器 `datetime.now()` 是北京时间宿主 `date` UTC)。
2. **README 调度总表补齐**工作包五现描述九个调度位过时实际 13 06:30 tech_pull)。
3. **台账 007-011**工作包五目前只补了 006技术面相位与五阈值)。007 基本面立场规则008 待定009 合议路由010 SAR 离场011 弱基本面紧止盈随对应工作包补
4. **工作包三(离场纪律)、工作包四(选股打分,另一仓库单独审批)** 未做
5. **提议卡重构 155 真机判收** 155 有真实提议时看卡面四行点弹窗
## 七、验证命令
**开发机(跑全量单测,用临时 venv。** 预期最后一行 ALL SUITES PASS
```bash
cd /Users/baobao/Documents/work/project/tradingSystem && /private/tmp/claude-501/-Users-baobao-Documents-work-project-tradingSystem/f7c4a696-e3d8-4465-961a-04f82eb3e424/scratchpad/venv/bin/python scripts/run_tests.py
```
venv 在会话 scratchpad 跨会话要重建`python3 -m venv <venv> && <venv>/bin/pip install -r requirements.txt`。)
**模拟仓 155部署与判收重建容器先经用户审批看容器内北京时间避开盘中。** 预期 make test 见 ALL SUITES PASSpull_and_map 行数五千上下、映射只数接近持仓加候选。
```bash
cd /home/factor/project/tradingSystem && git pull --ff-only && make deploy && make test && docker compose run --rm --no-deps pms-web python -c "from app.services import tech_service as t; import json; print(json.dumps(t.status(), ensure_ascii=False)[:400])"
```
## 八、下一轮的第一步
读这份文档 + DEVLOG 最新两条节点 + 方案第五节工作包二第 5-6 点 + 附录乙丙丁;然后从「五、剩下的接入」的第 1、2 处开始proposal_service 装配挂候选 + action_engine.scan_open 合议分流),每处先写「开关关掉时逐字节相同」的单测再改,改完开发机全量绿、再 155 判收看提议真按合议分流。