Download MarkdownView raw .mdAll wireframesBuilt 2026-10-27 23:51 (Taipei)

Algonics MVP 产品需求文档(PRD)

项 内容
版本 v1.2(MVP,按 2026-10-27 线框原型冻结)。v1.1:Karlo 已定 C1(不做 Git)、C2(账户平台以 06b 为准),见 13.1。v1.2:一期只支持 Local runner(Lean 用 Podman 跑在 mid-tier 主机上,见第 3 章第 4 条);远程 runner(VPS)延后,方向见第 11 章
依据 线框原型 https://algonics-wireframes.pages.dev/ (35 个页面/变体,含页内 Annotations)
读者 实现方(Cursor 编码代理)、Karlo
约定 正文中文;所有 UI 文案、按钮、字段、列名、状态值、标识符保持英文,与原型逐字一致。标注 假设 的内容是原型没有明说、由本文补充的推断,实现前可以推翻。

使用方式:第 7 章每个 Feature(F1–F14)都能单独作为一个实现任务交给 Cursor。领域模型和数据库 schema 由实现方根据第 5 章自行推导,本文不规定表结构、字段类型和 SQL。


1. 概述与目标 #

1.1 产品定位 #

Algonics 是 Karlo 个人使用的量化交易平台,底层是 QuantConnect Lean 引擎,中间层是一个 Java mid-tier。闭环如下:

  1. 建自己的行情库(DuckDB)。
  2. 注册编译好的 C# 策略 DLL。
  3. 回测,然后激活(Activate)通过验证的版本。
  4. 用激活版本建 Paper bot 跑模拟。
  5. 把 Paper bot 升级(Promote)为 Live bot,下真实订单。
  6. 在 Dashboard 监控,必要时一键暂停、停止或清仓。

1.2 MVP 目标 #

1.3 范围 #

范围内(MVP) 范围外(MVP 不做)
Dashboard(Live / Paper 视图、Needs attention、Pause all、Emergency) Alerts(整个模块砍掉)
Data:行情库、Add data、Dataset detail、gap 自动补、Sources(第三方数据商) 登录、注册、退出(用 Karlo 现有站点,见 F1)
Strategies:注册 DLL、版本、回测、结果、激活 回测缺数据的提示状态(Missing data / Fill now,已延后)
Bots:列表加筛选、添加和编辑、启停、风控、Promote to Live、详情(Overview / Trades / Logs) Compare(回测对比)、参数表单、Tags、Resume all
Accounts(券商和交易所账户) 账户详情页
Channels(Email / Telegram / Webhook / DingTalk / Lark) Settings 页(已规划未画,见 F1 依赖)
审计日志、Duplicate bot、max open trades、消息模板、免打扰、限流

2. 术语 #

术语 含义
Library 自有行情库,存在 Algonics 服务器上的 DuckDB 里。回测和 Paper bot 都从这里读数据,从不直接读 Source。
Dataset 行情库的一行,唯一键是 Asset class · Market · Resolution,例如 Equity · US · Daily。
Resolution 只有 Minute / Hour / Daily 三种。5m、15m、30m 由 Minute 合成;2h、4h 由 Hour 合成;1w 由 Daily 合成。没有月线、tick 和秒级数据。
Source 行情的上游。分两类:Brokers & exchanges(用 Accounts 里的密钥,Binance 公共接口不需要密钥),以及 Data vendors(第三方数据商,在 Sources 页管理)。
Gap 数据范围内缺失的 bar 区间。状态有 open(Retrying (n/3))、Source has no data、Not requested。
Lean cache 回测前从 DuckDB 导出的 Lean zip 文件,是可随时丢弃的内部缓存,UI 不展示。
Strategy 一个 Lean 算法类(完整类名),来自一个程序集(DLL)。
Version (vN) 策略的不可变版本。算法指纹变化时才生成新版本。
Activated 版本唯一的一个标记。只有被激活的版本才能用来建 bot。
Run / Backtest 一次回测,编号 Run #N,在同一个策略内唯一。
Bot 一个运行实例,包括:固定的版本、参数、账户、Mode(Paper / Live)、风控和 Channels。
Paper 用实时行情、在本地模拟成交,不下真单。
Live 在账户上下真实订单。
Pause 只停止开新仓。策略继续管理已有持仓,止盈止损照常执行,不平仓。
Stop 算法退出。可以选择撤单、平仓。
Liquidate 撤掉全部挂单,按市价平掉全部持仓,然后变为 Stopped。
Account 券商或交易所账户(代码和路由里叫 connections)。
Channel 通知渠道。

3. 架构约束(必须遵守) #

  1. 行情库用 DuckDB,放在 Algonics 服务器上。Java mid-tier 是唯一写入者。下载、补 gap、删除都只能经 mid-tier 写入。
  2. 回测数据流依次为:Backtest → 检查行情库覆盖 → 导出到 Lean cache(zip)→ 运行 Lean。
    • 缓存按 symbol × resolution × 日期组织,不按策略组织。
    • 只有新增或变更的数据才重新导出。
  3. 策略是外部编译好的 .NET DLL。
    • 扫描只用 System.Reflection.MetadataLoadContext 读元数据,不执行任何策略代码。
    • 首个版本不运行 dotnet build(在 Rider 里构建)。
    • DLL 按 SHA-256 存进平台存储。
  4. Runner:一期只有 Local runner,是隐式的(界面上不出现 runner 选择)。
    • Lean 在 Java mid-tier 所在主机上本地运行,容器用 Podman(不用 Docker)。回测和 bot 都走这个 Local runner。
    • 远程 runner(VPS)延后,见第 11 章;一期的 runner 调用最好封装在一个接口后面,方便以后接远程 runner(假设)。
  5. 密钥:账户密钥、数据商 API key、Channel 密钥都加密存储,保存后不再明文返回,只显示末 4 位。
  6. 时区:界面时间一律用 Taipei 时间(UTC+8)。"Today" 从 00:00 Taipei 起算。
  7. 服务重启:重启前处于 Running 或 Paused 的 bot 自动恢复到原状态。
  8. UI 规范:
    • MUI 默认尺寸,卡片用 Portenza 风格(圆角 15px,轻阴影)。
    • 英文界面,标题用 sentence case。
    • 新增类按钮一律叫 "Add",不用 "Create" 或 "New"。
    • 钱一律叫 "Balance",不用 "Equity"。
    • P&L 标签只用 P&L Today / P&L YTD / P&L Total。
  9. 认证:沿用 Karlo 现有站点的登录(见 F1)。偏好设置"按用户记住",所以仍然需要用户身份。

4. 信息架构与导航 #

4.1 侧边栏 #

Dashboard
QUANT
  Data          (/data;Sources 页没有侧边栏项,打开时仍高亮 Data)
  Strategies    (/strategies)
  Bots          (/bots)
CONFIG
  Accounts      (原型路由 06-connections)
  Channels
  Settings      (规划中,未画)

4.2 页面清单 #

线框基址是 <https://algonics-wireframes.pages.dev/>。

ID 名称 类型 线框链接 Feature
01 Dashboard(Live,默认视图,含状态 A/B/C/D) 页面 01-dashboard F14
01b Pause all 确认 对话框 01b-pause-all F14
01c Stop all 确认 对话框 01c-stop-all F14
01d Liquidate all 确认 对话框 01d-liquidate-all F14
01e Dashboard,Paper 视图 页面状态 01e-dashboard-paper F14
01f Dashboard 磁贴版(仅作对比,不实现) 对比稿 01f-dashboard-tiles —
02 Data 列表 页面 02-data F4
02b Add data 对话框 02b-data-add F4
02c Dataset detail 页面 02c-data-detail F5
02d Sources 页面 02d-data-sources F3
02e Add source 对话框 02e-data-add-source F3
03 Strategies 列表 页面 03-strategies F6
03b Add strategy,第 1 步 Source 对话框 03b-add-strategy-source F6
03c Add strategy,第 2 步 Review 对话框 03c-add-strategy-review F6
03d List settings 对话框 03d-list-settings F6
03e 策略页 / 回测结果 Overview 页面 03e-strategy-results F7、F8
03f Version history 对话框 03f-version-history F7
03g Backtests drawer 抽屉 03g-backtests-drawer F8
03i Run backtest(Run with options…) 对话框 03i-new-backtest F8
03j 回测 Trades 子标签 页面状态 03j-strategy-results-trades F8
03k 回测 Logs 子标签 页面状态 03k-strategy-results-logs F8
03l Deactivate 确认 对话框 03l-deactivate-confirm F7
04 Bots 列表 页面 04-bots F9
04g Bots 列表(带筛选进入) 页面状态 04g-bots-filtered F9
04b Add bot / Edit bot 对话框 04b-new-bot F10
04c Bot 页 Overview 页面 04c-bot-detail F12
04d Bot 页 Trades 页面状态 04d-bot-trades F12
04e Bot 对话框(Stop、Live start、Close、Liquidate、Promote、Restart、Delete) 对话框集 04e-bot-dialogs F11
04f Bot 页 Logs 页面状态 04f-bot-logs F12
06 Accounts 列表 页面 06-connections F2
06b Add account / Edit account 对话框 06b-add-connection F2
06c Delete account(被阻止 / 正常) 对话框 06c-delete-connection F2
07 Channels 列表 页面 07-channels F13
07b Add channel / Edit channel 对话框 07b-add-channel F13
07c Delete channel(被阻止 / 正常) 对话框 07c-delete-channel F13

没有 05 号页面(原 Alerts 已移除)。

4.3 URL 约定(原型中已出现的) #


5. 业务对象与关系 #

只描述业务事实、关系、不变量和生命周期,表结构由实现方推导。

5.1 关系总览 #

User ─1:1─ Preferences (Dashboard 模式与区间、Show archived 等)
Account 1 ── * Bot                    (Bot 的 Account 创建后不可改)
Account 1 ── 0..1 "当前 Live bot"     (未 Stopped 的 Live bot 至多 1 个)
Account 0..1 ── * Dataset.Source      (Broker/Exchange 类 Source 借用账户密钥)
DataVendor 0..1 ── * Dataset.Source   (第三方数据商;每个 vendor 至多一个)
Dataset 1 ── * DatasetSymbol 1 ── * GapRange
Dataset 1 ── * DownloadJob
Strategy 1 ── * StrategyVersion 1 ── * BacktestRun
Strategy 1 ── * Bot ; StrategyVersion(activated) 1 ── * Bot (pinned)
Bot * ── * Channel
Bot 1 ── * Position / Order / ClosedTrade / LogLine / BalanceSnapshot

5.2 实体 #

Account(券商或交易所账户)

DataVendor(Source,第三方数据商)

Dataset

DatasetSymbol

GapRange:某个 symbol 的缺失区间。状态有 open(带重试次数 n/3)、Source has no data、Not requested,状态机见 5.3.5。

DownloadJob

Strategy

StrategyVersion (vN)

BacktestRun

Bot

Position / Order / ClosedTrade / LogLine(属于 Bot)

Channel

Preferences(按用户)

5.3 状态机 #

5.3.1 Strategy.Status

            first version activated
  Draft ───────────────────────────────▶ Active
    ▲  last activated version deactivated   │
    └───────────────────────────────────────┘
  Active ──Set inactive…──▶ Inactive ──Reactivate──▶ Active
  Draft/Active/Inactive ──Archive… (无 running bot)──▶ Archived ──Unarchive──▶ 归档前的状态

5.3.2 StrategyVersion 激活

5.3.3 Bot.Status

 (Add) ─▶ Stopped ──Start──▶ Starting… ──checks ok──▶ Running
                              │checks fail → 回到 Stopped(Live 在确认框内就拦下)
 Running ──Pause / Daily max loss──▶ Paused ──Resume──▶ Starting… ─▶ Running
 Running/Paused/Starting ──Stop / Max loss / Liquidate──▶ Stopping… ──▶ Stopped
 任意运行态 ──运行错误──▶ Error ──Restart──▶ Starting…
 Error ──Stop?──(见开放问题)

5.3.4 DownloadJob 与 Dataset 状态

 Queued(假设) ─▶ Running (Updating n%) ─▶ Succeeded
                                     └──▶ Failed (原因;可 RETRY)

Dataset 的 Status 按以下优先级派生:

  1. 有任务在跑:Updating n%,带进度条。
  2. 最近一次失败:✕ Failed,悬停显示原因。
  3. 存在 open gap:! n gaps(橙色)。
  4. 以上都没有:✓ Up to date。

(优先级顺序为 假设,原型中每一行只示例了一种状态。)

5.3.5 GapRange

 发现缺失 ─▶ Open: Retrying (1/3) ─(每次 Update 重试失败)─▶ Retrying (2/3) ─▶ … ─3 次失败─▶ Source has no data
     │                                                                     │
     └──── 任意一次补成功 ─▶ 消失(不再是 gap)                              │
 Fill gaps(手动): Open 或 Source has no data ─▶ Open,重新给 3 次机会 ◀──┘
 用户在 Add data 中把 From 后移跳过的区间 ─▶ Not requested(永不自动补;仅 Add data 或 Fill gaps 可取回,见矛盾 C3)

5.3.6 BacktestRun

Running (n% · ETA) → Completed,或者 → Failed(带错误摘要)。


6. 核心端到端流程 #

① Add account (06b) ─▶ ② Add data (02b, 下载到 DuckDB) ─▶ ③ Add strategy (03b/03c, 注册 DLL → Draft)
   ─▶ ④ Backtest (03e/03i, 首次回测学到数据需求) ─▶ ⑤ Activate vN (03e, 策略变 Active)
   ─▶ ⑥ Add bot Paper (04b, Stopped) ─▶ Start (Paper 检查全过则无对话框) ─▶ Running
   ─▶ ⑦ Promote to Live (04e, 选 Live 账户与名字, 新 Live bot 为 Stopped) ─▶ Edit 设 Max capital/limits/channels ─▶ Start (Live 必弹确认)
   ─▶ ⑧ 监控 Dashboard (01, Needs attention, 持仓) ─▶ 必要时 Pause all / Emergency ▾ Stop all / Liquidate all

7. 功能需求(Feature) #

每个 Feature 的结构都是:目标 → 页面 → 组件与行为 → 规则 → 状态 → 校验 → 验收清单 → 依赖。 通用约定:

  • 列表的空状态带主操作按钮。
  • 异步操作的结果用 Snackbar 反馈。
  • 破坏性操作用 error 色按钮。
  • 所有 Dialog 都有 Cancel。

F1 应用框架、导航与通用约定 #

目标:搭好整个应用的外壳和通用约定,让各 Feature 可以直接挂载上来。

页面:所有页面共用左侧 Sidebar,参考任意截图,例如 01 Dashboard

行为

依赖 Settings(未画,后续实现,先用配置项代替)

状态:全局 loading、404、离线状态原型没画,见开放问题 Q11。假设:页面级用 MUI Skeleton;接口错误用 Snackbar 显示错误并提供 RETRY。

验收

依赖:无。这是第一个要实现的 Feature。


F2 Accounts(券商和交易所账户) #

目标:管理交易账户和凭证。这些账户用于 Live 交易、Paper 行情来源,以及作为 Data 的 Source。

页面

组件、字段与列

行为

规则

状态:空状态显示 "No accounts yet",带 + Add account(假设文案);Testing 时有 loading;测试失败时显示内联错误。

校验:Name 必填且唯一;所选平台的凭证全部必填;保存时去掉首尾空格。

验收

依赖:F1。


F3 Data Sources(第三方数据商) #

目标:管理只提供行情的第三方 vendor 的 API key,供 Add data 选用。

页面

组件

规则

验收

依赖:F1。


F4 Data library 与下载任务 #

目标:在 DuckDB 中建立和维护行情库:列表、添加数据、后台下载、自动更新、gap 重试。

页面

02 组件

02 行为

02b Add data(Dialog sm)

规则

状态

校验:Source、Asset class、Market、Resolution、至少 1 个有效 symbol 都必填;From 不晚于 To;Option 的两个过滤值必填,且必须是正数。

验收

依赖:F1、F2(Broker Source)、F3(Vendor Source)。


F5 Dataset detail 与 gap 管理 #

目标:在 symbol 粒度查看数据覆盖,并按 symbol 更新、补 gap、增删。

页面:02c Dataset detail:02c Dataset detail https://algonics-wireframes.pages.dev/02c-data-detail

组件

行为

状态:加载用 Skeleton;搜索无结果显示 "No symbols match"(假设);With gaps 为空时显示空表。

验收

依赖:F4。


F6 策略注册与列表 #

目标:把外部编译的策略 DLL 注册成策略,并管理策略列表和状态。

页面

03 组件

03 行为

03b / 03c Add strategy(Stepper:Source → Review)

规则:先比较程序集哈希;哈希不同再比较算法指纹(IL + 字段 + 参数签名),指纹相同不生成新版本。

状态

校验:上传文件类型和大小(50 MB);路径必须存在。

验收

依赖:F1。


F7 策略页、版本与激活 #

目标:在一个页面里查看策略信息、切换版本和回测,激活或停用版本,管理策略状态。

页面

组件

规则

验收

依赖:F6、F8(run card 显示的是回测结果)。


F8 回测:运行、结果、历史 #

目标:运行 Lean 回测,展示统计、曲线、成交和日志,并提供回测历史。

页面

运行

执行管线(mid-tier)

  1. 解析版本(可能生成新版本)。
  2. 检查行情库覆盖。
  3. 导出所需 symbol × resolution × 日期到 Lean cache,只导出新增或变更的部分。
  4. 用 Local runner 运行 Lean。
  5. 回传进度和日志。
  6. 保存 statistics、曲线、成交、日志和 JSON。
  7. 首次运行时记录策略的数据需求。

缺数据时的 UI(Missing data / Fill now)延后实现。假设:MVP 在缺数据时让 run 失败,并给出清楚的错误摘要(例如 "Missing data for BTCUSDT Minute 2023-01..2023-03")。

Overview 结果

Trades(03j)

Logs(03k)

03g Backtests drawer(右侧,720px)

状态

验收

依赖:F4(库数据)、F6、F7。


F9 Bots 列表与筛选 #

目标:集中查看所有 bot,并在列表里执行启停操作;支持用 URL 带入筛选条件进入列表。

页面

组件

Status 行内按钮
Running Pause, Stop
Paused Resume, Stop
Stopped Start
Error Restart
Starting… Stop
Stopping… 无(假设)

筛选行为

入口 URL 参数 04g 变体
03 Bots 列 / 03e View in Bots → strategy=<slug> Strategy = VegasTunnel → 4 of 6 bots(Live + Paper)
01 / 01e 状态行计数(如 1 error) mode=<当前视图>&status=<状态> Live + Error → 1 行
— 例:mode=paper&status=error 无匹配:列表卡保留工具栏,显示 No bots match these filters + Reset filters(作用同 Reset)

规则

状态

验收

依赖:F10、F11(操作行为)、F7(策略 slug)。


F10 Add bot / Edit bot #

目标:用最少的字段创建 bot;在 Bot 页编辑参数、风控和通知。

页面:04b:04b Add/Edit bot https://algonics-wireframes.pages.dev/04b-new-bot

Add bot 字段

Edit bot(入口只在 04c 的 Edit)

校验

验收

依赖:F2、F7、F13(Channels)。


F11 Bot 生命周期与对话框 #

目标:实现 bot 的启停、风控自动处理、平仓、清仓、Promote、重启、删除,以及它们的对话框和运行时。

页面:04e:04e Bot dialogs https://algonics-wireframes.pages.dev/04e-bot-dialogs

对话框与行为

  1. Stop

    • 两个复选框 Cancel open orders、Close all positions,默认都不勾选。不勾选时,订单和持仓留在账户上。
    • 状态经过 Stopping… 变为 Stopped。
  2. Pre-start checks:每次 Start、Resume、Restart 都要检查以下四项:

    • 账户最近一次测试成功;
    • 账户能交易策略的 symbols,例如 crypto 策略放在只支持股票的券商上会失败;
    • 可用余额 ≥ Max capital;
    • 没有冲突的 Live bot 占用这个账户(口径见矛盾 C5)。

    弹框规则:

    • Live 启动一定弹确认框。四项全通过时,按钮 Start live 为 error 色。有任一项失败时,该项标红并说明怎么修复,Start live 禁用。
    • Paper 启动时检查全通过就直接启动,不弹框。假设:有失败项时弹同一个框,按钮为 Start。
  3. Close position:确认后对该持仓全数量下市价单。策略在下一个信号之前不会重新开仓。

  4. Liquidate now:

    • 危险确认,输入 LIQUIDATE 后按钮才启用。
    • 执行:撤销全部订单,平掉全部持仓,bot 变为 Stopped。
  5. Promote to Live(仅 Paper bot):

    • 新建一个 Live bot,复制原 bot 的配置(版本、参数、limits、channels、description)。
    • 只需要填写:
      • Live Account:被占用的账户禁用;
      • Name;
      • Stop the paper bot:默认不勾选。
    • 新的 Live bot 状态为 Stopped。Max capital 留空,即整个账户;Initial cash 不复制。
    • 启动前需要在 Edit 里设置 Max capital。
  6. Restart notice:在运行中的 bot 上保存了 version、parameters 或 limits 后弹出,选项为 Later / Restart now。选 Later 时,旧值继续运行,直到下次启动。

  7. Delete:仅 Stopped bot。确认后删除 bot,它的历史数据随之删除(假设)。

运行时规则(mid-tier / Lean live)

验收

依赖:F2、F10、F13。


F12 Bot 页(Overview / Trades / Logs) #

目标:监控单个 bot 的健康状况、盈亏、持仓、订单和日志。

页面

共用头部(三个标签页相同)

Overview

Trades(04d)

Logs(04f)

验收

依赖:F9、F10、F11。


F13 Channels(通知渠道) #

目标:配置 bot 的通知渠道。

页面

组件

Type 字段
Email Recipients(发件人用 Settings 的 SMTP sender)
Telegram Bot token, Chat ID
Webhook Method, URL, Headers, Signing secret(HMAC-SHA256 签名)
DingTalk Robot webhook URL, Sign secret
Lark Robot webhook URL, Signature secret

规则

验收

依赖:F1。Email 依赖 SMTP sender 配置(见 F1)。


F14 Dashboard 与紧急操作 #

目标:一眼看出所有 bot 和账户是否正常、总资金和盈亏如何,并提供全局暂停和紧急停止、清仓。

页面

页头

Needs attention banner(MUI Alert)

条目 链接
bot 处于 Error Open bot(04c)
bot 因 Daily max loss 自动暂停 Open bot
bot 因 Max loss 自动停止 Open bot
运行中的 bot 的策略有更新的激活版本 Open bot
No heartbeat(超过 60 s) Open bot
账户最近测试失败 Open account(06)
已启用的渠道最近测试失败 Open channel(07)

状态行

第 1 行(左右两半,固定高 300 px)

第 2 行:Accounts 卡(每张占 50% 宽)

P&L 口径(全局统一)

数据状态

紧急对话框

验收

依赖:F2、F9、F11、F12、F13;F1(Default currency、FX)。


8. 业务规则汇总 #

# 规则 来源
R1 一个账户同时最多有 1 个未 Stopped 的 Live bot;Paper bot 不受限 04b、06
R2 只有 Active 策略的已激活版本才能用来建 bot;bot 固定版本,不会自动升级 04b、03e
R3 被任何 bot 引用的版本不能 Deactivate;停用最后一个激活版本时策略回到 Draft 03f、03l
R4 有 running bot 的策略不能 Archive;Inactive 策略不能新建 bot,已运行的继续运行 03
R5 版本只在程序集哈希和算法指纹都变化时生成;版本不可变 03c、03i
R6 回测和 Paper 只从 Library 读数据;只有 Java mid-tier 写 DuckDB 02
R7 Dataset 唯一键是 Asset class × Market × Resolution;Option 只能选 Daily 02、02b
R8 每次 Update 重试 open gap,最多 3 次,之后转为 Source has no data;Fill gaps 重新给 3 次机会;Not requested 永不自动补;Gaps 计数只算 open gap 02、02c
R9 Start、Resume、Restart 都运行 pre-start checks;Live 启动必须确认 04e
R10 Daily max loss → 自动 Paused,至少到次日、且必须手动 Resume;Max loss → 自动 Stopped,可选同时平仓 04、04b
R11 Pause 只停止开新仓,止损和退出继续执行 04
R12 清仓类操作(Liquidate now、Liquidate all)要输入 LIQUIDATE 01d、04e
R13 只有 Stopped 的 bot 能删除;有未 Stopped 的 bot 在用的账户不能删除;被 bot 引用的渠道和被 dataset 使用的 vendor 不能删除 04、06c、07c、02d
R14 P&L 按 bot 计算,出入金不计入;Today 从 00:00 Taipei 起算;Total 从首次启动起算,扣费 01
R15 股票只在常规交易时段交易;休市时禁用 Close 和 Liquidate 04、04c
R16 Version、Parameters、Limits 修改后需重启生效;Name、Description、Channels 立即生效 04b
R17 服务器重启后,Running 和 Paused 的 bot 恢复原状态 04
R18 密钥加密存储,不回显明文,只显示末 4 位 06b、02d、07b
R19 每个 vendor 最多添加一次 Source 02e
R20 新 bot 一律以 Stopped 创建;Promote 生成的 Live bot 也是 Stopped,且 Max capital 为空 04b、04e

9. 非功能要求 #


10. 建议实现顺序 #

阶段 Feature 理由 / 可交付
0 F1 外壳、认证集成、格式约定 所有页面都依赖它
1 F2 Accounts、F3 Sources、F13 Channels 都是独立的 CRUD 加连通性测试,后续功能依赖它们
2 F4 Data library + 下载任务 → F5 Dataset detail 先打通 DuckDB 单写者和后台任务;回测依赖它
3 F6 策略注册(MetadataLoadContext 扫描、指纹) 有了版本才能回测
4 F8 回测管线和结果 → F7 策略页、版本激活 先做 Lean cache 导出加 Local runner,再做 UI;激活版本是建 bot 的前提
5 F10 Add/Edit bot → F11 生命周期(先做 Paper) → F9 列表与筛选 → F12 Bot 页 先让 Paper 端到端跑通
6 F11 中的 Live 部分(pre-start checks、Live 确认、风控、Promote) 涉及真钱,放在 Paper 稳定之后
7 F14 Dashboard 与紧急操作 汇总前面所有数据;Emergency 依赖 F11
8 通知事件接入(F11 / F13)、收尾和验收 —

11. 不在范围 / 后续 #


12. 待定问题(Open questions) #

# 问题
Q1 Dashboard 账户卡头部的对齐方式
Q2 是否需要 P&L Open(持仓未实现合计)汇总
Q3 连接测试的文案统一(Test connection / Send test message / Testing… 结果文案)
Q4 Needs attention 里用 Open account 还是 View account
Q5 账户卡增减时的副标题文案
Q6 01f 的 Paper 变体是否需要(目前不实现)
Q7 通知事件清单(本文 F11 给了假设清单)
Q8 Stopped bot 引用的账户被删除后怎么处理(目前规则只阻止未 Stopped 的 bot 引用的账户被删除)
Q9 04e 只画了余额不足这一种失败;连接测试失败、symbol 不支持、账户被占用的失败文案没画
Q10 未画的对话框:03 Edit / Set inactive / Archive;03e 删除 run;02c Remove selected;02d Edit API key 和阻止删除框;07 Used by 列表
Q11 全局 loading、404、离线状态
Q12 原型里有部分按钮没有链接目标(例如 06c View bots 的去向;本文假设为按账户筛选的 Bots 列表,而 04 的筛选目前没有 Account 维度)
Q13 Error 状态的 bot 是否也提供 Stop(原型中 Error 只有 Restart)
Q14 Kraken 账户是否作为 02b Add data 的数据源(Source)。目前 02b 不列 Kraken(来自 D2 的决定)

13. 原型之间的矛盾 #

13.1 已定(Karlo 已确认) #

# 原矛盾 决定 已同步
D1(原 C1) 01 首次运行文案说策略可以 "from a local folder or Git",但 03b 只有 Local folder / Upload DLL 不做 Git。策略只能通过 Local folder 或 Upload DLL(03b)添加 01 文案改为 "from a local folder or an uploaded DLL";F6、F14、第 11 章
D2(原 C2) 02b 的 Source 列表有一个 06b 不支持的券商(IBKR),没有 Kraken;06b 的平台只有 Alpaca / Tradier / Binance / Kraken 不支持 IBKR。账户平台以 06b 为准:Alpaca、Tradier、Binance、Kraken。Kraken 是否作为数据源仍待定(Q14),02b 暂不加 Kraken 02b 去掉该选项;03 示例数据改为 Alpaca main;F2、F4、第 11 章

13.2 待定(需 Karlo 定夺) #

# 矛盾 本文暂定
C3 02b 说 Not requested 区间可以用 Add data 或 Fill gaps 取回;02 ⑪ 说 Fill gaps 只处理 open gap 和 Source has no data 暂定 Fill gaps 不处理 Not requested,只能用 Add data 取回
C4 示例里 bot 固定在 v7,但 v7 未激活(激活的是 v5、v3),而建 bot 只能选激活版本。04b 显示 "v7 (latest)",默认值写的是 "the latest";03e 说默认是最近激活的版本。01 写 "v7 is Active",04c 写 "v7 available" 默认取最近激活的版本;提示文案改成"有更新的激活版本"。示例数据有误
C5 冲突口径:04e 写 "no other running Live bot uses the account",04b、06 写 "one Live bot that is not Stopped" 以 "not Stopped" 为准(更严格)
C6 04e 的 Promote to Live 把账户筛成 "Crypto accounts",04b 说账户不按策略过滤 不过滤;交给 pre-start check 拦截
C7 01d 说休市时清仓只停止这些 bot("same rule as 04c"),而 04c 是直接禁用 Liquidate now 单个 bot 禁用,全局清仓对休市市场只停止
C8 04 写 P&L Total "since the bot was added"、P&L Today "since 00:00 local time";01 和 04c 写 "since first start" 和 Taipei 以 01 为准:首次启动起算,Taipei 时间
C9 01e 提到 "Alpaca paper" 账户,但 06 说所有账户都是 Live 账户全部 Live;Paper 是 bot 的模式
C10 02 ⑪ 说行 Edit 打开 02c;02c 又把 Edit dataset 放在 More 菜单里 行 Edit 打开 02c 并弹出 Edit dataset
C11 02 ⑬ 和 03i 的注释引用了没画的 Missing data / Fill now 状态 已延后;MVP 中缺数据时 run 失败
C12 01 首次运行写 "· 1m ·",按 resolution 命名应为 Minute 用 Minute
C13 01 的 "All systems normal" 写 "5 accounts",其它处是 4 个有 bot 的账户、共 5 个账户 示例数据,影响小
C14 03 和 03f 的示例数据(Bybit、vegas-btc-bybit)与 04、06(Binance main、sub-account、Alpaca main)不一致。(03 中 MomentumRotation 的 bot 示例已随 D2 改为 Alpaca main) 只是示例数据,以 04 和 06 为准
☰ All › 1/36