shy3130
|
0724fd3721
|
fix(docker): PyPI 源多级兜底,避免单源同步延迟导致构建失败
修复国内镜像(清华源)同步 uv 包延迟时,USE_CN_MIRROR=1 构建报
"Could not find a version that satisfies the requirement uv" 的问题,
用户此前需手动传 --build-arg PYPI_INDEX 换源才能通过。
- pip install uv 加三重 fallback:主源(清华) → 备用源(阿里云) → 官方源
- uv sync 同时挂双 index(UV_DEFAULT_INDEX + UV_EXTRA_INDEX_URL),
uv 自动在两源查找,任一源缺包时另一源补位
- 新增 PYPI_FALLBACK build arg(默认阿里云),可自定义
正常构建零影响(fallback 首环即成功,--frozen 严格按 lock 安装),
仅在主源故障/同步延迟时自动兜底。
|
2026-06-26 17:39:45 +08:00 |
|
shy3130
|
b8ed0f8177
|
fix(analysis): 新用户无数据时概念/行业分析配置按钮无响应
根因:配置弹窗 <AnimatePresence> 在主 return 内,而无数据的早期
return 分支没有渲染弹窗,导致新用户点按钮 showConfig=true 无组件响应。
- ConceptAnalysis: 早期 return 分支补上弹窗渲染
- IndustryAnalysis: 早期 return 分支补上配置按钮(原来缺失)+弹窗渲染
修复后新用户在两个页面点配置按钮均可正常弹出。
|
2026-06-26 16:26:11 +08:00 |
|
shy3130
|
1e0e9b422b
|
feat(stock-analysis): 添加「点位提醒」按钮占位(开发中)
在 AI 个股分析按钮旁新增点位提醒入口,预留关键价位触发提醒功能。
当前点击提示「开发中」,后续可复用监控引擎实现价格触及通知。
|
2026-06-26 16:16:39 +08:00 |
|
shy3130
|
3948d2555e
|
feat(stock-analysis): 带状指标改为跟随行情漂移的曲线
布林带/Keltner通道/ATR止损从「水平直线(仅最新值)」改为
「跟随时间漂移的曲线(ECharts line series)」,还原通道的真实形态。
后端(stock_analysis.py):
- 新增 _build_series(): 提取 5 组带状指标每日时间序列
· boll(布林带上下轨)
· keltner_s/m/l(短/中/长三档 MA±n×ATR,MA120 现场算)
· atr(close±2ATR 动态止损止盈)
- get_levels 返回新增 dates + series 字段
前端(AnalysisKChart.tsx):
- Props 加 series/seriesDates,数据预处理做日期对齐映射
- buildOption 按开关添加 type:'line' 曲线(复刻 maLine 模式)
- collectPriceLines 过滤布林带/Keltner/ATR 水平线,避免与曲线重复
- Keltner 三档渐变青色系区分档位
- 水平直线(枢轴/前高前低/成交密集/缺口/斐波那契/整数关口)不变
|
2026-06-26 16:02:16 +08:00 |
|
shy3130
|
2015ef0c78
|
feat: 个股分析(Beta) — 专用日K + 9类关键价位 + AI四维分析
新增个股分析页,以行情与关键价位为视觉主体,与财务分析(财务质量评级)定位互补:
后端:
- indicators/levels.py: 9 类关键价位纯函数计算
· 压力支撑(布林带)/ 成交密集区(POC)/ 枢轴点(可配档位)/ 前高前低
· Keltner通道(MA±n×ATR 短/中/长)/ ATR止损(close±nATR)
· 缺口位(未回补跳空)/ 斐波那契回撤 / 整数关口(自适应步长)
- services/stock_analyzer.py: AI 四维(技术/基本面/财务/消息面)流式分析,NDJSON
- services/stock_reports.py: 报告持久化(最多50条),独立 JSON 存储
- api/stock_analysis.py: levels/analyze/reports 端点
前端:
- AnalysisKChart: 专用 ECharts 日K(主图+成交量+滑块),9 类价位开关
- 蓝色胶囊(Bubble/Host/Dialog),与财务分析紫色主题并存
- stockAnalysisStore: useSyncExternalStore 全局存储,后台流式
- useLastStock + LastStockChip: 记忆最近查看个股(财务/个股分析页)
其他优化:
- AI 设置页:一键清空配置(保留UA) + 保存后乐观更新连接状态/菜单
- MarkdownRenderer: 去除 space-y-0 遮蔽,各块间距与分隔线可见性优化
- 个股分析页 Beta 标识(标题 + 菜单)
- 版本号 0.1.45 → 0.1.50
|
2026-06-26 15:36:52 +08:00 |
|
shy3130
|
3bb66f3e81
|
docs(legacy-cpu): 补充镜像体积说明与多 extras 用法
- 标注 legacy-cpu wheel 约 50MB,启用后镜像体积会相应增大
- 补充 BACKEND_EXTRAS 空格分隔可同时启用多个 extras 的用法
|
2026-06-26 11:25:50 +08:00 |
|
shy3130
|
f1b41ca342
|
fix(financials): 全部同步改后台异步,修复点击无反应
根因:sync 路由同步阻塞调用 run_now(),全量同步 4 表 × 5500 标的需 ~2 分钟,
HTTP 请求长时间 pending 被浏览器/代理超时掐断,UI 表现为点击无反应。
后端:
- 抽出 _run_body() 同步逻辑本体;新增 trigger() 在后台线程执行,
并在持锁状态下立即置 _is_syncing=True(消除竞态窗口 + 防重复点击启动多线程)
- sync 路由改调 trigger(),立即返回 {started: bool},前端轮询 /status.syncing 看进度
前端:
- api.ts financialSync 返回类型改为 {started; reason?}
- Financials.tsx 同步状态以 status.syncing 为真值、isPending 兜底乐观态;
收尾时机改为监听 syncing 变 false(不再依赖瞬间触发的 onSettled);
被防并发跳过时弹 toast 提示
|
2026-06-25 15:53:31 +08:00 |
|
shy3130
|
37ebe19f1e
|
refactor(ai): 配置页单列卡片重构 + 移除无用的 Token 预算
- AI 设置页改为单列分卡片布局(Card/Field/Toggle 辅助组件),自定义配置卡
头部标注「Chat Completions」
- 移除从未实际生效的 ai_daily_token_budget(后端 config/api/settings +
前端 Settings 接口与保存参数 + UI)
- 测试结果不再展示 token 消耗,仅显示「连通成功 · 模型: xxx」
|
2026-06-25 15:53:15 +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 |
|
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
|
7a15338281
|
feat(signals): 统一信号库与自定义信号弹窗,三处复用同一组件
- 设置页「自定义信号」升级为「信号库」:内置信号(只读) + 自定义信号分 Tab 展示
- 内置信号补充类型/分类/说明元数据
- 自定义信号配置改为通用弹窗组件 CustomSignalDialog
- 抽出 SignalTriggerActions:新增信号 / 去信号库按钮 + 保存后自动加入触发器
- 回测高级设置、策略卡片配置弹窗均复用上述组件,去除重复逻辑
- 自定义信号删除改为二次确认(闪烁提示,3 秒自动复位)
- 版本号 0.1.30 -> 0.1.31
|
2026-06-23 16:47:11 +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
|
7369358d08
|
Initial release v0.1.19
|
2026-06-18 17:18:23 +08:00 |
|