diff --git a/DEVLOG.md b/DEVLOG.md index eb96f66..8a87e3e 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -108,6 +108,124 @@ PMS 侧因为新建仓档位默认就是自动执行,**建议收盘后 `make d --- +## 2026-08-06 · 新立一条规矩:动 tradingSystem 以外的系统之前先答三题 + +**做了什么** +用户指出决策系统本来就不管仓位(它是聚合大量信号的判断系统),往里面塞仓位信息 +会把别的在跑的逻辑带偏。据此立了一条通用规矩,并按它把方案重过一遍,改成 V3。 + +**规矩(改 tradingSystem 以外的系统,动手前先答,答不上就别动)** + +1. 这段代码是不是只有我这条路径会走到?共用的提示词模板、裁决解析、上下文组装、 + 配置项,都不能在里面加只对我有意义的分支。 +2. 我加进去的字段,会不会被别的逻辑读到并当真?尤其是写共享表、共享缓存、 + 往共享 context 里塞键。 +3. 我的东西全删掉,原系统能不能一字不差地回到今天?答不上「能」就不是加法。 + +**按规矩核过的结论** +决策系统这三处改动全部落在两段 `if direction == "PMS_JUDGE":` 里 +(`workers/tasks_intraday.py` 439 到 523 行、632 到 656 行),不碰共用的提示词模板 +(557 到 576 行)、共用的裁决解析(579 到 590 行)、资金与板块注入(530 到 555 行); +不写 `decision_ledger`;不加 settings 字段;留痕仍只有 PMS_PASS / PMS_REJECT / +PMS_UNAVAILABLE 三个值,而 `pms_advisor._today_exit_verdict` 第 102 行明确跳过 +`PMS_` 开头的行,所以写进去的东西不会反过来影响择时。第三题答案是能,`git revert` 一次。 + +**额外补的一条:仓位数字不进研判请求** +`judge.request` 现在把 `hard_numbers` 整个塞进请求体,决策系统会逐键渲染进提示词。 +新建仓的 hard_numbers 里有名额、可投金额、批次比例——等于当面请一个不该管仓位的系统 +去看仓位。所以在 PMS 侧加键白名单,只对 OPEN 生效:送现价、分数、主题、档位、 +预期空间、热度、名次;不送名额、金额、批次、组合占比。账本照旧存全量。 + +**重过一遍还改掉与补上的(详见方案 V3 第三节)** +改掉两处:去掉 `PMS_OPEN_TARGET_PCT` 与建持仓行(改由首次成交时既有的 +`ensure_position` 自然建行,省掉僵尸空行的清理);去掉 `PMS_OPEN_MIN_SCORE` +(与候选池的 `PMS_PLAN_MIN_SCORE` 重复)。 +补上六处,其中三条是真问题: +- **候选之间要滚动扣减**。`_route_one` 每条各自用本轮开始时的旧快照算上限, + 一跳内五条各自不超、加起来超,规则闸拦不住。命令那条路有 `_ctx_after` 滚动, + 自主这条没有。滚动放进 `scan_open`,复用 `planner.check_all_caps`。 +- **研判驳回要做当日去重(只对 OPEN)**。`_rejected_today_keys` 只读 arbiter='rule', + 研判驳回不在里面,`_inflight_keys` 也认不出,于是被驳回的候选每分钟往账本写一行 + 一模一样的记录——正是 07-29 那个把判分锚淹掉的教训。 +- **可投金额要用真实可用资金封顶**,并加 `PMS_OPEN_REQUIRE_WS_CASH`: + 拿不到资金快照就不自动新建仓。规则闸那条「拿不到资金只告警不拦」是为已排好的命令 + 设计的,不适合无人值守地从零建仓。 +另外三条:行业名一次批量取本轮复用;研判预算用尽的候选整条跳过不入人工队列; +新建仓退实现B 时择时判据只剩均价一条(已知降级,要在理由里写明)。 + +**一条顺带发现、但这次不夹带的** +`industry.get_many` 走 `gp_stock_category` 时是逐只查库、没有缓存, +可以照 `_hybk_many` 加按日缓存。收益是每跳少几十次查询,但它改的是既有函数的时序行为, +按上面第 1 题的规矩不夹带,要做单独一条、单独拍板。 + +**动了哪些文件** +无代码改动。`NEW_POSITION_ACTION_PLAN.md` 更新为 V3。 + +**部署方式** +不涉及。 + +**真机判收** +未判收(尚未动码)。 + +**还欠着什么** +同上,等点头开工。 + +--- + +## 2026-08-06 · 新建仓动作:两侧代码写完,容器内全量单测通过,待实机部署 + +**做了什么** +按 V3 方案把两侧代码写完了。容器里拼了一份可运行的副本跑全量单测:**ALL SUITES PASS, +451 例**(新增的第十二批 26 例 + 既有 425 例,含装配自检 58 例)。**尚未在实机部署。** + +**动了哪些文件** + +决策系统(`bionic_trader`)一个文件,48 增 4 删,三处全在 `if direction == "PMS_JUDGE":` 块内: +- `workers/tasks_intraday.py`:`_task_by_action` 加 OPEN 建仓判据(含必答「把这只票挑出来的 + 驱动到今天还成不成立」);OPEN 且现价缺失时块内早退回 `UNAVAILABLE`(加仓类有摊薄成本可依, + 建仓没有现价锚就是盲判);边界声明按动作分岔(原句里的「配额」对新建仓不成立)。 + +持仓系统(`tradingSystem`)九个文件: +- `app/core/action_engine.py`:加 `A_OPEN` 并进 `JUDGE_ACTIONS`;新增 `eval_open` 与 + `scan_open`。**既有 `scan()` 一个字未动。** +- `app/services/proposal_service.py`:新增 `_scan_open`(候选池取数、批量取行业、 + 真实资金封顶);`_route_one` 加新建仓特判与档位分支;研判时间预算。 +- `app/services/judge.py`:`OPEN_JUDGE_KEYS` 键白名单,新建仓只送定性材料。 +- `app/services/exec_advisor.py`:存 `observed` 的支撑压力区间;`_check_ref_drift` 首答锁定、 + 偏离即停。 +- `app/services/executor.py`:等待分支看到 `ref_drift` 落一条账本 WARN,**一天一条**。 +- `app/repo/pms_repo.py`:新增只读 `judge_rejected_today` 与 `opened_names_today`。 +- `app/services/param_store.py`:四个新参数的说明、校验、`FAIL_CLOSED`。 +- `config/settings.py`:四个新参数;`PMS_JUDGE_ACTIONS` 默认值加 `OPEN`。 +- `scripts/test_batch12_units.py`(新,26 例)与 `scripts/run_tests.py`(登记新批次)。 + +**写代码过程中改掉的一条设计(单测逼出来的)** +原方案的取数口径抄的是命令驱动那条路:`want = min(单股目标, 剩余额度)`。单测发现它会在 +可投金额只剩一万时开出一只 0.5% 的零头仓位——**拿一个持仓名额换一个永远补不到目标的半截仓, +还挡住了后面真正建得起来的票**。改成「钱不够一整只就不开」,并把与命令那条路的差别写在注释里: +命令是用户明确下了「投这么多」,最后一只缩水是命令的收尾;自主建仓没有这层意思。 + +**部署方式** +- 决策系统:不加配置、不动 `.env` → `git pull` 后 `docker compose restart backend-api worker-brain`。 +- 持仓系统:源码打进镜像 → `make deploy`,跑完 `make test` 要见 ALL SUITES PASS。 + **新建仓档位默认就是 full(自动执行),`make deploy` 一跑完下一个整分钟的心跳就可能真建仓, + 所以务必收盘后部署**,让第一次真实运行发生在次日开盘、人在场的时候。 + +**真机判收** +未判收。判收步骤见 `NEW_POSITION_ACTION_PLAN.md` 第十节,顺序是决策系统先上并手工发一条 +`action=OPEN` 的研判请求,确认理由是在谈从零建仓而不是加仓、且请求体里没有仓位数字。 + +**还欠着什么** +1. 实机部署与八步判收。 +2. 第一周要盯的四个数:每天有几只候选落在买入区间内、研判驳回率、`intraday_exec` 一跳的 + 耗时分布、评审账本每天的行数。 +3. 未夹带的一条:给 `industry.get_many` 的 `gp_stock_category` 分支加按日缓存 + (每跳省几十次库查询,但改的是既有函数的时序行为,单独提、单独拍板)。 +4. 文档补账仍欠着:`WS_INTEGRATION_STATUS.md` 停在 07-30;`BIONIC_PMS_INTERFACE.md` + 要补新建仓这一路(研判闸第五类动作、硬数字裁剪、择时侧零改动)。 + +--- +