Commit Graph
57 Commits
Author SHA1 Message Date
shy3130 5e1e1a7529 feat(sidebar): 数据菜单项同步状态指示器 (转圈/完成闪烁)
- 轮询 pipelineJobs: 有活跃 job 每 2s, 无活跃每 15s
- 同步中: 数据菜单项右侧显示蓝色转圈 Loader2
- 同步完成: 切换为绿色对勾 CheckCircle2 + pulse 闪烁, 3 秒后消失
  (用 ref 检测 isDataSyncing true→false 跳变触发)
2026-06-24 23:24:51 +08:00
shy3130 6c0a1bd5e6 fix: 权限门控避免 free/starter 报错 + 概念分析数据源失效容错
StockPanel:
- 财务指标请求增加 FINANCIAL 能力判断, 无能力时不请求
  (修复 free/starter 点个股弹 'capability not available: financial' 报错)

Indices:
- 指数分时区无 kline.minute.batch (Pro+) 能力时显示锁提示, 不请求接口

ConceptAnalysis:
- 配置的 configId 失效 (扩展数据被删) 时自动回退 pickBestConfig, 避免报错
- 空状态也显示配置按钮, 让用户能重新选择数据源

ExtDimensionAnalysis:
- 顶部数据源/分组字段配置区始终显示 (去掉 !menu 条件)
2026-06-24 23:24:38 +08:00
shy3130 00a30597bd feat(ui): 看板无数据提示优化 + 数据页无 Key 引导 + 设置页文案
Dashboard:
- hasNoData 改用 trading_days 判断 (后端 status rows 恒为 0 导致提示无法消除)
- 无数据提示改 warning 黄色风格 + AlertTriangle 图标
- 无数据/无 Key 两提示互斥: 无 Key 优先, 有 Key 无数据才显示同步提示
- API Key 横幅: 邀请码加复制按钮, 文案调整

Data:
- 无 Key 时立即同步按钮置灰禁用 + 显示未配置提示
- 指数数据卡片设置按钮与其它卡片一致 (有数据才显示)

System:
- '清理浏览器缓存' 改名 '刷新前端缓存', 避免误导为清数据
2026-06-24 23:24:25 +08:00
shy3130 37f4d61e3a fix(backend): 清除数据彻底清空三层内存缓存 + 监控触发记录 + 修复版本号
修复清除数据后看板/监控仍显示旧数据的根因:

数据缓存清理 (repository/screener/overview):
- repository.py: 新增 clear_cache() 无条件清空全部 Polars 内存缓存;
  修复 _refresh_enriched() 磁盘无数据时不清内存导致旧数据残留的 bug
- screener.py: 新增 clear_history_cache() 清进程级 _history_cache (TTL 缓存)
- overview.py: 新增 invalidate_overview_cache() 清看板聚合结果 5s TTL 缓存

清除数据完整性 (data.py):
- clear_data 删除 parquet 后统一调用三层缓存清理
- 新增清除监控运行数据: alert_store.clear() 清 alerts.jsonl + _pending_alerts 内存队列
  (原 clear_data 漏删 user_data/alerts.jsonl, 导致触发记录清不掉)

版本号统一:
- /api/data/version 改为优先读 app.__version__ (与 /health 同源),
  原 pyproject.toml 路径解析有误读不到, 回退到陈旧的 VERSION 文件
- Windows GBK 编码修复: __init__.py 强制 stdout/stderr UTF-8,
  避免 TickFlow SDK 输出含 emoji 的指数名称时崩溃 (gbk codec can't encode)
2026-06-24 23:24:04 +08:00
shy3130 2ea2844917 build(packaging): macOS 双架构 dmg 打包 + 新增 icns 图标 + README 下载说明
- README: 下载说明区分 macOS Apple Silicon(arm64) / Intel(x64) 两个 dmg
- generate_icon.py: 支持生成 .icns,重构图标生成逻辑
- 新增 packaging/icon.icns (macOS 图标资源)
- 更新 icon.ico (Windows 图标)
- tickflow.spec: 适配 macOS dmg 双架构打包配置
2026-06-24 18:31:47 +08:00
shy3130 b28355aacf feat(dashboard): 看板无本地数据时显示提示条 + 跳转数据页同步按钮
- enriched/daily 两表均无数据时,顶部显示蓝色提示条
- 「前往同步」按钮 Link 跳转 /data 页面
- 与 none 档(无 key)黄色横幅区分显示

版本: 0.1.38
2026-06-24 18:07:43 +08:00
shy3130 5c492c1825 fix(tier): 乱填 key 误判为 free 档 —— 探测改走付费端点验证 key
根因(鸡生蛋蛋生鸡的循环依赖):
  保存乱填 key 后 detect_capabilities → get_client() 读旧 capabilities.json
  (此时还是 none 档)→ _should_use_free_server() 返回 True → 用
  TickFlow.free() 探测 → free 服务器忽略 key, 日K成功 → 误判为 free 档。

修复:
  _probe_real 改用探测专用客户端, 强制走付费端点(api.tickflow.org)验证
  key 有效性, 不再依赖运行时的 get_client()(受旧缓存档位影响)。
  乱填 key 在付费端点全部 AuthenticationError → 正确判定 none 档 + invalid。

版本: 0.1.37
2026-06-24 17:58:56 +08:00
shy3130 d4cfa29473 chore(ext-data): 放开 data/ext_data 版本控制,纳入 part.parquet 数据文件
- .gitignore: 从「仅 config.json」改为放行整个 data/ext_data 目录
- 提交扩展数据的 parquet 数据文件(gn_ths/hy_ths/kz_ths)
- ext_sxdata_ths 重命名为 ext_kz_ths(config.json)
2026-06-24 17:50:03 +08:00
shy3130 5b00cd1a74 Merge feat/tier-5level-none: API 检测重构为 5 档(新增「无」档) 2026-06-24 17:46:17 +08:00
shy3130 755c114390 feat(tier): API 检测重构为 5 档,新增「无」档 + 修复 CapabilityDenied 返回 500
检测逻辑(复权因子分水岭):
- 无 key / 乱填(连单只日K都拿不到) → none 档,不存 key,走 free-api 服务器
- 免费有效 key(有日K无复权) → free 档,存 key,走 free-api 服务器
- 付费 key(有复权) → starter/pro/expert,走 api.tickflow.org

主要改动:
- save_tickflow_key 改为先探后存:无效 key 不持久化,前端提示「Key 无效」
- none/free 档统一走 TickFlow.free(),实时行情开关置灰
- tiers.yaml 新增 none 档,free 档补 kline.daily.batch
- 注册 CapabilityDenied 全局 handler → 403(此前返 500)
- /health mode 三态化,watchlist 无行情能力时提前 return
- 看板页 none 档显示黄色升级提示(含邀请码超链接)

版本: 0.1.36
2026-06-24 17:44:58 +08:00
shy3130 c27c6ebda9 fix(ci): macOS 图标生成显式安装 Pillow
CI 上 uv sync --no-dev --extra desktop 不装 Pillow (它属于 backtest 的
matplotlib 依赖链, 非 desktop 运行时依赖), 导致 generate_icon.py 报
'No module named PIL'。本地能跑是因 venv 残留历史依赖, 属偶然不可靠。

显式 uv pip install pillow 再生成图标。
2026-06-24 15:14:54 +08:00
shy3130 212ddce7e2 fix(ci): 修复 macOS 构建两个失败点 (venv 发现 + 缺图标)
macOS 构建在 macos-26 runner 上失败, 两个独立问题, 均已本地验证通过:

1. uv pip install --project backend 报 'No virtual environment found'
   macos-26 runner 上 --project 的 venv 自动发现不可靠。改为
   working-directory: backend, 与 uv sync 步骤一致。

2. spec 打包时找不到 packaging/icon.icns
   icon.ico 已入库 (Windows 用), 但 icon.icns 未入库 (macOS 专用产物)。
   release.yml 此前无生成图标步骤, macOS 构建必然缺图标而崩。
   新增 '生成 macOS 图标' 步骤 (仅 macos), 用 backend venv 里的 Pillow
   (传递依赖) 跑 generate_icon.py 现场生成。

3. 打包步骤改为 backend cwd 执行, 用 --distpath/--workpath 显式指定
   产物输出到项目根 dist/, 与后续 DMG 步骤路径保持一致。

本地完整验证 (生成图标 + pyinstaller) 成功产出 dist/TickFlowStockPanel.app。
2026-06-24 15:10:10 +08:00
shy3130 5041c6f66d ci(release): macOS 仅构建 ARM64 包, 移除已不可行的 Intel 构建
原因 (经核实, 技术上无法产出可用 Intel 包):
  1. GitHub 最后一个原生 Intel runner (macos-13) 已于 2025-12-04 退役;
  2. 项目依赖 polars, 而 polars 自 1.33 起移除了 macOS x86_64 原生 wheel
     (改 py3-none-any), 在 arm64 runner 上经 Rosetta 无法装出 x64 原生库,
     产出的 Intel 包会在 polars 调用处崩溃。

改动:
  - 平台矩阵移除 macos x64 项, runner 从 macos-14 升到 macos-26 (2026-02 GA, 免费)
  - Release 下载表格删除 'macOS (Intel 芯片)' 行, 仅保留 Apple Silicon
  - 注释说明放弃 Intel 的原因, 面向用户文案标注仅支持 Apple Silicon
2026-06-24 14:41:35 +08:00
shy3130 aba0deff8b chore: gitignore 补全 macOS 本地构建产物 (.app/.dmg/.zip)
根目录产出的 PyInstaller .app 与 create-dmg .dmg 此前无忽略规则,
补全避免后续误提交 (backend/ 子目录规则已存在, 这次补根目录)。
2026-06-24 14:41:35 +08:00
shy3130 7042aca968 fix(ext-data): 上传 CSV 时自动转码 GBK/GB18030,修复 invalid utf-8 sequence
国内行情软件(同花顺/东财/通达信)及 Windows 中文 Excel 导出的 CSV 多为
GBK 系编码,而 Polars read_csv 默认按 UTF-8 解析,遇中文即抛
'invalid utf-8 sequence'。

新增 ensure_utf8_csv():先尝试 UTF-8(合法则原样返回,零副作用),
否则依次尝试 gb18030/gbk/gb2312/big5 转成 UTF-8 临时文件再交给 Polars。
覆盖上传(upload_data)与字段探测(detect_fields、parse_upload_file)三处入口,
无需新增依赖(编码均为 Python 标准库内置)。
2026-06-24 12:05:04 +08:00
wshy 50db048140 Merge pull request #4 from shy3130/fix/docker-build-and-static-mount
fix(docker): 修复国内网络构建失败与前端静态文件 404
2026-06-24 11:24:51 +08:00
shy3130 1efcf9d5df fix(docker): 修复国内网络构建失败与前端静态文件 404
两个独立问题:

1. 构建阶段网络失败
   - corepack 不读 npm 的 registry 配置, 且环境变量跨 RUN 不保留,
     导致国内网络下 corepack 反复从 registry.npmjs.org 拉取 pnpm 失败。
   - 改为直接 `npm install -g pnpm@9` (npm 会读取 .npmrc 镜像源) 彻底绕开。
   - 新增 USE_CN_MIRROR/NPM_REGISTRY/PYPI_INDEX build-arg,
     默认启用 npmmirror + 清华 PyPI, 可 --build-arg USE_CN_MIRROR=0 关闭。

2. 容器启动后 GET / 返回 404
   - config.py 的 _PROJECT_ROOT 按开发布局 (<root>/backend/app/) 推导,
     Docker 里 backend/app 被拷到 /app/app, 导致其错算到系统根目录 /,
     static_dir 解析成不存在的 /frontend/dist, 静态挂载被跳过。
   - 用 ENV 显式指定 STATIC_DIR / TIERS_YAML / DATA_DIR 指向容器内正确路径,
     无需改动 Python 代码, 桌面版 (PyInstaller frozen) 逻辑不受影响。
2026-06-24 11:22:15 +08:00
shy3130 2b84f1a735 Merge branch 'pr-3' 2026-06-24 10:02:18 +08:00
shy3130 51058800d4 Merge remote-tracking branch 'origin/main' into pr-1
# Conflicts:
#	packaging/generate_icon.py
#	packaging/icon.ico
#	packaging/tickflow.iss
2026-06-24 10:01:54 +08:00
shy3130 18be47abe8 feat: 桌面客户端完善 — 安装包/图标/系统通知/版本对齐 2026-06-24 00:18:46 +08:00
Dallas 9a5db87f45 fix:container name 空格错误 2026-06-23 23:43:14 +08:00
Dallas d35e339d89 fix:docker build时的readme.md错误。 2026-06-23 23:06:16 +08:00
shy3130 5fd92b8377 feat: Release 说明加下载按钮 (markdown 链接直连附件)
- release.yml body 模板: 下载表格每行加「⬇️ 立即下载」按钮
  · 用 $github.repository + 版本号变量拼稳定下载 URL
  · CI 自动填充, 无需手动改链接
- v0.1.35 Release 已同步更新 (本地 gh release edit)
- 新增 generate_icon_designs.py (图标设计方案生成, 选定方案后产出最终 ico)
2026-06-23 22:33:05 +08:00
shy3130 5721f1fe93 feat: Windows 打包改为 Inno Setup 安装包 (Setup.exe)
- 新增 packaging/tickflow.iss: Inno Setup 脚本
  · 用户目录安装 (不弹 UAC), 桌面+开始菜单快捷方式
  · 卸载时询问是否删除用户数据
  · 内置简中语言包 (ChineseSimplified.isl, 官方仓库获取)
- 新增 packaging/generate_icon.py + icon.ico: 应用图标
  · 与 favicon.svg/Logo.tsx 一致 (紫色方括号 + K线)
  · 用 Pillow 绘制, 多尺寸 (16/32/48/64/128/256)
- spec 加 icon: exe 图标 = 安装包图标 = 快捷方式图标
- release.yml: Windows 步骤改为 choco install innosetup + ISCC 编译
- 本地验证通过: 安装→快捷方式→启动→health 0.1.35 全 OK
2026-06-23 22:26:31 +08:00
shy3130 263092a71c fix: bump_version 同步 app/__init__.py 版本号 (health 接口对齐)
bump 脚本之前只更新 pyproject + package.json, 漏改 app/__init__.py,
导致 /health 报的版本号停留在 0.1.31。现在三处版本号源统一更新。
2026-06-23 21:52:48 +08:00
shy3130 8854acad2c chore: uv.lock 同步 desktop 依赖 2026-06-23 21:50:41 +08:00
shy3130 14631087bf chore: 同步版本号至 0.1.35 (打包对齐 tag) 2026-06-23 21:49:48 +08:00
shy3130 9197ad9f8e chore: 同步版本号至 0.1.34 2026-06-23 21:48:29 +08:00
shy3130 41be5096dc feat: 桌面客户端打包 (pywebview + PyInstaller) + 系统通知
- 桌面入口: desktop.py (单实例锁 + 端口探测 + uvicorn + pywebview 窗口)
- 配置层: config.py 加 sys.frozen 检测, frozen 下 data_dir 指向用户目录
- 系统通知: notify_adapter.py 三平台 (Win winotify / mac osascript / Linux notify-send)
  接入 quote_service 告警出口, preferences 开关控制, 前端监控设置加 toggle
- 前端: 监控设置加系统通知开关, 系统设置加检查更新入口
- 打包: packaging/tickflow.spec (onedir, collect-all 原生库, 排除 vectorbt)
- CI: .github/workflows/release.yml 手动触发 + 平台可选 (windows/macos/linux)
- 依赖: platformdirs/winotify/plyer 入主依赖, pywebview 入 desktop extras
- README 加桌面客户端下载章节
- bump 版本号到 0.1.33
2026-06-23 21:47:29 +08:00
wshy 5c0e5959e9 Update README.md 2026-06-23 18:00:33 +08:00
wshy b918f4e0a0 Update README.md 2026-06-23 17:48:09 +08:00
shy3130 7a15338281 feat(signals): 统一信号库与自定义信号弹窗,三处复用同一组件
- 设置页「自定义信号」升级为「信号库」:内置信号(只读) + 自定义信号分 Tab 展示
- 内置信号补充类型/分类/说明元数据
- 自定义信号配置改为通用弹窗组件 CustomSignalDialog
- 抽出 SignalTriggerActions:新增信号 / 去信号库按钮 + 保存后自动加入触发器
- 回测高级设置、策略卡片配置弹窗均复用上述组件,去除重复逻辑
- 自定义信号删除改为二次确认(闪烁提示,3 秒自动复位)
- 版本号 0.1.30 -> 0.1.31
2026-06-23 16:47:11 +08:00
Aliang b3c59dd127 Update README.md 2026-06-23 16:13:54 +08:00
shy3130 a905cd7c77 chore(backend): 更新 uv.lock (tickflow 0.1.24 + threadpoolctl) 2026-06-23 14:03:47 +08:00
shy3130 4601816b3b fix(dashboard): 活跃换手列表换手率显示 ×100
overview 返回的 turnover_rate 为小数制, 活跃换手列表需 ×100 转百分数显示。
仅改此一处, 其他页面与 KPI 卡片不动。
2026-06-23 14:00:36 +08:00
shy3130 3bedd3e209 fix(limit-ladder): 五档修正后实时刷新连板梯队封单 + 组内按封单排序
问题: 开启「修正」后后台 depth 轮询持续更新封单缓存, 但页面封单/个数不实时
变化。根因是 depth 轮询 (depth_service._poll_loop) 与行情 SSE 刷新是两条
断开链路 — depth 修正后不广播任何事件, 前端刷新完全依赖 quotes_updated
(仅行情轮询发送), 封单数据延迟或读旧值。

修复: 新增独立的 depth_updated SSE 通道。depth 轮询每次 _fetch_and_seal
成功后经 quote_service.notify_depth_updated 触发信号, intraday SSE
event_generator 并行等待三类信号 (行情/告警/修正), 推送 depth_updated;
前端 useQuoteStream 监听后 invalidate limit-ladder + overview-market。
该通道不受实时行情开关限制 (修正轮询独立于行情轮询)。

另: 连板梯队组内排序增强 — 涨停/跌停状态股票按封单从高到低排
(vol/amount 跟随 sealMode), 封单为 null 排末尾, 其他状态不动。
2026-06-23 14:00:29 +08:00
shy3130 3e79f94da8 feat(backtest): 拆分建仓/清仓成交口径并修复退出优先级
成交口径: 单个 matching 拆成 entry_fill/exit_fill, 各自可选 close_t/open_t+1,
默认建仓次日开盘、清仓当日收盘 (最贴近真实交易)。老 matching 参数经
__post_init__ 自动映射为 entry=exit=matching, 完全向后兼容。

退出优先级修复: max_hold 不再抢占卖点信号 (signal 提到 max_hold 之前);
统一为 风控(止损/移动止损/止盈) → signal → max_hold → end, 删除 close/open
模式下风控调用顺序的差异, open_t+1 下到期仓位也能正确触发止损。

新增 3 个测试: signal 优先于 max_hold / open 模式到期触发止损 / 默认口径
买次日开盘卖收盘。现有 13 个测试经兼容映射后行为不变, 全部通过。
2026-06-23 14:00:09 +08:00
shy3130 349ff3062e 修复 AI 策略回测无信号问题
- filter_history 模板去掉 latest 过滤: 选股/回测期望不同, 选股自动取 as_of 日
- 涨跌停类信号(signal_limit_up 等)标注依赖 instruments 表, 部分环境不生成
- 指南加提示: 涨停判断优先用 consecutive_limit_ups 或 change_pct
2026-06-23 11:55:58 +08:00
shy3130 70e17a9fb5 优化策略监控与 AI 生成流程
- 策略监控从全市场信号扫描改为选股池变更对比(进入/移出)
- 触发记录/看板/弹窗三处统一策略通知格式
- AI 策略模板去掉硬编码信号/止损/评分,补全数据字典
- 创建策略对话框改为 AI生成/自定义编写 双 Tab
- 自定义 Tab 含文件路径说明+模板代码一键复制
2026-06-22 17:42:04 +08:00
shy3130 c874b50321 fix(alert): 修复一轮多只新股命中时声音断续丢失的问题
原逻辑 useQuoteStream 对每轮 SSE 告警 slice(0,2) 截断后逐条调用
pushAlertToast, 导致:
- 一轮同时命中 5 只新股时只弹 2 条 toast, 其余丢失
- 截断后只响 1~2 声, 体感'一声有一声没'

修复:
- AlertToast.tsx 新增 pushAlertToasts 批量入口: 每条都弹 toast
  (受 maxVisible 上限保护), 整批只播放一声通知音
- useQuoteStream.ts 改用批量入口并去掉 slice(0,2) 截断

效果: 每轮评估只要有新命中就响一声, 每只新股都弹 toast;
同一只股票 cooldown (默认 1 小时) 内不重复响, 避免刷屏
2026-06-22 14:01:21 +08:00
shy3130 7d41908e68 fix(onboarding): 修复引导页二次进入的问题,优化看板监控中心
引导页竞态修复 (走完向导后又被弹回第一页):
- Onboarding.tsx: complete mutation onSuccess 用 setQueryData 同步写入
  onboarding_completed 缓存, 避免跳转时守卫读到旧值 false 误重定向
- router.tsx: 守卫条件由 isLoading 升级为 isLoading || isFetching,
  settings 后台重取期间显示加载态, 兜底根治同类竞态

引导页内容丰富 + 样式美化:
- 补全 Step 3 完成页 (原 STEPS 有 4 项但只渲染 3 步), 4 步闭环
- 欢迎页特性卡片扩展到 6 个 (新增实时监控/本地优先)
- 背景加品牌紫+主色蓝双光晕渐变与网格底纹
- 进度条改胶囊式, 卡片毛玻璃 hover 上浮, 完成页 check 光晕脉冲

看板监控中心优化 (Dashboard.tsx MonitorWidget):
- 修复涨跌幅双重加号 (++10.01%) — fmtPct 已含正号, 删除手动拼接
- 新增命中信号 chips 展示 (cnSignal 转中文, 与监控中心一致)
- 代码/名称改为可点击, 弹出 StockPreviewDialog 日K预览
- 代码后加创业板/科创板/北交所板块标识 (boardTag)

附带: Layout.tsx 指数卡片 0.0% 显示白色 (原被 >=0 归入红色)
2026-06-22 13:13:00 +08:00
shy3130 56e9dc66a2 fix(monitor): 修复监控中心自定义/AI 策略触发记录显示不正确的问题
监控中心触发记录此前只显示「策略监控」等通用 type 标签,缺少策略名和股票名,
看起来像只有内置策略能正常显示 (实际是 demo 数据的假象)。

根因:
1. 触发记录的标签写死为 TYPE_LABEL[source],未使用事件里已有的 rule_name 字段
2. 真实告警的 name 字段全为 null — enriched DataFrame 在 pipeline 计算后 drop 了 name 列
   (indicators/pipeline.py),导致 row.get('name') 永远返回 None
3. 策略告警的 message 空泛 (仅「策略触发」),前端高亮 regex 无法匹配

修复 (向 demo 数据质量对齐):
- 后端 MonitorRuleEngine: 新增 set_name_map(),触发时对 None 的 name 从 instruments 表回填
- 后端 _evaluate_monitors: 每轮评估前注入 symbol→name 映射
- 后端 _default_message: 策略类型改为生成「策略名」买入/卖出信号,对齐 demo 模板格式
- 前端 AlertsList: 标签优先显示规则名 (截取「策略监控 · 空中加油」→「空中加油」)

效果: 自定义/AI/内置策略统一走相同代码路径,触发记录均显示策略名+股票名+格式化消息
2026-06-22 11:33:40 +08:00
shy3130 61ababd544 chore: bump version 2026-06-21 22:31:24 +08:00
shy3130 04bdb40b69 chore: bump version to 0.1.29 2026-06-21 22:31:10 +08:00
shy. d4dbe526de Update README.md 2026-06-21 14:21:48 +08:00
shy3130 b5780b5e30 feat: 统一监控引擎 + AlertToast通知 + 声音/角标/看板/Dev页 + 股票名称批量查询
监控引擎 (backend):
- MonitorRuleEngine 统一规则引擎,支持策略/信号/价格/行情四种类型
- JSONL 追加存储 (alert_store.py),支持分页 + 清理
- alert/monitor_rules CRUD API + seed 演示数据
- POST /api/kline/instruments/names 批量股票名称查询
- SSE strategy_alert 事件触发前端通知

前端通知体系:
- AlertToast 自定义弹窗 (Framer Motion + AnimatePresence)
- Web Audio API 合成音效 (12种预设,无需音频文件)
- 侧边栏角标 (monitorBadge.ts) localStorage 持久化未读数
- pendingSeen 机制解决 markSeen/setCurrentTotal 竞态
- 系统设置页: 通知开关 + 最大条数 + 音效选择
- 菜单设置页: 角标数字开关

监控中心 (Monitor.tsx):
- 双栏布局: 左侧实时告警列表 + 右侧规则管理
- RulesList 股票代码后显示中文名称
- RuleEditor 完整规则编辑器组件
- 告警支持查看详情 (StockPreviewDialog)

Dashboard:
- MonitorWidget: Top 10 实时告警卡片

Dev 页面:
- 一键填充演示告警 + 规则 + 分钟探测
- 可视化 SSE 事件流查看

其他:
- v0.1.19 → v0.1.28 (VERSION 从 pyproject.toml 读取)
- dev.ps1/dev.sh 添加 --host 0.0.0.0 (局域网访问)
- 修复 Screener.tsx presets.length 可选链
- README 截图表格更新 (6张) + 监控章节重写
- 删除 MinuteDataProbe 页面 (合并至 Dev)
2026-06-21 14:18:08 +08:00
shy3130 9e7ce2b5d6 feat: 策略买卖触发器改为可编辑并持久化
- 选股页策略设置弹窗: 买入/卖出由只读文本改为可点选信号控件, 保存写入策略配置
- 回测页: 复用共享 SignalPicker 组件, 消除重复的 SIGNAL_LABELS/toggleSignal 内联实现
- 新建 lib/signals.ts 作为信号映射权威来源(对齐后端 _build_signal_mask)
- 新建 components/screener/SignalPicker.tsx 共享组件(entry蓝/exit橙主题)
- 弹窗增加说明: 买卖触发器对回测和监控生效, 选股扫描仍按策略筛选规则
- README 标题更名为 A股智能量化工作台

后端无需改动(overrides dict 透传自动持久化 entry/exit_signals)
2026-06-20 14:47:53 +08:00
shy3130 358c04e916 feat: 个股日K信息条支持自定义指标(扩展数据/财务/单独显示)
- 信息条(StockInfoBar)行末加配置齿轮,复用自选列表抽屉自定义显示项
- 新增指标: 成交量/振幅/开高低 + 扩展数据(ext) + 财务(EPS/BPS/ROE/PE/PB等)
- 后端 klineDaily 新增 ext_columns 参数,按 symbol JOIN 扩展数据
- 财务数据前端直拉 useFinancialMetrics, PE/PB 用现价现算
- 每列可设单独显示(standalone),独占一行渲染
- ext 标签支持 maxTags 截断 + 点击 +N 同页展开/收起
- 修复重开弹窗信息条消失(symbol 重置与子组件 onDataChange 竞态)
- 修复 ext 勾选不显示(query key 未含 extColumns 导致缓存命中)
- 配置按钮左侧加监控通知图标占位(BellRing)
- ListColumnCustomizer 新增 showExtColumns/showStandaloneToggle prop
2026-06-20 14:42:54 +08:00
shy3130 f82b02121e chore: 项目更名 tickflow-stock-panel + 菜单logo两行显示 2026-06-19 21:33:11 +08:00
shy3130 0ad93ede15 docs: 添加连板梯队截图 + README截图改为一行两个 2026-06-19 21:31:43 +08:00