tradingSystem/DEVLOG.md

6.7 KiB
Raw Blame History

开发节点记录(三系统量化交易)

这份文件的用途只有一个:让下一次交接不必重新查一遍。 每个重要节点写一条,写完就补,不攒到最后。一条节点包含五样东西: 做了什么、动了哪些文件、部署方式、真机判收结果、还欠着什么。

三个系统的部署方式(改错等于白改):

  • tradingSystemPMS 跑在 factor@factorevaluation,源码打进镜像, 改码必须 make deploy,跑完 make test 见 ALL SUITES PASS盯盘 make watch。 容器时钟是北京时间。
  • bionic_trader决策系统 跑在 192.168.16.188:38000,挂载卷, git pulldocker compose restart backend-api worker-brain 即生效; 新增 env 必须 docker compose up -d --force-recreaterestart 不重读 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_OPENexecutor.py:41BUY_ACTIONS 已含 OPENcommand_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_codesideday.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.0or None 变成 None 提示词渲染成「当前现价 未知 元」。加仓类还有摊薄成本可依,建仓判断没有现价锚不成立。

新撞出来的一条硬约束(工程事实,不是取舍) app/scheduler.py:45 给所有调度任务设了 task_soft_time_limit=240, task_time_limit=300judge.request 是同步阻塞、单次超时上限 90 秒。三只票送研判就是 270 秒,已经超过 软超时。 今天没出事是因为送研判的只有三只持仓票且多数轮次被去重挡掉。新建仓不节流、 候选池默认取前 30 只,第一跳就会捅穿。 处理办法是给单轮扫描一个研判时间预算 PMS_JUDGE_TICK_BUDGET_SEC(默认 150 秒), 用尽就把剩下的候选留到下一分钟的心跳,并写进 skipped 留痕。 这不是节流:一条候选都没丢,也没有按天计的上限,只是让一次心跳做得完。

动了哪些文件 无代码改动。NEW_POSITION_ACTION_PLAN.md 更新为定稿版 V2已放进项目目录。

部署方式 不涉及。定稿版里写明:决策系统这次只改 worker 代码、不动 .env 所以 git pulldocker compose restart backend-api worker-brain 即可; 哪天真要往 .env 写值(比如切研判独立队列)才必须 up -d --force-recreate。 PMS 侧因为新建仓档位默认就是自动执行,建议收盘后 make deploy 让第一次真实建仓发生在次日开盘、人在场的时候。

真机判收 未判收(尚未动码)。

还欠着什么 等点头后开工。开工顺序:决策系统侧先上并用 pms_smoke.py 手工发一条 action=OPEN 的研判请求验证,再回来做 PMS 侧。