shy3130
|
e4f0a95ca2
|
fix: 升级 Expert Key 后财务页「全部同步」无反应
启动时无 FINANCIAL 能力导致调度器 _capset 为 None, 后续在设置页更新 Key
时 app.state.capabilities 已刷新但调度器未同步, trigger() 仍报
no FINANCIAL capability 而拒绝同步。新增 update_capabilities 并在设置 API
刷新能力时同步推给调度器; 前端对 started:false 一律给出提示, 不再静默。
|
2026-06-30 22:30:52 +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 |
|
Lzwaang
|
2d86dea721
|
Avoid copying Codex env file
|
2026-06-29 22:53:36 +08:00 |
|
Lzwaang
|
ab9480b3f3
|
Harden Codex CLI workspace isolation
|
2026-06-29 22:44:31 +08:00 |
|
Lzwaang
|
ec6380376d
|
Add Codex CLI AI provider
|
2026-06-29 22:32:58 +08:00 |
|
shy3130
|
47a87fca2b
|
feat: 环境变量预置访问密码 + 飞书推送文档
|
2026-06-29 17:41:32 +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
|
cd76796a5c
|
feat(monitor): 触发记录展示命中条件与当前价位
告警事件落盘时增加 conditions + logic 条件快照, 经 quote_service 透传到
SSE 推送;前端触发记录详情行渲染命中条件与现价, 替代原先仅显示
「信号触发」的通用文案。
|
2026-06-29 17:17:08 +08:00 |
|
shy3130
|
69cd7af8d9
|
feat: 新增访问密码认证(首次本机设密码 + 公网防护)
- 后端: PBKDF2 密码哈希 + 会话 token(auth.json 存储, 零数据库)
- 中间件: 未设密码时本机可设/公网拒绝(防裸奔+防抢占), 已设密码后 401 拦截
- 5个 API: status/setup/login/logout/change-password, 含本机限制+登录限流
- 前端: 登录页/设密码页 + 全局 401/403 拦截跳转
- 安全: HttpOnly cookie + 5次失败锁5分钟 + 改密码清会话
|
2026-06-28 20:02:00 +08:00 |
|
shy3130
|
8a8cd746dc
|
feat: — 数据目录/实时监控/定时复盘/老CPU兼容
1. 桌面客户端体验优化,Polars 兼容内核 (老 CPU 兼容)
2. 自选页实时监控优化
3. 个股监控逻辑优化
4. 新增定时复盘
6. 其他: 修复 settings.py 中 HTTPException 未 import 的既有 bug
|
2026-06-28 18:08:52 +08:00 |
|
shy3130
|
76431b588e
|
feat: 概念/行业数据改为用户手动获取
将内置概念(ext_gn_ths)/行业(ext_hy_ths)数据源从「自动拉取」改为
「用户在页面手动点获取」, 避免启动时网络请求阻塞, 也符合用户自主控制预期。
后端:
- ext_presets.py (新增): 内置预设配方 + 结构转换 (接口 concepts/industries
数组 → 拼接成字符串) + ensure_builtin_presets(只建config不拉数据) +
fetch_preset(手动拉取, 供 API 调用)
- ext_data.py: 新增 POST /api/ext-data/presets/{config_id}/fetch 专用接口
(放在动态路由前避免被当 config_id); 走结构转换保证 schema 一致
- main.py: lifespan 改为只 ensure_builtin_presets 创建 config, 不自动拉取
安全保证: 已存在则完全跳过, 绝不覆盖用户已有数据; 行业表去掉无用的
thscode/time 列。
|
2026-06-28 16:01:39 +08:00 |
|
shy3130
|
33f10c2847
|
重新设计复盘页面并优化页面
|
2026-06-28 13:49:05 +08:00 |
|
shy3130
|
2acaa38a2b
|
feat: release v0.1.60
|
2026-06-27 23:23:34 +08:00 |
|
shy3130
|
00d856191b
|
refactor(stock-analysis): 价位体系重构 — 价量支撑 + 通道拆分 + 右侧标签带
压力支撑语义归位:从 BOLL 波动通道改为 Volume Profile 成交密集区
(价+量驱动,真正的市场结构支撑/压力),原 profile 组并入 sr 组。
通道拆分:原合并的「波动通道」拆为 4 个独立开关 —— 布林带(含中轨
MA20)+ Keltner 短/中/长三档,各自显隐。
图表布局:
- 价位文字改用 line series + endLabel 显示在右侧 grid.right 预留带,
不再压在蜡烛上;预留带加宽至 144px 保证标签完整
- 标题栏改两端布局,当前价右置并加大加粗、带涨跌色
- 价位统计面板恢复至图表下方
默认开启:压力支撑 + 枢轴点 + Keltner短期。
|
2026-06-26 23:34:54 +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
|
11a972a980
|
feat(financials): AI 财务分析 — 流式生成 + 全局胶囊 + 历史报告持久化
后端:
- 新增 financial_analyzer 服务(CFA 级九维分析提示词 + LLM 流式调用)
- 新增 ai_reports 持久化存储(保留前 20 条)
- 新增 /analyze 流式接口 + 报告 CRUD 接口
- 同步时间持久化到 preferences.json,重启不丢失
前端:
- 全局 AI 分析对话框(store 驱动,支持最小化/历史模式)
- 全局可拖拽任务胶囊(玻璃拟态,三态配色,60fps 拖拽)
- 历史报告列表面板(财务页底部)
- 轻量 Markdown 渲染器(表格折行/列表/引用)
- 同标的历史二次确认 + 财务菜单改名「财务分析」
同步版本号至 v0.1.45
|
2026-06-25 22:39:34 +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
|
388a929d0a
|
feat(financials): 同步进度三态可视化 + 点击即时反馈 + AI分析占位按钮
后端 (financial_sync.py):
- run_now 全量同步改为逐表执行, 每张完成立即更新 last_sync
(原一次性更新, 前端轮询看不到中间进度; 现在前端能逐步看到 N/4)
- 修复 sync_all 函数缩进被破坏导致的 NameError (上版引入的 bug)
前端 Financials.tsx:
- 点击同步即时反馈: useFinancialSync 加 onMutate 立即刷新 status
+ syncMut.isPending 兜底, 消除请求阻塞期间 UI 无变化
- 同步进度按本次同步算 (记录 syncStartedAt), 不再用 rows>0 判断
(修复已有数据时一开始就显示 4/4)
- 卡片三态可视化:
· 全量同步: 4 张卡片依次 等待(沙漏)→同步中(转圈)→完成(绿勾)
· 单表同步: 只有目标卡片变化, 其他卡片不受影响
- 顶部进度: 全量显示 N/4, 单表显示表名
- 每张卡片底部加最后同步时间
- 完成态用绿色对勾 (不用红色 bull), 卡片保持中性配色
StockFinancialDetail.tsx:
- 头部加 AI 财务分析占位按钮 (紫色 Sparkles), 点击提示开发中
|
2026-06-25 00:17:10 +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
|
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
|
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
|
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 |
|
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
|
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
|
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
|
d89b9068a7
|
feat: 五档盘口真假涨停修正 + 连板梯队涨跌停切换 + 自动版本管理
连板梯队:
- 新增涨停/跌停方向切换(胶囊式, 涨停红/跌停绿)
- 跌停侧三状态: 跌停/翘板/止跌(对称涨停侧)
- 涨跌停双计数 + 真假板修正/降级标识(问号弹窗)
五档盘口 sealed(真假涨停):
- depth_service 独立旁路线(只读enriched, 不动计算逻辑)
- 涨跌停一体(一次depth.batch双向覆盖)
- 假涨停归炸板/假跌停归翘板, 真封板显示封单量
- 三层防护节流(套餐clamp+限速clamp+接管通知)
- Pro/Expert盘中轮询 + 盘后定版job + 启动补跑
- 收盘job可配置(15:01~18:00, 默认15:02)
- 设置页'连板梯队降级修正'卡片(开关+配置+立即修正)
- 看板页同步应用sealed修正+降级标识
配置/SDK:
- tiers.yaml拆分depth5/depth5.batch, 补全quote.batch
- tickflow SDK升级0.1.21→0.1.23(depth.batch可用)
- 实时行情轮询间隔下限调整(pro 2s/expert 1s)
- capabilities缓存schema版本化(v3)
其他:
- 档位配色抽共享组件TierTag/tierStyle
- Keys页档位问号弹窗(4档位tag+检测说明)
- git hooks自动版本号+0.0.1+打tag
|
2026-06-19 20:09:09 +08:00 |
|
shy3130
|
a5a04b4dd8
|
fix: 端点套餐门控/探测重试/分钟K月单位 + 财务页新功能 + localStorage 残留自愈
## Bug 修复
- 端点测速:Expert+ 用户现可选用专线端点(premium),非 Expert 仍锁定(EndpointTestDialog)
- 能力探测:try_call 对瞬时错误(429/5xx/超时)重试,避免抖动误丢 capability(导致"需 Free"误导徽章)
- 数据画像 CapBadge:tierReq='Free' 时不显示无意义的"需 Free"徽章
- 财务同步:用服务端 is_syncing 标志驱动 UI,刷新后仍正确显示"同步中",防重复点击 + 进度提示
## 新功能
- 财务页重设计:中间模糊搜索框(代码/名称),选股后展示 4 标签页详情
(核心指标/利润表/资负表/现金流),字段格式化(百分点/金额转亿/每股)
- 分钟K向前扩展:Expert+ 新增「月」单位(1~6 月,180 天),Pro 仍只「天」(15 天)
## localStorage 残留自愈(拉新代码后不再显示本地开发残留)
- 策略池:加载后自动清除失效的自定义策略 ID
- 回测页:校验 selectedStrategy 是否存在,失效则重置;result 不跨会话恢复
## 重构
- 提取共享 tier 工具到 capability-labels.ts(TIER_RANK/isExpertOrAbove)
|
2026-06-19 00:10:01 +08:00 |
|
shy3130
|
7369358d08
|
Initial release v0.1.19
|
2026-06-18 17:18:23 +08:00 |
|