shy3130
|
2c14fde788
|
完善个股点位提醒并发布0.1.87
|
2026-07-21 22:14:07 +08:00 |
|
shy3130
|
b4dae4bca1
|
修复股票与ETF切换误清策略池
|
2026-07-21 21:39:05 +08:00 |
|
shy3130
|
0ac6d6f56c
|
修复分析报告复制按钮兼容性
|
2026-07-21 20:50:34 +08:00 |
|
shy3130
|
0cb0b38437
|
修复看板监控通知个股弹窗
|
2026-07-20 17:10:15 +08:00 |
|
shy3130
|
c8c1a01d55
|
更新交流群二维码
|
2026-07-20 13:56:04 +08:00 |
|
shy3130
|
72918fe602
|
优化策略卡片结果加载性能
|
2026-07-20 13:01:03 +08:00 |
|
shy3130
|
0635698a08
|
修复策略监控开启后结果归零
|
2026-07-20 11:12:19 +08:00 |
|
shy3130
|
e1dbd1cafb
|
修复监控中心涨跌停信号误报
|
2026-07-20 10:33:06 +08:00 |
|
shy3130
|
ed41f7b950
|
修复:个股详情量比开关显示异常
|
2026-07-20 09:59:14 +08:00 |
|
shy3130
|
4df3062002
|
fix: 完善自定义分钟数据源配置与异常处理
- 补齐资产类型和周期参数在 API、YAML 与前端编辑器中的保存回读
- 权限判断和分时监控统一复用安全的数据源解析边界
- 增加配置往返及解析异常回归测试
|
2026-07-19 17:01:33 +08:00 |
|
shy3130
|
b1b2494db9
|
merge: 合并 PR #128 自定义分钟数据源支持
|
2026-07-19 16:52:52 +08:00 |
|
shy3130
|
b17c882e27
|
feat: 完善历史换手率重算入口
- 财务数据统计纳入历史股本,并在数据页提供分批重算入口
- 缺少股本历史时阻止重算,并接入现有任务进度
- 财务分析卡片使用更新图标,明确数据拉取语义
|
2026-07-19 16:42:03 +08:00 |
|
shy3130
|
8e4258cf20
|
feat: support historical price limits and share capital
|
2026-07-18 23:37:54 +08:00 |
|
shy3130
|
e462c63b45
|
fix: align AI strategy prompt constraints
|
2026-07-18 18:31:02 +08:00 |
|
shy3130
|
ff12790042
|
feat: add trading-day volume comparison
|
2026-07-18 17:46:58 +08:00 |
|
shy3130
|
44ab51e65d
|
feat: improve strategy scoring and backtest execution
|
2026-07-18 16:59:53 +08:00 |
|
shy3130
|
a1e8be58db
|
feat: release v0.1.86
|
2026-07-18 00:49:28 +08:00 |
|
shy3130
|
34eaba3010
|
fix: handle uncovered walk-forward folds
|
2026-07-17 14:00:16 +08:00 |
|
shy3130
|
1e38c8cebb
|
fix: reset strategy builder identity
|
2026-07-16 16:12:06 +08:00 |
|
shy3130
|
c763a6970f
|
fix: restore strategy and data compatibility
|
2026-07-16 14:34:07 +08:00 |
|
shy3130
|
77876c7ee4
|
fix(data): avoid destructive enriched rebuild cleanup
|
2026-07-15 21:34:44 +08:00 |
|
shy3130
|
0b3b769ca8
|
fix(strategy): clear saved strategy drafts
|
2026-07-15 20:51:07 +08:00 |
|
shy3130
|
f317377bef
|
fix(strategy): apply saved params to builtin screeners
|
2026-07-15 20:06:11 +08:00 |
|
shy3130
|
89115e6f73
|
fix(strategy): apply saved parameters during execution
|
2026-07-15 19:03:48 +08:00 |
|
shy3130
|
de1b1713fa
|
fix(backtest): 参数优化页日期选择器被布局遮挡
根容器缺少高度约束, 配置列内容撑高后整页在外层滚动容器滚动,
DatePicker 弹层 (absolute 内联) 被裁剪无法完整显示。
对齐 StrategyBacktest 的布局: 根容器加 h-full min-h-0 overflow-hidden
使整页不滚动, 配置列/结果列各自 overflow-y-auto 内部滚动, 日期弹层
向下展开时在可视区完整显示。
|
2026-07-10 17:31:07 +08:00 |
|
shy3130
|
e61c228002
|
fix(ai): base_url 归一化保留非 v1 版本段, 修复 GLM /v4 被 404
normalize_openai_base_url 旧实现只检查「是否以 /v1 结尾」, 不是就强制补 /v1。
智谱 GLM 的 OpenAI 兼容地址是 /api/paas/v4, 被补成 /api/paas/v4/v1,
SDK 再拼 /chat/completions → 不存在路径 → 404。
改用正则检测 URL 末尾已有的版本段 (/v1、/v2、/v4、/v1.1 等):
- 已有版本段 → 保持原样
- 无版本段 → 补 /v1 (无版本号网关行为不变)
- 去 /chat/completions 后缀逻辑保留
补 4 条单测覆盖 GLM /v4 场景, 原有 v1/无版本网关回归不变。
Closes #60
|
2026-07-10 17:06:17 +08:00 |
|
shy3130
|
fd0a83b276
|
polish(layout): SSE 断连提示移至底部居中 + 文案调整
|
2026-07-10 16:37:31 +08:00 |
|
shy3130
|
d9fe050b1f
|
fix(realtime): 策略页实时行情闪烁 + 策略结果刷新机制
策略页开启实时行情时, 被监控的策略列表反复闪烁 (变 0 → 全部失效 → 又出现),
非监控策略不受影响。
根因: 每个行情周期后端先广播 quotes_updated 再重算策略, 重算时先清空内存结果
再逐个回填 (非原子窗口)。前端 quotes_updated 与 strategy_results_updated 两个
SSE 事件都刷新 screener-cached, 第一次撞上清空窗口拿到空结果, 第二次拿到重算
结果, 每周期重复 → 闪烁。
修复:
- 前端: 从 SSE_INVALIDATE_PREFIXES 移除 screener, quotes_updated 不再刷新策略页,
每周期只剩 strategy_results_updated (重算完成后才发) 触发一次刷新。
- 后端: monitor.evaluate 改为临时容器收集结果, 算完后整体替换 _latest_strategy_results,
/cached 并发读取永远拿到完整结果, 不会读到空中间态。
配套:
- 新增 strategy_results_updated SSE 事件 + subscriber 合并通知机制
- 策略卡片 loading 时不显示旧命中数, 避免刷新时数字跳动
|
2026-07-10 16:37:11 +08:00 |
|
shy3130
|
9c6c1fce61
|
fix(watchlist): 支持重置全部筛选
|
2026-07-10 15:18:40 +08:00 |
|
shy3130
|
fdee661d47
|
fix(watchlist): 保留冷缓存自选占位行
|
2026-07-10 15:07:14 +08:00 |
|
shy3130
|
be626c73e1
|
release: v0.1.83
|
2026-07-10 12:00:49 +08:00 |
|
shy3130
|
aea694ee83
|
fix(strategy): keep AI-generated strategies in AI pool
|
2026-07-08 18:38:14 +08:00 |
|
shy3130
|
f8914c9140
|
feat: 新增企业微信推送、个股分析页重构、价位算法优化及多处交互改进 (v0.1.82)
- 推送: 新增企业微信群机器人通道(与飞书并列), 监控告警/复盘报告多渠道分发
- 个股分析: 历史报告改为右侧常驻栏(展示全部股票报告), 进页面自动恢复上次选股
- 价位算法: 成交密集区改用换手率衰减模型(国内主流筹码分布); 缺口回补判定修正(必须完全穿越缺口)
- 回测: 回撤止盈改纯峰值口径(与 trailing_stop 一致); 佣金/印花税/滑点合并一行; 建仓口径加问号气泡说明
- 分时图: 自选列表迷你分时图加渐变填充(对齐个股对话框风格)
- 图表: 个股分析日K图右侧标签适配浅色主题; 价位标签与下方文字行双向 hover 高亮联动
|
2026-07-07 17:56:25 +08:00 |
|
shy3130
|
03e99bd05f
|
feat(stock-sdk): 取数入口补充 INFO 日志, 便于确认切换后实际走 stock-sdk
|
2026-07-07 13:07:59 +08:00 |
|
shy3130
|
9b22030166
|
fix: 数据源切换按 datasets 动态分流, 修复切换到 stock-sdk 后分钟K仍走 tickflow
- DataSources.tsx switchProvider 非 tickflow 分支原只传 4 个字段(漏 minute_data_provider),
后端 exclude_none 保留旧值导致 minute 永远停在 tickflow。改为按源声明的 datasets
动态构建: 支持的数据集切到该源, 不支持的显式写 tickflow(消除 UI/后台不一致)
- README License 段补充 stock-sdk (ISC) 协议声明
|
2026-07-07 12:39:23 +08:00 |
|
shy3130
|
fb7cf921a9
|
feat: 看板刷新按钮改为后端缓存重载
原「刷新」只重新请求前端数据(overview.refetch), 不动后端缓存, 跨天
残留时拿到的是旧数据。改为「重载」:
- 新增 POST /api/data/refresh-cache 端点: clear_cache + refresh_cache
重建 enriched 内存缓存, 同时清 overview 聚合缓存 + screener TTL 缓存
- 看板按钮先调后端重建缓存, 再刷新看板数据
- 与设置页「清理并刷新」(清前端 react-query)互补, 这个重建后端 Polars 缓存
|
2026-07-07 11:43:39 +08:00 |
|
shy3130
|
a688690f15
|
fix: 盘前维表同步后刷新 enriched 缓存, 修复跨天连板梯队不准
根因: 服务跨天不重启时, enriched 内存缓存残留前一交易日数据, 连板梯队/
选股读到旧的涨跌停信号。盘前维表 (instruments) 含当日精确涨跌停价, 但同步
完成后未触发缓存重建。
修复: run_instruments_sync 完成后 (rows > 0), 执行 clear_cache + refresh_cache,
让 enriched 缓存基于最新维表 (含当日 limit_up/down) 重建。与设置页「清理并刷新」
按钮同等效果, 但盘前自动执行, 无需手动操作。
|
2026-07-07 11:10:17 +08:00 |
|
shy3130
|
9217efa1da
|
docs: README 添加交流群二维码
- 新增「💬 交流群」板块(免责声明上方)
- 二维码文件重命名为英文 community-qr-code.jpg
|
2026-07-07 10:48:58 +08:00 |
|
shy3130
|
9f78fdebd4
|
style: 主题切换只保留图标, 与设置同行
左侧菜单底部: 主题切换(纯图标)+ 设置同一行排列, 更紧凑。
原来上下两行各占满宽, 现在左边小图标按钮 + 右边设置占满剩余空间。
|
2026-07-06 17:45:25 +08:00 |
|
shy3130
|
9ef9b4e6ec
|
chore: bump to 0.1.81
|
2026-07-06 17:42:19 +08:00 |
|
shy3130
|
966d94ab03
|
feat: 数据源插件化架构 + stock-sdk 首个插件
将可选数据源改为插件化架构: 插件代码放 backend/app/plugins/<name>/,
用户在设置页点击安装依赖, 主仓库不背运行时依赖(nodejs 等)。
架构:
- loader.py 新增 _load_builtin_plugins() 扫描 plugins/ 目录, 通过
plugin.yaml 清单动态发现并注册插件(委托自检 + 优雅降级)
- runtime 字段支持 node/python, 安装/卸载分别用 npm/pip
- 现有 tickflow + YAML 自定义源逻辑 100% 保留, 插件是叠加层
stock-sdk 插件 (plugins/stocksdk/):
- 原始实现来自 @forrany 的 PR #57, 迁移到插件化架构, 署名保留
- Node 桥接 (bridge.py/mjs) + Python provider, 覆盖日K/除权/分钟/实时
- 设置页主列表直接显示: 未装灰显+安装按钮, 装完可切换/卸载
配套:
- instrument_sync: 通用增强, 任何 provider 都能提供标的维表
- install/uninstall: uv 优先回退 pip, 容错坏 uv.toml + 国内镜像
- 10 例单测全过, tsc 零错误
|
2026-07-06 17:00:56 +08:00 |
|
shy3130
|
cc697e8ea4
|
fix: 分时图跟随实时行情自动轮询
实时行情开启后(realtimeRunning), 自选列表分时图自动按 15s 轮询刷新,
无需用户单独开启 minute_intraday_refresh 开关。
|
2026-07-06 17:00:55 +08:00 |
|
shy3130
|
17188e16db
|
docs: 补传缺失的使用文档(configuration/deployment/features/strategy)
|
2026-07-03 15:23:24 +08:00 |
|
shy3130
|
60dec142ea
|
Merge PR #45: feat 亮色主题 — 明暗切换 + 全部图表主题化
|
2026-07-03 14:12:13 +08:00 |
|
shy3130
|
2cbdc99659
|
Merge PR #44: fix(docker) 修复 .env 相对路径覆盖导致每次重建容器丢数据
|
2026-07-03 14:07:55 +08:00 |
|
shy3130
|
c1a5a6c367
|
Revert "fix: 修复海外服务器部署后交易时段时区误判为休市"
This reverts commit f02a88ebaa.
|
2026-07-03 14:07:26 +08:00 |
|
shy3130
|
574b163cb3
|
docs: README 与首次引导页增加"非 TickFlow 官方项目"声明
- README 顶部加醒目声明 badge(红+绿)+ 声明正文,功能介绍改为按页面分组的清单
- Onboarding 引导页新增 Step 0"使用前请知悉"声明步骤(个人开源/与官方无关/盈亏自负/不建议商用),原 4 步顺延为 5 步
|
2026-07-03 13:31:40 +08:00 |
|
shy3130
|
f02a88ebaa
|
fix: 修复海外服务器部署后交易时段时区误判为休市
- 新增 backend/app/timezone.py 统一上海时区入口(ZoneInfo + UTC+8 兜底)
- quote_service / depth_service 的 _is_trading_hours() 改用显式 Asia/Shanghai
- Dockerfile 加 ENV TZ=Asia/Shanghai + tzdata,docker-compose.yml 加 TZ 环境变量
- 代码与容器双保险,解决裸 datetime.now() 在 UTC 容器下永远判为休市的问题
|
2026-07-03 13:31:33 +08:00 |
|
shy3130
|
7c51bf5054
|
refactor(docs): 策略提示词文档统一归入 prompts/,docs/ 专放使用指南
将 4 个策略运行时文档(strategy-guide/step1/step2/example)从 docs/
迁至 backend/app/strategy/prompts/,与运行时加载路径一致;docs/
回归「项目使用指南与配置说明」定位。
- prompts/ 现自包含 4 个 md,guide 内对 example 的相对链接可正确解析
- 更新 README 与前端 StrategyBuilderDialog 的引用路径
- docs/ 保留 deploy-password.md / screenshots / zhihu 等面向人类的文档
承接 #41 Docker 文档缺失修复
|
2026-07-03 11:03:24 +08:00 |
|
shy3130
|
56276384e5
|
fix(strategy): 修复 Docker 镜像中 AI 策略提示词文档缺失
将运行时依赖的 3 个提示词文档(strategy-guide.md / step1 / step2)
从 docs/ 复制到 backend/app/strategy/prompts/,使其随 COPY backend/app
自动进入镜像;并将 GUIDE_PATH/_DOCS_DIR 改为相对当前文件的 prompts/,
路径在开发环境与 Docker 容器中解析一致。
修复 #41
|
2026-07-03 09:51:30 +08:00 |
|
shy3130
|
b203e07e22
|
chore: 更新 uv.lock
|
2026-07-02 17:46:31 +08:00 |
|
shy3130
|
d4dcbb1797
|
chore: 版本号升至 0.1.70
|
2026-07-02 17:45:30 +08:00 |
|
shy3130
|
e283d487ce
|
feat: Free 档实时行情监控限制提示
实时行情开关区新增 Free 档限制提示「监控自选股前 5 只,
全市场监控需 Starter+」,位于交易时段状态上方,可手动关闭
(不持久化,刷新后恢复显示)。
|
2026-07-02 17:40:41 +08:00 |
|
shy3130
|
fca0e261db
|
feat: 系统工具页新增封单监控触发验证
- 新增封单监控 tab: 模拟触发 (纯条件判断) 与真实触发 (落盘+推送)
供验证规则是否生效
- 页面标题与文案中性化, 避免暴露内部调试性质
|
2026-07-02 17:22:52 +08:00 |
|
shy3130
|
33a7be0deb
|
feat: 连板梯队封单监控卡片 UI 与 API
- monitor_rules API: RuleModel 加 metric/threshold 字段; ladder 类型
需 DEPTH5_BATCH 能力校验; 加模拟触发与真实触发端点供验证
- 连板梯队卡片: 右上角监控按钮 + 设置菜单 (段控指标/阈值+单位/
胶囊推送/权限提示); 开启监控的卡片置顶 + 背景区分
- 推送默认取全局设置; 单位默认万手/亿元
- 非付费用户可见功能入口但保存禁用, 提示后续适配免费数据源
|
2026-07-02 17:22:42 +08:00 |
|
shy3130
|
000a9ead77
|
feat: 连板梯队封单监控规则引擎
- monitor_rules 新增 ladder 类型 (封单量/封单额 <= 阈值预警)
- monitor 加 _evaluate_ladder: 封单判断 + 炸板/翘板预警, message 体现封单量
- monitor 加 has_rule_type 供评估前判断是否需注入特殊数据
- quote_service: 有 ladder 规则时从 depth_service 注入封单量到 enriched
|
2026-07-02 17:22:32 +08:00 |
|
shy3130
|
255688fab4
|
feat: 概念涨幅轮动 AI 分析
- 新增 concept_rotation_analyzer: 从涨幅排名矩阵预计算轮动信号
(主线/新晋/退潮/机构vs游资), 结合大盘背景生成分析报告
- rps API 加 /rotation-analyze 流式端点 (NDJSON)
- 轮动对话框: AI 占位替换为流式 Markdown 报告区 + 自动滚动
- 删除搜索框, 新增选中概念排名行 (前10红/后10绿)
|
2026-07-02 17:22:16 +08:00 |
|
shy3130
|
c394a365e1
|
revert: 撤回连板梯队 queryKey 扁平化修复
撤回 e7615fb 中 [...QK.limitLadder(...)] 改写, 恢复为 [QK.limitLadder(...)]
嵌套写法。
|
2026-07-02 12:28:16 +08:00 |
|
shy3130
|
09ec2a55c3
|
fix: 当日涨跌停判定改用维表 limit_up/limit_down 权威值
原逻辑用 _limit_price(prev_close, 推断涨幅) 自算理论涨停价, 涨幅靠 symbol
前缀 + ST 名字匹配推断, 存在两类缺陷:
1. 浮点精度: 自算涨停价比真实价多 0.01, 超出 0.005 容差导致漏判 (12 只)
2. ST 匹配漏洞: 名字含 "S" 不含 "ST" (如 S佳通) 被漏判 ST 5% 档 (1 只)
改为优先读 instruments 维表的 limit_up/limit_down (交易所级别精确价),
仅新股 (limit_up 为 null 或哨兵 100000) 回退自算。输出 schema 不变,
下游 depth_service/screener/market_overview 零改动。
历史路径 compute_limit_signals 不动 (instruments 仅存当天 as_of)。
|
2026-07-02 12:28:13 +08:00 |
|
shy3130
|
5a9fa9b255
|
feat: 概念涨幅RPS轮动分析
|
2026-07-01 17:48:28 +08:00 |
|
shy3130
|
ff9d7a9ac4
|
fix: filter_history 策略(反包等)实时监控可触发通知
|
2026-07-01 14:38:40 +08:00 |
|
shy3130
|
8127bd3c99
|
chore: 版本号升至 0.1.68
|
2026-07-01 11:27:30 +08:00 |
|
shy3130
|
ce5c705ab4
|
fix: 跨日后连板梯队整体少算一档
根因: live_agg 缓存的昨日连板数 (_prev_consec_up/down) 跨日不失效,
盘中增量计算永远基于前天基准, 导致次日开盘连板数整体 -1。
- get_live_agg() 加跨日失效守卫: date.today() 变化时按需重建
(fast-path 仅比较 today ~0.24ms/次, 跨日当天一次性磁盘校验)
- cron 盘后管道补 refresh_cache(), 与手动触发 /api/pipeline/run 对齐
(此前 cron 路径漏了这步, 盘后落盘的新 enriched 不反映到内存缓存)
|
2026-07-01 11:19:32 +08:00 |
|
shy3130
|
4a7d405d9d
|
docs: 新增飞书推送截图(个股监控/自动复盘)
|
2026-07-01 10:15:29 +08:00 |
|
shy3130
|
68841af662
|
feat: 定时复盘飞书推送 + SSE 实时进度
- 定时复盘支持推送到飞书(卡片消息, 完整报告), 渠道多选(飞书可选, 微信开发中)
- 推送开关独立常驻, 与定时/实时行情解耦; 手动/定时生成都可推送
- 定时复盘改流式生成, 通过 SSE(review_progress)实时推给前端, 开着页面可见边生成边显示
- 修复定时任务协程未 await 的 bug(lambda 包裹 async → 改传函数对象 + args)
- LLM 断流自动重试(最多2次), 后端归档 + 飞书推送, 异常兜底通知前端
- 复盘定时下限改为 15:00, 默认 15:10
- 版本号 0.1.66 → 0.1.67
|
2026-06-30 17:28:18 +08:00 |
|
shy3130
|
5d4d643bd8
|
fix: 同步后端 __version__ 到 0.1.66
|
2026-06-29 17:53:29 +08:00 |
|
shy3130
|
ec941e1eb1
|
chore: bump version to 0.1.66
|
2026-06-29 17:50:12 +08:00 |
|
shy3130
|
47a87fca2b
|
feat: 环境变量预置访问密码 + 飞书推送文档
|
2026-06-29 17:41:32 +08:00 |
|
shy3130
|
73490fdf5e
|
chore: bump version to 0.1.65
|
2026-06-29 17:21:01 +08:00 |
|
shy3130
|
a72445d782
|
fix(pipeline): 修复盘后管道除权因子拉取范围逻辑
daily_pipeline 除权因子改用日K范围回填 (实时增量模式兜底最近数日),
移除 max_date/incremental 依赖;kline_sync 修复 _normalize_adj_factor
重复列重命名崩溃, 新增 fetch_adj_factor_single 单股拉取;
kline.py fallback 改用 compute_enriched 应用复权;
index_sync 指数/ETF 日K同步增加批次进度回调;
同步指数日K步骤输出详细日志。
|
2026-06-29 17:17:44 +08:00 |
|
shy3130
|
37934091ac
|
feat(notify): 推送通知接入飞书 Webhook
新增 webhook_adapter 飞书群机器人推送 (含签名校验);preferences/settings
增加 feishu_webhook_url/secret 与 webhook_enabled_default (新建规则默认推送)
配置与端点;Monitoring 设置页重构为「推送通知」卡片 (渠道列表+飞书地址折叠
+默认渠道勾选);RuleEditor 规则编辑器支持单条规则勾选飞书。
QMT/ptrade 渠道文案统一改为「待定」。
|
2026-06-29 17:17:33 +08:00 |
|
shy3130
|
9dbd32246c
|
feat(backtest): 风控新增固定止盈 + 优化回测范围
风控: MatcherConfig 增加 take_profit_pct, 单标的与组合引擎风险检查新增
涨破止盈线卖出逻辑 (退出原因 take_profit);strategy.py 透传 overrides,
api/strategy.py 与前端类型暴露 take_profit;风控 tab 增加止盈输入框,
摘要/结果头/退出标签同步展示;修复未设止损时止盈检查被跳过的 bug。
回测范围: StockPoolPicker 输入框右侧增加「导入自选」「清空」按钮与
「当前范围」指示器, 移除冗余的「留空=全市场」提示。
|
2026-06-29 17:17:20 +08:00 |
|
shy3130
|
cd76796a5c
|
feat(monitor): 触发记录展示命中条件与当前价位
告警事件落盘时增加 conditions + logic 条件快照, 经 quote_service 透传到
SSE 推送;前端触发记录详情行渲染命中条件与现价, 替代原先仅显示
「信号触发」的通用文案。
|
2026-06-29 17:17:08 +08:00 |
|
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 |
|