tradingSystem/DEVLOG.md

116 lines
6.7 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.

# 开发节点记录(三系统量化交易)
> 这份文件的用途只有一个:**让下一次交接不必重新查一遍**。
> 每个重要节点写一条,写完就补,不攒到最后。一条节点包含五样东西:
> 做了什么、动了哪些文件、部署方式、真机判收结果、还欠着什么。
>
> 三个系统的部署方式(改错等于白改):
> - **tradingSystemPMS** 跑在 `factor@factorevaluation`,源码打进镜像,
> 改码必须 `make deploy`,跑完 `make test` 见 ALL SUITES PASS盯盘 `make watch`。
> 容器时钟是北京时间。
> - **bionic_trader决策系统** 跑在 `192.168.16.188:38000`,挂载卷,
> `git pull` 后 `docker compose restart backend-api worker-brain` 即生效;
> **新增 env 必须 `docker compose up -d --force-recreate`**restart 不重读 env。
> 容器时钟是 UTC看时间戳先加八小时。
> - **akg-factor-bridge因子桥** 在 `factorevaluation`,容器名 `akg_factor_bridge`
> API 在 8300常驻 API 改码要 compose restart。容器时钟是 UTC。
>
> 记录纪律:判收状态只写「真机见过」或「未判收」两种,不写「应该没问题」。
> 时间一律写北京时间,引用桥或决策系统的日志时间时先加八小时并标注已换算。
---
## 2026-08-06 · 新建仓动作:方案已出,待拍板
**做了什么**
读完 PMS 的动作引擎主链代码,出了《给动作引擎加「新建仓」动作》的方案,等待拍板。
一行代码都还没改。
**读代码得到的、与既有文档不一致的事实(以代码为准)**
1. `OPEN` 这个动作名在 PMS 里**已经存在**,而且从方案到下单的整条管道是通的:
`planner.py:31` 定义 `A_OPEN`、`executor.py:41` 的 `BUY_ACTIONS` 已含 `OPEN`
`command_service.py:647` 已经在用 `action="OPEN"` 写评审账本。
缺的只有自主提议这一段:`action_engine.py:27` 的动作词表没有 OPEN
`action_engine.scan()` 的输入是持仓列表,结构上不可能引入新标的。
2. `caps_ctx(view, ts_code=...)` 对**从未持仓过的票**不会带出行业名,
不显式传 `sector` 的话,行业集中度那道硬拦截会整段静默跳过。
3. 从未持仓过的票在 `pms_position` 里没有行,`update_position` 会影响 0 行。
建行要显式调 `ensure_position`,它只写 `ts_code / status='PLANNED' / updated_at`
4. `command_spec.py` 里那个 `"planner": "..."` 字段**全代码库没有任何一处读它**
真正的分派是 `command_service._dispatch_planner` 里一串硬编码的 `if cmd_type ==`
5. 参考位取数(`ledger_service` 盘前那一跳)只对 `only_open=True` 的持仓取,
候选票没有支撑压力。这对择时实现 A 无影响(它用决策系统自己库里的结论),
但实现 B 的「回踩带」判据对新票是空的。
**动了哪些文件**
无。方案文件 `NEW_POSITION_ACTION_PLAN.md` 已放进 tradingSystem 项目目录。
**部署方式**
不涉及。
**真机判收**
未判收(尚未动码)。
**还欠着什么**
方案第十节的四件待拍板:新建仓的档位怎么给、每天最多新开几只、研判闸这一轮做不做、
盘中参考位漂移要不要加防护。拍板之后才动手。
---
## 2026-08-06 · 新建仓动作:四条取舍已拍板,决策系统侧评估完毕,方案定稿
**做了什么**
四条取舍拍板:新建仓单独一个档位参数且默认开启;不设每日开仓上限,由既有上限、资金、
候选池与择时自己收敛;研判闸这一轮双侧一并加上;参考位漂移做首答锁定加偏离即停。
按第三条读了决策系统的相关代码,方案更新为定稿版 V2。代码仍然一行未改。
**读决策系统代码得到的三条事实(以代码为准)**
1. **择时那一侧一个字都不用改。** `app/services/pms_advisor.py``_advise`
163 到 226 行)从头到尾没有读过 `action` 字段,只用 `ts_code`、`side`、`day.price`。
买入区间由昨夜支撑压力推出,与这笔买单是建新仓还是加老仓无关。
2. **研判那一侧没有任何 action 白名单。** `app/api/main.py:323` 的路由是裸 dict
只校验总开关与 `ts_code` 非空worker 侧 `tasks_intraday.py:512`
`_task_by_action.get(_act, 兜底文案)`。所以今天发 `action="OPEN"` 就能跑通,
但拿到的是给加仓写的兜底文案,后面还跟着一句「仓位纪律不归你管」。
要改的是三处,都在 `workers/tasks_intraday.py`:加一条 OPEN 判据、
OPEN 且现价缺失时显式回 UNAVAILABLE、边界声明按动作分岔。
3. **新票的现价链路最脆弱。** `tasks_intraday.py` 449 到 456 行,新票没有持仓快照,
`fetch_realtime_close` 读不到分钟线时返回 `0.0``or None` 变成 None
提示词渲染成「当前现价 未知 元」。加仓类还有摊薄成本可依,建仓判断没有现价锚不成立。
**新撞出来的一条硬约束(工程事实,不是取舍)**
`app/scheduler.py:45` 给所有调度任务设了 `task_soft_time_limit=240, task_time_limit=300`
`judge.request` 是同步阻塞、单次超时上限 90 秒。**三只票送研判就是 270 秒,已经超过
软超时。** 今天没出事是因为送研判的只有三只持仓票且多数轮次被去重挡掉。新建仓不节流、
候选池默认取前 30 只,第一跳就会捅穿。
处理办法是给单轮扫描一个研判时间预算 `PMS_JUDGE_TICK_BUDGET_SEC`(默认 150 秒),
用尽就把剩下的候选留到下一分钟的心跳,并写进 skipped 留痕。
**这不是节流:一条候选都没丢,也没有按天计的上限**,只是让一次心跳做得完。
**动了哪些文件**
无代码改动。`NEW_POSITION_ACTION_PLAN.md` 更新为定稿版 V2已放进项目目录。
**部署方式**
不涉及。定稿版里写明:决策系统这次只改 worker 代码、不动 `.env`
所以 `git pull``docker compose restart backend-api worker-brain` 即可;
哪天真要往 `.env` 写值(比如切研判独立队列)才必须 `up -d --force-recreate`
PMS 侧因为新建仓档位默认就是自动执行,**建议收盘后 `make deploy`**
让第一次真实建仓发生在次日开盘、人在场的时候。
**真机判收**
未判收(尚未动码)。
**还欠着什么**
等点头后开工。开工顺序:决策系统侧先上并用 `pms_smoke.py` 手工发一条
`action=OPEN` 的研判请求验证,再回来做 PMS 侧。
---
<!--
下一条节点从这里往下写,格式照抄上面:
## YYYY-MM-DD · 一句话标题
**做了什么** / **动了哪些文件** / **部署方式** / **真机判收** / **还欠着什么**
-->