Console 决策台

Console 决策台

一个本地入口,做三件事:翻报告、定计划、过门禁。

Console 将 Reader、交易计划台和买卖决策台放在同一个本地服务中,但三个页面的语义归属不同:Reader 是投研层的阅读入口;后两个工作台属于操盘层,把策略内核的判断变成 Human 可确认、可追溯的计划与动作记录。

所有产出都是纯 Markdown,写回你自己的 vault。没有数据库、没有云端、没有账号。

三个页面,一个端口

Reader交易计划台买卖决策台
归属投研层阅读入口操盘层操盘层
用在什么时候日常阅读收盘后定调,盘中记偏差建档、成交前后
解决什么报告聚合与检索决策与执行解耦冲动与流程解耦
产出只读,不产出Brain/交易计划/Brain/买入卖出决策/ + Brain/决策审计/
路由/reader/plan/sop

Reader

把散在不同目录、不同月份里的市场洞察、投资雷达、策略分析、交易记录、持仓和 BrainStorm 聚在一个页面。它只读,不修改 vault。

  • 递归发现:默认目录已预先登记并使用递归模式——新增 YYYY-MM 月份目录、专题目录、标的目录或更深层子目录后,刷新 Reader 就会出现,不需要为每个月修改配置;目录启动时还不存在也没关系,后续由 Agent 创建后同样会被发现
  • 自定义工作区:全新的产出路径只需在 config.jsonreader_custom_paths 登记一条相对或绝对路径(支持 ~),重启后自动生成「自定义工作区」,无需复制整份页面配置
  • 脱敏合成示例:公开版在市场洞察、投资雷达和策略分析目录内各放一份 _示例/ 产物,首次打开就能看到报告结构;示例带 ymos_sample: true 标记,不会被策略路由、复盘或真实统计当作运行证据
ℹ️ 说明

Reader 不管定时任务。任务的启停与运行状态属于 Agents 协议和你的 Agent 宿主,Reader 只负责回答「我有哪些产出、我现在想读什么」。

交易计划台

把明天要做的事,在收盘后的冷静期全部想完写完——盘前定调、审持仓、审观察、列盘中动作。第二天开盘只执行,不在盘中现想。次日盘中还能回填「实际执行了什么」,和昨晚的计划做偏差对比。

买卖决策台

承载完整的交易生命周期:

MARKDOWN
买入逻辑建档 → 建仓准备 → Human 确认成交
  → 持仓管理 / 加仓 / 减仓 / 调整退出规则
  → 平仓验证 → 归档
  • 单笔 Markdown 是交易事实源:买入逻辑建档后即生成决策文件;建仓准备会复现论点、失效信号和退出规则,允许你在成交前修订
  • 事件只追加,不覆盖:成交、加仓、减仓、退出规则调整和平仓都以事件追加——你三个月前怎么想的,永远改不掉
  • 门禁全绿才允许扣扳机:开新仓 / 加仓 / 止盈 / 止损各有一组门;每一次扣扳机、每一次被拦,都写回 Brain/决策审计/
  • 账户与持仓仪表:账户支持分币种、资金期限、资金变更流水;持仓总览从活动单笔文件聚合股数和成本,并从状态机恢复最近一次行情快照。价格过期时显示旧值与更新时间,不伪装成实时行情
重要

真实成交、已执行计划与规则批准必须由 Human 产生。服务端会强制校验身份、合法状态迁移、成交金额、部分卖出余量与全部平仓归零;Agent 可以读取快照做体检、提出建议,但不得代替用户写「已成交」「已执行」或「已验证」。

跑起来

BASH
cd Console
cp config.example.json config.json     # 然后编辑它
python3 server.py

浏览器打开 http://localhost:5273,三个页面共用这一个服务、这一个端口。

💡 提示

需要 Python 3.9+。本地后端零第三方依赖,不用装任何 pip 包。默认只绑 127.0.0.1,不对外暴露。直接打开 HTML 文件只用于界面预览,不会写入正式 Markdown

config.json 改这几项

字段说明
vault_root你的 vault 里 YMOS 所在的绝对路径。留空 = 用本仓库根目录,开箱即可跑
plan_dir交易计划归档目录,默认 Brain/交易计划
audit_dir决策留痕归档目录,默认 Brain/决策审计
trade_dir买入卖出决策的生命周期档案目录,默认 Brain/买入卖出决策;平仓后移入 已平仓/
reader_custom_paths最简单的扩展入口:登记一条路径即得一个自定义工作区
reader_pagesReader 的分区、分类、目录与扫描方式;需要多页面、白名单或「仅最近月份」等高级布局时才改这里
port默认 5273

想改 Reader 显示什么,改配置就行,不用动代码。

三条已经内建的结构

启动 Console 就有,不用配置:

结构拦的是什么
计划与执行分离盘前定调、盘中只执行。防止你在盘面刺激下重新发明规则
append-only 事件流原始论点和每次事件只追加不覆盖。防止你事后把「我早就知道」写进历史
门禁必须显式通过结构性红线由页面计算,不给你「这次算了」的入口

第二条特别重要:能被改写的记录,等于没有记录。你三个月前写的买入理由必须原样躺在那里,周期审计才有东西可读。

换成你自己的规则(重要)

重要

决策台里内置的门禁条目和仓位口径是一份样例,不是标准答案rules.example.json 只演示 UI 规则结构,公开版不提供策略阈值默认答案。长期有效规则应写入 Brain/策略配置/ 的 Strategy Profile,再投影到 Console 所需规则;投影结果不能反向改写 Profile

BASH
cp rules.example.json rules.json       # 然后改成你自己的

Console/rules.json 是 Profile 在操盘层的投影,不是第二套策略真相源。改的时候记住分工:

页面可以决定页面不能决定
字段布局、操作顺序你属于什么策略
提示方式、哪些需要显式确认什么阈值是对的
清单里问哪些问题哪条论点应该成立
是否绕过 Human 最终确认

不要同时维护一套 Profile 和一套跟它矛盾的 rules.json冲突时以 Human 确认过的 Profile 为准。这正是 V4 的核心主张:框架是共用的,策略是你自己的。

💡 提示

页面本身也是作者打样。字段、顺序、页面布局和提醒方式都可以让你的 Agent 按使用习惯修改;但修改操盘页面不能偷偷创造一套与 Profile 冲突的新策略。改造方法见 扩展与生态

从你自己的错误反推该装哪道闸门

这一步 Day 0 做不了——你在这套系统里还没犯过错。跑够样本之后再回来,方法是倒推:

MARKDOWN
找出重复发生的那类偏差
  → 问:它第一次变得可见,是在哪一步?
  → 闸门装在那一步,不是装在亏损发生的那一步

举例:如果你反复「计划买 10% 仓位,实际买了 20%」,闸门不该装在成交确认(太晚了),该装在建仓准备——让金额超出计划时必须写一句理由。别照抄别人的闸门。作者的闸门拦的是作者的弱点,你的弱点大概率不一样。

数据落在哪

MARKDOWN
你的 vault_root/
├── Brain/买入卖出决策/                  ← trade_dir
│   ├── [标的]_[日期].md                 单笔生命周期(append-only 事件流)
│   ├── 买卖决策_状态机.md               账户级快照(最近行情 + Agent 可读体检)
│   └── 已平仓/                          平仓验证后归档
├── Brain/交易计划/                      ← plan_dir
│   └── YYYY-MM/YYYY-MM-DD日交易计划.md  人读的正文 + 机器读的 JSON 围栏
└── Brain/决策审计/                      ← audit_dir
    └── YYYY-MM/YYYY-MM-DD决策记录.md    每次扣扳机 / 被拦截的留痕

计划文件里嵌了 JSON 围栏,既能被人读,也能被页面和 Agent 解析回填。这是 YMOS 一贯的做法:同一份文件,人和机器都能用。

安全边界

  • 服务只绑 127.0.0.1,不监听外网
  • 写入文件名与目录由服务端生成,前端不能提交任意路径——防止越权写入 vault 的任意位置
  • Reader 只能读取配置里明确登记的目录;白名单模式会校验精确文件名
  • 行情、账户资金变化和规则调整记录时间、来源与旧值/新值
  • config.jsonrules.json 已在 .gitignore 里,不会被误提交
  • 数据结构见仓库 Console/TRADE_DATA_CONTRACT.md;回归测试:python3 Console/tests/test_trade_api.py
⚠️ 注意

Reader 页面通过 CDN 加载 markedDOMPurify。断网时页面仍能打开,但 Markdown 会降级为原文显示。这是已知取舍,不影响本地后端的零依赖承诺。

它和三层的关系

组件回答的问题
SOP这件事具体怎么做
Agents 协议谁来做、按什么顺序、能读写什么
Reader投研产出怎么读
两个操盘工作台判断形成后,怎么定计划、过门禁、留证据

Console 不生成分析,也不替你做判断。它做的事只有一件:让你在最容易变形的那一刻,多经过一道物理闸门。