diff --git a/EXPERT_SYSTEM_DESIGN.md b/EXPERT_SYSTEM_DESIGN.md deleted file mode 100644 index a720718..0000000 --- a/EXPERT_SYSTEM_DESIGN.md +++ /dev/null @@ -1,418 +0,0 @@ -# MoFin 专家系统 — 完整架构文档 v2.0 - -> 最后更新:2026-06-12 -> 维护人:莫荷(Hermes Agent) -> 铁律:任何系统改动必须先读本文档,改完必须同步更新 - ---- - -## 一、核心理念 - -``` -每份分析都成为下一次分析的养料 -每次建议都成为下一次建议的参考 -从内到外(知识→分析),从外到内(分析→沉淀)的持续闭环 -``` - -## 二、股票操作策略生命周期 - -``` - ┌─────────────────────────────┐ - │ 大环境+行业趋势研判 │ - │ (盘前热点扫描·每天8:30) │ - │ 板块扫描→发现新标的 │ - └──────────┬──────────────────┘ - │ 写入 watchlist.json - ▼ - ┌─────────────────────────────┐ - │ 自选股池 (watchlist.json) │ - │ │ - │ 🟢 可操作 — 价格在买入区内 │ - │ 🟡 关注 — 距触发3~5% │ - │ ⚪ 观察 — 距触发>5% │ - │ │ - │ 监控: │ - │ • 快速盯盘(每15分钟) │ - │ • 持仓情报-盘后(每天) │ - │ • 自选股体检(每周六) │ - └──────────┬──────────────────┘ - 进入买入区 │ 建仓 - ▼ - ┌─────────────────────────────┐ - │ 持仓股 (portfolio.json) │ - │ │ - │ 监控: │ - │ • 价格监控(每分钟·纯脚本) │ - │ • 快速盯盘(每15分钟·LLM) │ - │ • 持仓情报-盘中(每小时·LLM) │ - │ • 持仓情报-盘后(每天·LLM) │ - │ • 分析师-持仓复查(每周·LLM) │ - └──────────┬──────────────────┘ - 触发止损/止盈/清仓 │ - ▼ - ┌─────────────────────────────┐ - │ 回到自选股池 │ - │ (保留策略,等待下次机会) │ - └─────────────────────────────┘ -``` - -## 三、系统架构总览 - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ MoFin 专家系统 v2.0 │ -├──────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌─────────────────────────┐ ┌──────────────────────────────┐ │ -│ │ 基础设施层(纯脚本) │ │ 分析层(LLM驱动) │ │ -│ │ 0配额消耗 │ │ 每次运行消耗1次配额 │ │ -│ │ │ │ │ │ -│ │ • 价格监控(1分钟) │ │ • 盘前热点扫描(8:30) │ │ -│ │ 腾讯批量API拉所有股票 │ │ → 持仓分析+板块扫描 │ │ -│ │ 写入portfolio/watchlist│ │ → 新机会发现→写入watchlist│ │ -│ │ 比对区间触发→输出 │ │ │ │ -│ │ │ │ • 集合竞价观察(9:28) │ │ -│ │ • 市场数据采集(30分钟) │ │ → A股竞价异常监控 │ │ -│ │ 板块数据→market.json │ │ │ │ -│ │ │ │ • 快速盯盘(每15分钟) │ │ -│ │ • 数据同步(8:55) │ │ → 持仓操作窗口+自选接近提醒 │ │ -│ │ update_data+server检查│ │ │ │ -│ │ │ │ • 持仓情报-盘中(每小时40分) │ │ -│ │ • XMPP中继(每分钟) │ │ → 详细盘中分析 │ │ -│ │ 扫输出目录→推知微 │ │ │ │ -│ │ │ │ • 持仓情报-盘后(20:00) │ │ -│ │ • 港股低延迟行情中继 │ │ • 分析师-持仓复查(周四20:00) │ │ -│ │ tdx-relay (Windows) │ │ → 基本面深度复查 │ │ -│ │ opentdx→招商证券7727 │ │ │ │ -│ │ POST → /api/update/ │ │ │ │ -│ │ realtime │ │ │ │ -│ └─────────┬───────────────┘ │ │ │ -│ │ │ │ │ -│ ▼ │ │ │ -│ ┌─────────────────────────┐ │ │ │ -│ │ 数据层 │ │ │ │ -│ │ portfolio.json(持仓) │ │ │ │ -│ │ watchlist.json(自选) │ │ → 每只自选评估:保留/移除 │ │ -│ │ decisions.json(决策库) │ │ │ │ -│ │ market.json(板块数据) │ │ • 知微周复盘(周日22:00) │ │ -│ │ daily_reviews.json │ │ → 周度总结 │ │ -│ │ stock_profiles.json │ └──────────┬───────────────────┘ │ -│ └─────────┬───────────────┘ │ │ -│ │ │ │ -│ ▼ ▼ │ -│ ┌──────────────────────────────────────────────────────────┐ │ -│ │ 推送层 │ │ -│ │ cron_to_xmpp.py(每分钟·纯脚本) │ │ -│ │ 扫描 ~/.hermes/cron/output/*/ 目录 │ │ -│ │ 发现新 .md 文件 → 提取正文 → XMPP推送【知微】 │ │ -│ │ 已推送的记在 .relay_journal.json,不重复推 │ │ -│ └──────────────────────────────────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ -``` - -## 四、完整 Cron Job 清单(14个) - -### 🟢 基础设施层(纯脚本,0配额消耗) - -| # | 名称 | 频率 | 脚本 | 输出 | 说明 | -|---|------|------|------|------|------| -| 1 | **价格监控-1分钟** | 工作日 每分钟(9-11/12/13-16) | `price_monitor.py` | 有触发→推送;无→SILENT | 腾讯批量API拉所有股票实时价,写入portfolio/watchlist,比对区间触发条件 | -| 2 | **市场数据采集** | 工作日 每30分钟 | `market_watch.py` | 成功→SILENT;失败→报错 | 东方财富API采集板块数据→market.json | -| 3 | **数据同步-dashboard** | 每天 8:55 | `sync_dashboard.py` | 有数据→推送;无→SILENT | 跑update_data.py+检查server,挂了自动重启 | -| 4 | **cron-推XMPP中继** | 工作日 每分钟(9-16) | `cron_to_xmpp.py` | 有新报告→推送;无→静默 | 扫所有job输出目录,推新报告到XMPP | -| 5 | **中继-16点收盘** | 工作日 16:00-16:10 | `cron_to_xmpp.py` | 同上 | 收盘时段推港股报告 | - -### 🔵 分析层(LLM驱动,每次1次配额) - -| # | 名称 | 频率 | 关键职责 | 价格获取方式 | -|---|------|------|---------|------------| -| 6 | **盘前热点扫描** | 工作日 8:30 | 持仓分析+**板块扫描→新机会发现→写入watchlist** | 读文件(price_monitor刷新) | -| 7 | **集合竞价观察** | 工作日 9:28 | A股竞价异常监控,无异常SILENT | A股curl竞价价+港股读文件 | -| 8 | **快速盯盘-15分钟** | 工作日 每15分钟 | 持仓操作窗口+**自选股接近买入区提醒**,无则SILENT | 读文件 | -| 9 | **持仓情报-盘中** | 工作日 每小时40分 | 详细盘中分析+异动搜因 | 读文件 | -| 10 | **持仓情报-盘后** | 工作日 20:00 | 完整复盘+**自选股回顾**+数据沉淀daily_reviews | 读文件 | -| 11 | **分析师-持仓复查** | 周四 20:00 | 每周基本面深度复查 | 读文件 | -| 12 | **自选股体检-每周** | **周六 20:00 🆕** | 每只自选评估:已建仓→移除、>30天未接近→建议移除、行业变化→更新理由 | 读文件+web_search | -| 13 | **知微周复盘** | 周日 22:00 | 周度总结 | 读文件 | -| 14 | **策略评估-每日** | 工作日 21:00 | 双维度评估36条策略,生成反馈闭环 | 读文件+LLM | 无变化→SILENT | -| 15 | **建议对账-每周** | 周六 20:00 | 对比建议vs实际持仓变化,算准确率 | 纯脚本 | 有数据→推送 | -| 16 | **策略评估-每周** | 周六 21:00 | 完整评分+趋势分析+策略参数调整 | 纯脚本 | 有数据→推送 | - -## 五、数据文件 - -| 文件 | 路径 | 作用 | 更新频率 | 更新者 | -|------|------|------|---------|--------| -| 持仓数据 | `data/portfolio.json` | 持仓快照+实时价 | 每分钟 | price_monitor | -| 自选数据 | `data/watchlist.json` | 自选股列表+买入区+实时价 | 每分钟 | price_monitor+盘前扫描+自选体检 | -| 决策库 | `data/decisions.json` | 策略+trigger+建议历史+评估数据 | 每次讨论后+每日评估 | LLM job+策略评估 | -| 每日复盘 | `data/daily_reviews.json` | 当日判断+修正沉淀 | 每日20:00 | 持仓情报-盘后 | -| 股票档案 | `data/stock_profiles.json` | 行业/业务/逻辑 | 发现新信息时 | LLM | -| 市场数据 | `data/market.json` | 板块涨跌+概念热度 | 每30分钟 | market_watch | -| 价格事件 | `data/price_events.json` | 价格触发记录(止盈/止损/买入区) | 每分钟 | price_monitor | -| 评估结果 | `data/evaluation.json` | 双维度评估+评分 | 每天21:00 | 策略评估 | -| 准确率统计 | `data/accuracy_stats.json` | 建议对账+准确率 | 每周六20:00 | 对账脚本 | -| 反馈闭环 | `data/strategy_feedback.json` | 反馈+调整建议+知识萃取 | 每天21:00 | 策略评估 | -| 区间偏离 | `~/.hermes/zone_breach.json` | 价格偏离标记 | 每分钟 | price_monitor | -| 触发状态 | `~/.hermes/price_trigger_state.json` | 每只股票各区间的进出状态 | 每分钟 | price_monitor | -| relay状态 | `data/relay_state.json` (新增) | tdx-relay在线/离线状态 | 每分钟 | server.py(update/realtime更新) | - -## 六、数据流转 - -``` -tdx-relay (Windows·xxm负责) - │ opentdx → 招商证券7727扩展行情服务 - │ 拉取17只港股实时行情(1~3秒延迟) - │ POST → http://192.168.1.246:8899/api/update/realtime - │ - ├──→ server.py 接收 → 更新 portfolio.json / watchlist.json - │ 港股 data_source = "tdx_relay" - │ 更新 relay_state.json - │ - └──→ price_monitor 检测 relay 状态 - relay 在线 → 跳过港股腾讯API拉取(保留实时价) - relay 离线(>60秒) → 回退腾讯 API 兜底 - -price_monitor(每分钟) - │ 腾讯批量API 1次请求 - │ - ├──→ portfolio.json (持仓实时价) - ├──→ watchlist.json (自选实时价) - ├──→ 比对decisions.json的trigger区间 - ├──→ 有触发 → 输出 → 中继 → 知微 - └──→ 无触发 → [SILENT] → 丢弃 - -market_watch(每30分钟) - │ 东方财富API - └──→ market.json (板块数据) - -盘前热点扫描(每天8:30) - │ 读 market.json → 分析强势板块 - │ 发现新标的 → 写入 watchlist.json - └──→ 输出报告 → 中继 → 知微 - -快速盯盘(每15分钟) - │ 读 portfolio.json + watchlist.json - │ 持仓操作窗口 + 自选接近买入区 - └──→ 有发现 → 输出 → 中继 → 知微 - -持仓情报-盘后(每天20:00) - │ 读 portfolio.json + watchlist.json - │ 持仓回顾 + 自选回顾 - └──→ 写入 daily_reviews.json - └──→ 输出报告 → 中继 → 知微 - -自选股体检(每周六20:00) - │ 读 watchlist.json + portfolio.json - │ 每只评估:保留/移除/更新 - └──→ 输出报告 → 中继 → 知微 -``` - -## 七、报告推送策略 - -| 报告 | 推送 | 频率 | 静默规则 | -|------|------|------|---------| -| 价格监控 | ✅ 有触发才推 | 每分钟 | 无触发→[SILENT] | -| 盘前扫描 | ✅ | 每日1次 | 有发现才写 | -| 集合竞价 | ✅ 有异常才推 | 每日1次 | 无异常→SILENT | -| 快速盯盘 | ✅ 有发现才推 | 每15分钟 | 无操作窗口+无自选接近→SILENT | -| 持仓情报-盘中 | ✅ 有发现才推 | 每小时40分 | 无操作窗口→合并后停止 | -| 持仓情报-盘后 | ✅ | 每日20:00 | 有实质内容才写 | -| 分析师复查 | ✅ | 每周四 | 有发现才写 | -| 自选股体检 | ✅ | 每周六 | 有建议才写 | -| 知微周复盘 | ✅ | 每周日 | 有实质内容才写 | -| 市场数据采集 | ❌ 不推 | 每30分钟 | 只写文件 | -| 数据同步 | ✅ 有数据才推 | 每天8:55 | 无更新→SILENT | - -## 八、关键设计决策 - -| 方面 | 决策 | 原因 | -|------|------|------| -| 价格获取 | 腾讯批量API `qt.gtimg.cn/q=sh600110,sz000001,...` | 1次请求拉所有股票,无频率限制 | -| 价格监控类型 | 纯脚本(`no_agent=True`) | 不需要LLM,0配额消耗 | -| 中继类型 | 纯脚本(`no_agent=True`) | 文件扫描+XMPP推送,不需要LLM | -| 市场数据采集 | 纯脚本(`no_agent=True`) | 只写文件不输出,不需要LLM | -| 数据同步 | 纯脚本(`sync_dashboard.py`) | 包装脚本含server检查,不需要LLM | -| LLM job价格来源 | 读文件(price_monitor每1分钟刷新) | 不再逐个curl,节省配额 | -| 新机会发现 | 合并到盘前热点扫描(每天) | 每天分析板块数据,发现新标的写入watchlist | -| 自选股进出管理 | 自选股体检(每周六) | 系统评估+提请确认,不自动删除 | -| 午休 | 价格监控跳过12:05-12:55(保留12:00) | A股午休无行情 | - -## 九、配额消耗估算(一个上午) - -| 组件 | 运行次数 | 配额消耗 | -|------|---------|---------| -| 价格监控 | ~240次(每分钟) | **0** (纯脚本) | -| 市场数据采集 | ~10次 | **0** (纯脚本) | -| 数据同步 | 1次 | **0** (纯脚本) | -| XMPP中继 | ~240次 | **0** (纯脚本) | -| 盘前热点扫描 | 1次 | **1次** | -| 集合竞价 | 1次 | **1次** | -| 快速盯盘 | ~20次 | **~20次** (有操作窗口才跑,无则SILENT不消耗) | -| 持仓情报-盘中 | ~6次 | **~6次** | -| 策略评估-每日 | 1次 | **1次** | -| **总计** | | **~29次 LLM调用** | - ---- - -## 十、策略评估反馈闭环架构 - -### 核心流程 - -``` -price_monitor(每分钟·纯脚本) - │ 腾讯批量API拉所有股票实时价 - │ 比对策略区间 → 触发 → 记录到 price_events.json - │ - ├──→ 价格触发事件持久化(price_events.json) - │ event_type: entry_zone / stop_loss / take_profit - │ code, name, price, trigger_value, timestamp - │ - ▼ -strategy_evaluator(每天21:00·纯脚本) - │ 读 decisions.json + price_events.json + portfolio.json - │ 双维度评估每只股票: - │ 阶段一(策略制定→价格达标): - │ - 理论:价格是否达到过止盈/止损/买入区 - │ - 实际:持仓盈亏、建议执行情况 - │ 阶段二(价格回落→新止损验证): - │ - 新止损是否被后续走势验证 - │ 写入 decisions.json 的 evaluation 字段 - │ - ├──→ 写入 evaluation.json - │ - ▼ -strategy_feedback(每天21:00·纯脚本,评估后自动) - │ 读 evaluation.json - │ 自动决策: - │ - 价格达到止盈 → 标记阶段一成功,萃取经验 - │ - 跌破止损 → 标记阶段一失败,生成新区间 - │ - 14天无触发 → 标记 stale,建议重评 - │ - 准确率持续下降 → 收紧区间宽度 - │ 写入 strategy_feedback.json - │ - ├──→ 写入 strategy_feedback.json - │ - ▼ -每日评估 cron(每天21:00·LLM驱动) - │ 读 strategy_feedback.json - │ 处理反馈 → 更新策略 → 输出日报 - │ 无变化 → [SILENT] - │ - ▼ -盘后知识萃取(每天16:30·LLM驱动) - │ 读 feedback 中的 knowledge 字段 - │ 写入 analyst-knowledge-log.md - │ - ▼ -建议对账(每周六20:00·纯脚本) - │ 对比 advice_timeline vs portfolio.json - │ 算准确率 → 写入 accuracy_stats.json - │ - ▼ -策略评估-每周(每周六21:00·纯脚本) - │ 完整评分 → 趋势分析 → 策略参数调整 - │ 写入 evaluation.json + strategy_feedback.json -``` - -### 双维度评估模型 - -| 维度 | 阶段一 | 阶段二 | -|------|--------|--------| -| 理论(策略规划) | 价格是否达到止盈/止损/买入区?何时?理论盈亏? | 新止损是否被后续走势验证? | -| 实际(用户执行) | 实际持仓盈亏?建议是否被采纳? | 用户是否按新止损操作?实际损失? | - -### 反馈引擎自动决策规则 - -| 检测条件 | 自动动作 | -|----------|----------| -| 价格达到止盈位 | 标记阶段一成功,萃取经验到知识日志,创建新自选策略 | -| 跌破止损位 | 标记阶段一失败,分析原因,生成新止损/买入区间 | -| 策略14天未触发任何区间 | 标记为 stale,建议重新评估基本面和技术面 | -| 准确率持续下降(<50%) | 收紧策略区间宽度(10%→8%) | -| 准确率持续上升(>80%) | 放宽策略区间宽度(10%→12%) | - ---- - -## 十、v2.0 更新说明(2026-06-09) - -本次更新基于知微与莫荷、老爸的深入讨论,对系统做了全面重构。以下记录讨论过程中的关键意图、决策和待办事项。 - -### 本次改动驱动因素 - -1. **火山引擎(volcengine) 429配额超限** → 触发对 provider 配置和 fallback 链的全面梳理 -2. **发现价格监控逐个curl拉取价格** → 效率极低且浪费配额,触发了对价格获取方式的全面改造 -3. **知微反馈"问了不在回答长篇报告"** → 触发了对 session 管理、system prompt、对话识别机制的修复 -4. **老爸指出持仓和自选股之间的动态生命周期关系** → 触发了对股票操作策略完整生命周期的重新设计 - -### 已完成的改造 - -**基础设施层:** -- 价格监控从 LLM驱动(每5分钟) 改为 纯脚本(每1分钟),使用腾讯批量API一次拉所有股票 -- XMPP中继从 LLM驱动 改为 纯脚本(每1分钟) -- 市场数据采集从 LLM驱动 改为 纯脚本 -- 数据同步从 LLM驱动 改为 纯脚本(含server检查包装脚本) -- 所有LLM job的价格获取从"逐个curl拉取"改为"直接读文件(price_monitor每1分钟刷新)" - -**股票生命周期完善:** -- 新机会发现:合并到盘前热点扫描(每天8:30),板块扫描→发现新标的→写入watchlist -- 自选接近提醒:快速盯盘(每15分钟)新增自选接近买入区(<5%)单独提醒 -- 自选回顾:持仓情报-盘后(每天20:00)新增自选股回顾板块 -- 自选体检:新增每周六20:00的自动评估+建议移除/保留 - -**provider配置统一:** -- 莫荷(默认profile):默认ocg-old(旧key) → fallback ocg-new(新key) → volcengine(火山) -- 知微(position-analyst):默认volcengine(火山) → fallback ocg-old(旧key) → ocg-new(新key) -- 火山已恢复可用 - -**对话机制修复:** -- 知微SOUL新增对话上下文识别规则(打招呼vs分析请求vs模糊提问) -- 知微SOUL新增系统自动追加消息(bg-review)说明 -- position-analyst启用压缩(protect_last_n=200, hygiene_hard_message_limit=400) - -**策略评估反馈闭环(v2.0 深夜追加):** -- 价格事件持久化:price_monitor每分钟记录价格触发事件到price_events.json -- 双维度评估:strategy_evaluator每天评估36条策略,分阶段一(策略制定→价格达标)和阶段二(价格回落→新止损验证),每个阶段同时记录理论盈亏和实际盈亏 -- 反馈引擎:strategy_feedback自动检测止盈/止损/stale策略,生成调整建议,萃取知识到知识日志 -- Dashboard评估tab:展示评分、理论vs实际盈亏对比、反馈闭环卡片 -- 建议对账:advice_reconciliation.py每周对比建议vs实际持仓变化算准确率 -- 36条策略全部填充建议记录,平均分4.8/10 - -### 设计原则/意图 - -1. **知微是分析师,不是决策者** — 她出建议,老爸决定是否执行,是否执行的唯一真相来源是截图/持仓更新 -2. **莫荷是参谋,不是执行者** — 莫荷出报告和建议,不做交易操作 -3. **建议≠事实** — 不能假设建议=被执行,需要等持仓更新来验证 -4. **持仓/自选动态循环** — 持仓清仓→自动转自选保留策略,自选建仓→自动转为持仓管理 -5. **自选股进出需人工确认** — 系统可以建议移除,但不能自动删除,需老爸确认 -6. **轻对话,重分析** — 不是每条消息都需要全面分析报告,区分打招呼和干活 - -### 尚未完成/待定事项 - -1. **建议自动记录+对账闭环** — 莫荷发出的建议自动记入decisions.json的advice_timeline,每周对比实际持仓变化,统计准确率(✅ 已完成:/api/advice/record + advice_reconciliation.py + accuracy_stats.json) -2. **MoFin Dashboard整合** — server.py应整合所有数据源,包括待确认决策、准确率统计等(✅ 已完成:决策库tab + 评估tab + 反馈闭环tab) -3. **知微XMPP通信通道优化** — 当前xmpp_zhiwei_bot.py断线重连机制有缺陷(Event().wait阻塞),需修复(✅ 已完成:watchdog循环每10秒检查连接状态) -4. **session跨profile检索** — 知微无法搜到莫荷CLI session的内容,需手动转发(✅ 已完成:session_search profile参数可用) -5. **策略双维度评估体系** — 理论策略vs实际执行,分阶段跟踪,自动反馈闭环(✅ 已完成:strategy_evaluator.py + strategy_feedback.py + 每日/每周cron) -6. **价格事件持久化** — price_monitor每分钟记录价格触发事件供回溯评估(✅ 已完成:price_events.json + record_event()) - -### tdx-relay 集成(小小莫Windows端 + 知微Linux端) - -详见单独文档:`TDX_RELAY_COLLAB.md` - -职责分工: -- **小小莫**:Windows端 tdx-relay 开发维护(opentdx→招商证券7727→港股实时行情推送) -- **知微**:Linux端 MoFin API 兼容(/api/update/realtime 已实现,/api/relay/status 待实现)+ price_monitor relay 检测+回退逻辑 - -当前状态: -- ✅ `/api/update/realtime` 端点已在 server.py 中实现 -- ⏳ `relay_state.json` 持久化(待实现) -- ⏳ `/api/relay/status` GET 端点(待实现) -- ⏳ `price_monitor.py` relay 活跃检测(待实现) -- ⏳ relay 离线时自动回退腾讯 API(待实现) - -### 正在进行的优化(2026-06-12) - -1. **报告格式精简** — 老爸反复强调太长无重点。已改为:重点推荐(≤3只)+风险关注(≤3只)+其余持仓一行。全文≤500字。 -2. **技术面分析取代百分比策略** — 支撑/压力位用枢轴点算法,止损=min(强支撑, 成本×0.85),买入区=弱撑~弱压之间,止盈在盈亏比≥1:2处。 -3. **MoFin 决策库重构** — 清空旧记录(标记obsolete),从6月11日起重新记录。新增 active_manual / current_recommend 标签,支持按此筛选排序。新增搜索框。 -4. **格式校验器** — cron_to_xmpp.py 新增 validate_format(),拦截无重点/超长/含模棱两可词语的报告。记录到 daily 汇总(不拦截推送,只记录违规)。 diff --git a/SYSTEM_ARCHITECTURE.md b/SYSTEM_ARCHITECTURE.md deleted file mode 100644 index de0095b..0000000 --- a/SYSTEM_ARCHITECTURE.md +++ /dev/null @@ -1,221 +0,0 @@ -# 莫荷系统架构文档 — 完整总览 - -> 最后更新:2026-06-11 -> 维护人:莫荷(Hermes Agent) -> 铁律:任何系统改动必须先读本文档,改完必须同步更新 - ---- - -## 一、系统总览 - -``` -┌──────────────────────────────────────────────────────────────┐ -│ Linux 192.168.1.246 │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ 默认gateway │ │ 知微gateway │ │ 小果gateway │ │ -│ │ :8642 │ │ :8643 │ │ :8645 │ │ -│ │ 微信+XMPP │ │ position- │ │ xiaoguo │ │ -│ │ mohe网关 │ │ analyst │ │ profile │ │ -│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ ▼ ▼ ▼ │ -│ ┌─────────────────────────────────────────────────┐ │ -│ │ state.db (SQLite) │ │ -│ │ sessions / messages / FTS5 / compression_locks │ │ -│ │ 消息存储:全量保存,永不删除 │ │ -│ │ 上下文加载:最多200条,永不压缩 │ │ -│ └─────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ xmpp_bot │ │ xmpp_ │ │ xmpp_ │ │ -│ │ mohe │ │ zhiwei_bot │ │ xiaoguo_bot │ │ -│ │ mohe@yoin │ │ zhiwei@yoin │ │ xiaoguo@ │ │ -│ │ .fun │ │ .fun │ │ yoin.fun │ │ -│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ -│ │ │ │ │ -│ └──────┬─────────┴────────┬───────┘ │ -│ ▼ ▼ │ -│ ┌──────────────┐ ┌──────────────┐ │ -│ │ ejabberd │ │ 内核组 │ │ -│ │ Docker │ │ coregroup@ │ │ -│ │ port 5222 │ │ conference │ │ -│ └──────────────┘ │ .yoin.fun │ │ -│ └──────────────┘ │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ -│ │ 价格监控 │ │ cron调度器 │ │ Obsidian │ │ -│ │ 1分钟·纯脚本 │ │ 14个jobs │ │ 知识库 │ │ -│ └─────────────┘ └─────────────┘ │ :8890 │ │ -│ └─────────────┘ │ -└──────────────────────────────────────────────────────────────┘ - │ │ - ▼ ▼ -┌─────────────────┐ ┌─────────────────┐ -│ Windows 192.168 │ │ Mac 192.168.1 │ -│ .1.16 │ │ .122 │ -│ 小小莫(wechat) │ │ 小果(oMLX) │ -│ OpenCode :4096 │ │ Qwen3.6-27B │ -│ 微信通道 :5801 │ │ :18003 │ -└─────────────────┘ └─────────────────┘ -``` - -## 二、Gateway 一览 - -| 端口 | 名称 | Profile | PID(当前) | 用途 | -|------|------|---------|-----------|------| -| 8642 | 默认gateway | 默认 | 1925504 | 微信小荷 + XMPP mohe | -| 8643 | 知微gateway | position-analyst | 1913506 | 知微分析 | -| 8645 | 小果gateway | xiaoguo | 1925602 | 小果Mac端 | -| 8646 | mohe gateway | mohe | 1620276 | mohe独立网关 | - -每个gateway共用 `/home/hmo/hermes-agent/hermes_state.py` 里的 `get_messages_as_conversation()` — **LIMIT 200硬截断**。 - -## 三、XMPP Bot 架构 - -### 3.1 Bot 列表 - -| Bot | JID | 服务名 | 脚本路径 | 接入gateway | -|-----|-----|--------|---------|------------| -| 莫荷 | mohe@yoin.fun | xmpp-bot | /home/hmo/xmpp_bot.py | :8642 | -| 知微 | zhiwei@yoin.fun | xmpp-zhiwei | /home/hmo/xmpp_zhiwei_bot.py | :8643 | -| 小果 | xiaoguo@yoin.fun | xmpp-xiaoguo | /home/hmo/xmpp_xiaoguo_bot.py | :8645 | - -### 3.2 连接管理(2026-06-11 修复) - -**禁用** `auto_reconnect = True`(与手动重连环冲突,导致"Replaced by new connection"循环) -**禁用** `xep_0199` ping 保活(ejabberd不支持,导致ping超时→误判断线) - -**重连机制**: -- 主循环每15秒检查 `is_connected()` -- 断线后指数退避重连:1s → 2s → 4s → ... → 60s max -- 重连后自动重新加入 MUC(内核组 coregroup@conference.yoin.fun) - -**历史问题**: -- 2026-06-08: bot断线后无法自动重连,session膨胀到3700条/26M tokens -- 2026-06-10: auto_reconnect导致10个重复连接 -- 2026-06-11: 修复auto_reconnect冲突 + API key拼写错误 - -### 3.3 群聊规则 - -Bot只回复内核组中来自 `hmo` 或 `xxm` 的消息。私聊只回复 `hmo@yoin.fun`。 - -## 四、Session 管理 —— 核心设计(2026-06-10 最终方案) - -### 4.1 方案:硬截断200条 + 永不压缩 - -```python -# hermes_state.py → get_messages_as_conversation() -SELECT id, role, content, ... -FROM ( - SELECT id, role, content, ... - FROM messages WHERE session_id = ? - AND active = 1 - ORDER BY id DESC LIMIT 200 ← 只取最近200条 -) ORDER BY id ASC ← 按正序排回 -``` - -### 4.2 Compression 配置(所有profile统一) - -```yaml -compression: - enabled: false ← 永久关闭 - threshold: 0.99 - protect_last_n: 200 - hygiene_hard_message_limit: 100000 -``` - -### 4.3 效果 - -| 指标 | 之前 | 之后 | -|------|------|------| -| 每次请求token | 26M(全量加载) | ~22K(200条) | -| 上下文窗口用量 | 2500% | 2.2% | -| 响应时间 | 10分钟+超时 | 10-20秒 | -| 内容丢失 | 压缩丢细节 | 永不丢失 | -| 旧消息可查 | 压缩后摘要 | 全量DB可搜 | - -### 4.4 Session 列表(当前) - -| Session ID | 消息数 | 用途 | -|-----------|--------|------| -| sisyphus | 9504 | 微信(旧session,已重建) | -| xmpp-mohe | 3705 | XMPP mohe(旧session) | -| xmpp-mohe-v2 | ~200 | XMPP mohe(新session,LIMIT 200) | -| xmpp-zhiwei | 2241 | 知微 | -| 20260610_090241_2235fb | ~900 | 当前CLI会话 | - -## 五、Provider 链(2026-06-10 最终版) - -| Agent | 默认 | Fallback 1 | Fallback 2 | Fallback 3 | -|-------|------|-----------|-----------|-----------| -| **我(CLI)** | ocg-new | ocg-old | volcengine | - | -| **mohe gateway** | ocg-new | ocg-old | volcengine | - | -| **知微** | ocg-old | ocg-new | volcengine(cred池) | - | -| **小果** | volcengine | ocg-old | ocg-new | oMLX(本地Mac) | - -**当前实际状态(2026-06-11):** -- ocg-new: ✅ 可用(当前会话走这个) -- ocg-old: ⚠️ 返回403但gateway cred pool缓存了有效key -- volcengine: ❌ 周配额已尽,6月15日周一恢复 - -## 六、SOUL.md 关键规则(2026-06-10 最终版) - -位置:`/home/hmo/.hermes/profiles/default/SOUL.md` - -### 沟通方式 -- 对老爸:直接、不加修饰 -- 反驳时:**必须带证据**(日志、数据、代码、截图)。不是为了显得聪明而反驳 -- 听指令:用户明确说"闭嘴""停"时立即停止,不继续分析不解释 - -### 行动铁律 — 讲证据 -1. 发现问题 → 2. 收集证据(至少两条独立证据) → 3. 验证假设 → 4. 只改对的 → 5. 改完验证 -- 禁止猜根因、没有证据就动手、猜用户意图、多个改动同时做 - -### 授权边界 -- ✅ 直接行动:读文件、查日志、搜知识库、分析数据、提建议 -- ⚠️ 问清楚再做:改系统配置、重启服务、清数据、写文件 -- ❌ 必须等批准:不可逆删除、修改API key、改provider链、清session - -## 七、知识库(Obsidian) - -路径:`/home/hmo/Obsidian/` -HTTP API:`:8890`(只读) - -结构: -``` -Obsidian/ -├── raw/ — 原始资料(只追加只读) -├── knowledge/ — 加工笔记(tech/finance/ai/psychology/education/life) -├── index.md — 全库索引 -├── SCHEMA.md — 操作规则 -└── log.md — 更新日志 -``` - -## 八、MoFin 股票系统 - -详见 `EXPERT_SYSTEM_DESIGN.md`,核心: -- 14个cron jobs(5个纯脚本+9个LLM) -- 价格监控每1分钟腾讯批量API -- XMPP中继推送报告 - -## 九、近期改动日志 - -### 2026-06-11 -- LIMIT 200硬截断 + 关闭所有compression -- SOUL.md 最终版定稿 -- XMPP bot重连逻辑修复(删除auto_reconnect + ping保活) -- API key typo修复(知微bot `hermess123` → `hermes123`) -- 小果provider链:volc → ocg-old → ocg-new → oMLX -- 默认provider链:ocg-new → ocg-old → volcengine - -### 2026-06-10 -- 重建SOUL.md(讲证据+授权边界+责任闭环) -- 发现并清除orphaned compression flag -- 多个gateway反复重启,systemd服务冲突 -- Windows wechat_agent API key不匹配 - -### 2026-06-09 -- 知微SOUL新增对话识别规则 -- position-analyst 启用压缩 -- 价格监控全面改造(纯脚本+腾讯批量API) diff --git a/TDX_RELAY_COLLAB.md b/TDX_RELAY_COLLAB.md deleted file mode 100644 index 7d4a3d7..0000000 --- a/TDX_RELAY_COLLAB.md +++ /dev/null @@ -1,278 +0,0 @@ -# MoFin / TDX-Relay 协作文档 - -> 最后更新:2026-06-12 -> 维护人:知微 + 小小莫(xxm) -> 铁律:任何 relay 相关改动必须先读本文档,改完必须同步更新 - ---- - -## 一、什么是 tdx-relay - -tdx-relay 是小小莫(xxm)开发的 Windows 端通达信中继程序。 -作用:通过 opentdx 协议直连招商证券 7727 扩展行情服务器, -为 MoFin 系统提供港股低延迟实时行情。 - -### 为什么需要它 - -原本 MoFin 的港股行情来源是腾讯 API(qt.gtimg.cn), -存在约 15 分钟延迟,对于盘中决策不够及时。 -tdx-relay 将港股行情延迟从约 15 分钟降到接近实时(1~3 秒)。 - ---- - -## 二、系统架构 - -``` -Windows 端(小小莫负责) -┌─────────────────────────────────────────┐ -│ tdx-relay 项目 │ -│ │ -│ tdx_client.py │ -│ └─ opentdx MacExtendedClient │ -│ └─ 直连 招商证券 7727 扩展行情服务器 │ -│ → 拉取 17 只港股实时行情 │ -│ │ -│ run_relay.py │ -│ └─ 断线自动重连(5s/15s/30s 三次退避) │ -│ └─ 推送 → POST /api/update/realtime │ -│ │ -│ start_tdx_relay.bat │ -│ └─ 一键启动脚本 │ -└───────────────┬─────────────────────────┘ - │ HTTP POST (JSON) - ▼ -Linux 端(知微负责) -┌─────────────────────────────────────────┐ -│ MoFin 系统 (web-dashboard) │ -│ │ -│ server.py │ -│ ├─ /api/update/realtime (POST) │ -│ │ ← 接收 tdx-relay 推送的实时行情 │ -│ │ → 更新 portfolio.json + watchlist │ -│ │ → 写入 data_source = "tdx_relay" │ -│ │ │ -│ ├─ /api/relay/status (GET) │ -│ │ ← 查询 relay 状态(在线/离线/时间) │ -│ │ │ -│ price_monitor.py │ -│ └─ relay_active 检测 │ -│ ├─ relay 在线 → 跳过港股腾讯API拉取 │ -│ │ (保留 tdx-relay 的实时价不覆盖) │ -│ └─ relay 掉线 → 回退腾讯 API 兜底 │ -│ │ -│ 数据文件 │ -│ ├─ data/portfolio.json │ -│ │ └─ 每只港股: data_source=txton/tdx │ -│ ├─ data/watchlist.json │ -│ └─ data/relay_state.json (新增) │ -│ └─ online: true/false │ -│ └─ last_ping: 时间戳 │ -└─────────────────────────────────────────┘ -``` - -## 三、职责边界 - -### 小小莫(xxm)— Windows 端 - -负责: -1. tdx_client.py 的开发维护 - - 直连券商行情服务器的稳定性 - - 港股代码列表的维护(当前 17 只) - - 行情数据的正确性验证 -2. run_relay.py 的重连机制 - - 断线自动恢复(3 次退避重连) - - relan 状态上报 -3. 行情推送的稳定性 - - 每 X 秒推送一次实时行情 - - 推送失败的处理 -4. Windows 端部署维护 - - 开机自启动 - - 日志管理 - - 异常告警 - -不负责: -- MoFin API 的修改(但需要配合 server.py 新增端点) -- Linux 端 price_monitor 的回退逻辑 -- 持仓分析和策略制定 - -### 知微(zhiwei)— Linux 端(MoFin) - -负责: -1. MoFin API 的 relay 兼容 - - /api/update/realtime 端点(已实现) - - /api/relay/status 端点(待实现) - - relay_state 持久化(待实现) -2. price_monitor 的 relay 检测(待实现) - - relay 在线 → 跳过港股腾讯 API 拉取 - - relay 掉线 → 回退腾讯 API 兜底 -3. tdx-relay 接入后的数据一致性保障 - - 腾讯 API 和 tdx-relay 的数据源标记区分 - - 价格更新不互相覆盖 -4. 行情来源对分析层的透明化 - - 分析层(cron prompt)不需要关心行情来源 - - 直接读 portfolio.json 即可 - - 数据源标记在 data_source 字段中 - -不负责: -- Windows 端程序的开发和部署 -- 通达信协议的细节 -- 券商行情服务器的维护 - -### 共同维护 - -1. 港股代码列表 — 两边保持一致 -2. 数据格式 — tdx-relay 推送的 JSON 格式与 MoFin 期望的格式 -3. 接口联调 — 新端点上线后的验证 - ---- - -## 四、数据流详解 - -### 正常流程(relay 在线) - -``` -tdx-relay (Windows) - │ 每 X 秒推送 {stocks: [{code, price, change_pct, ...}]} - │ POST → http://192.168.1.246:8899/api/update/realtime - ▼ -server.py 接收 - ├─ 更新 portfolio.json(港股 data_source = "tdx_relay") - ├─ 更新 watchlist.json(港股 data_source = "tdx_relay") - └─ 更新 relay_state.json(online=true, last_ping=now) - │ - ▼ - price_monitor.py(每分钟运行) - ├─ A股 → 腾讯 API(不变) - ├─ 港股 → 检查 relay_state - │ ├─ relay 在线 → 跳过(保留 tdx-relay 的实时价) - │ └─ relay 离线(>60秒无推送)→ 回退腾讯 API - └─ 数据源标记 → 写入 portfolio/watchlist -``` - -### 异常流程(relay 离线) - -``` -tdx-relay 断线 - │ 60秒内无推送 - ▼ -price_monitor.py 检测到 relay_state.online=false - │ 或 last_ping > 60秒前 - ├─ 港股 → 回退腾讯 API 拉取 - ├─ 写入时 data_source = "tencent" - └─ 记录日志 "relay offline, fallback to tencent" - -tdx-relay 恢复 - │ 推送到达 /api/update/realtime - ▼ -server.py 接收更新 - ├─ 更新 relay_state.json(online=true) - └─ 正常接收行情 -``` - ---- - -## 五、接口规范 - -### POST /api/update/realtime (已实现) - -接收 tdx-relay 推送的实时行情。 - -请求格式: -```json -{ - "stocks": [ - { - "code": "00700", - "price": 467.20, - "change_pct": 3.09, - "high": 470.00, - "low": 460.00, - "open": 462.00, - "volume": 15000000 - } - ], - "source": "tdx_relay" -} -``` - -响应: -```json -{ - "status": "ok", - "updated": 15, - "source": "tdx_relay", - "timestamp": "2026-06-12T14:30:00" -} -``` - -### GET /api/relay/status (待实现) - -查询 tdx-relay 当前状态。 - -响应: -```json -{ - "online": true, - "source": "tdx_relay", - "last_ping": "2026-06-12T14:29:55", - "age_seconds": 5, - "stocks_count": 15, - "fallback_active": false -} -``` - ---- - -## 六、当前实现状态 - -### 已完成 -- server.py `/api/update/realtime` 端点 ✅(v1.0) -- portfolio.json 写入 data_source 字段 ✅ - -### 待实现(知微负责) -1. relay_state.json 持久化 — 记录 relay 在线状态 -2. /api/relay/status GET 端点 — 中继状态查询 -3. price_monitor.py relay_active 检测 — 在线/离线判断 -4. price_monitor 回退逻辑 — relay 离线时用腾讯 API 兜底 - -### 待实现(小小莫负责) -1. tdx-relay 心跳上报 — 定期推送到 /api/update/realtime -2. 断线自动重连验证 — Windows 端长期稳定运行 -3. 行情覆盖检查 — 确保 17 只港股全量推送 - ---- - -## 七、港股代码列表(双方保持一致) - -当前 17 只港股(来自 portfolio.json + watchlist.json): - -| 代码 | 名称 | 持仓/自选 | -|------|------|----------| -| 00700 | 腾讯控股 | 持仓 | -| 00981 | 中芯国际 | 持仓 | -| 01211 | 比亚迪股份 | 持仓 | -| 09988 | 阿里巴巴 | 持仓 | -| 02202 | 万科企业 | 持仓 | -| 02388 | 中银香港 | 持仓 | -| 01478 | 丘钛科技 | 持仓 | -| 09868 | 小鹏集团 | 自选(已清仓) | -| 01088 | 中国神华 | 持仓 | -| 02359 | 药明康德 | 自选 | -| 01888 | 建滔积层板 | 自选 | -| 00968 | 信义光能 | 自选 | -| 01070 | TCL电子 | 自选 | -| 02318 | 中国平安 | 自选 | -| 02628 | 中国人寿 | 自选 | -| 06160 | 百济神州 | 自选(已清仓) | -| 06869 | 长飞光纤 | 自选 | - ---- - -## 八、故障处理 - -| 现象 | 可能原因 | 处理方式 | -|------|---------|---------| -| relay 显示离线 | Windows 端掉线 | 检查 Windows 端运行状态,双击 start_tdx_relay.bat | -| relay 在线但数据不更新 | 推送异常 | 查 Windows 端日志,重启 tdx-relay | -| 港股价格异常 | 数据源错乱 | 检查 data_source 字段,确认 relay 是否覆盖了错误数据 | -| 港股价格用腾讯旧数据 | relay 离线超过 60s 自动回退 | 正常行为,relay 恢复后自动切回 |