shy3130
|
8385810e50
|
fix(backup): 修复 API Key 备份遗漏并明确导出范围
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-11-01 10:32:58 +08:00 |
|
shy3130
|
864bbc49d8
|
fix(minute): 完善弹窗适配、批量补齐及停牌体检
拆分同步获取和数据体检页签,固定弹窗头尾并改善窄屏布局。
复用现有同步任务定向批量补拉缺口,刷新跨页面分钟缓存。
结合日线单独统计整日零成交记录,避免停牌残留反复报缺口。
验证:独立暂存快照中后端 185 项、前端 16 项测试通过;
前端构建成功,Ruff 无新增问题,git diff --check 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-31 21:29:17 +08:00 |
|
shy3130
|
39c9ab7319
|
feat(paper): 通过扩展实现策略买卖点跟单与回测参数对齐
新增策略参数快照、逐股信号跟单、持久化去重与保护性风控,复用原模拟仓下单、撮合及账务。
前端增加参数预览、绑定、暂停恢复和执行记录,保留旧事件规则与账户兼容;核心代码和五档委托保持未改动。
验证:后端 3763 passed、7 skipped、1 xfailed;前端 397 passed;构建、Ruff、diff-check 通过,并完成隔离联调及窄屏、深色模式检查。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-31 18:24:23 +08:00 |
|
shy3130
|
c63ee7648c
|
refactor(resources): 清理导入导出残留并合并包处理逻辑
移除无调用的前端策略包接口封装和类型,将依赖收集、ZIP 打包与安全检查、资源预检统一到 resource_bundle,strategy_bundle 仅保留兼容入口。
保留旧包和旧接口的逐文件导入语义,以及当前资源导入的整批预检和回滚;补充新旧导出格式互通、本机依赖解析、逐文件失败报告和 ZIP 安全回归测试。
验证:相关后端回归 106 项、后端完整测试 3726 项、前端测试 389 项通过;前端构建、Ruff 与 git diff --check 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 22:29:44 +08:00 |
|
shy3130
|
c54efda2e1
|
chore(release): 发布 v0.3.24 并同步前后端版本
- 前端 package.json、后端 pyproject/锁文件、VERSION 与运行时回退版本统一为 0.3.24
- 本版包含资源传输与策略池优化、日K自检精准修补、Codex 助手工具调用
- 同时包含桌面启动、Fuyao 缓存、回测成交与缓存一致性、龙虎榜空代码及旧挖掘锁修复
验证:版本/桌面启动/打包/升级保护 33 项测试通过;前端构建、uv 冻结锁文件与版本一致性校验通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 21:31:44 +08:00 |
|
shy3130
|
3f8c0b169e
|
feat(assistant): 支持 Codex CLI 工具调用与超时提示
- 使用结构化输出适配现有助手工具循环,保留完整工具调用历史
- 严格验证工具名和参数,沿用现有动作确认和错误终态
- 旧 CLI 不支持结构化输出时给出升级提示
- 单独展示 Codex 生成超时,记录耗时与重试信号并避免输出提示词内容
补充结构化响应、工具循环、确认流程、非法输出及超时分类回归测试。
前端全量 389 项及构建通过,后端执行完整回归。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 20:42:57 +08:00 |
|
shy3130
|
8fb23fcf09
|
feat(data): 新增日K自检、精准修补及数据版本管理
- 数据页提供股票、ETF、指数历史日K自检与报告,区分已确认异常和待核实缺口
- 按异常股票和日期暂存校验、备份并修补,使用完整原始历史重算受影响指标
- 跨重启保留异常与待重算状态,失败或取消后可继续处理
- 修补完成后更新行情、指标、矩阵、策略和前端查询缓存,重算市场环境与主线
- 对已知异常阻止相关计算,提示历史回测和优化结果的数据版本过期
- 复用插件日K取数,修正 ETF 历史回补起点及任务阶段进度重置
补充自检 API、精准修补、失败恢复、资产隔离、缓存失效及前端交互测试。
前端全量 389 项及构建通过,后端执行完整回归。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 20:42:48 +08:00 |
|
shy3130
|
ea24378033
|
feat(resources): 完善资源传输兼容性与策略池交互
- 策略、因子与信号页各使用一个小盒子入口,在当前页面预览并导入导出
- 支持多选 ZIP 批量导出,自动携带因子、信号、调参与策略辅助代码
- 保留单文件导入并兼容无清单 ZIP、外层分享目录及 macOS 附加文件
- 预检依赖与同 ID 冲突,按选择计算依赖闭包,写入失败整批回滚
- 修正矩阵原生策略生成信号被误判为外部依赖的问题
- 重排策略池布局,支持搜索、来源/周期筛选、排序和撤销清空
- 单策略导出入口收纳到配置对话框顶部,支持旧排名策略导入路径
验证:资源传输/策略包/配置备份 95 项后端测试通过;前端全量 389 项及构建通过。
两个真实 25 策略 ZIP 已在隔离目录验证识别、导入、加载和再次导出。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 20:42:27 +08:00 |
|
shy3130
|
2d629197c1
|
fix(backtest,services,frontend): 回测成交口径/任务注册表并发/查询键一批正确性修复
回测成交口径:
- close_t 按收盘价成交的建仓日: 当日 high 发生在建仓之前, 不得进入移动止损
峰值 (峰值虚高会把风控线上移、退出提前) — 矩阵独立/矩阵组合/legacy 三条
路径同口径; 新增回归测试锁定 open_t+1 对照组不被误伤
- 矩阵路径补收盘封死跌停拦截 (含一字), 经 pending_exit 递延到下一可卖日,
与独立/legacy 路径同口径 (此前尾盘封板股按跌停价"卖出"低估亏损)
- #388 当日指标纪律同口径: 盘中成交不可知当日收盘, 代数剔除当日 enriched
- 分钟回放: 入场价用前复权口径 (与日线出场同尺度); 除权日涨停参考价按
ex_factor 还原 (直接用 raw_prev 会把涨停价算高, 除权日封板拒买漏检)
- 指标管线: 涨停参考价除权口径修正 + 夏普用样本标准差 (ddof=1, 与 engine 一致)
- 回测任务: _acquire_or_evict_job 收口同 key 复用/强制重建 (参数不同先取消
旧任务, 避免旧任务占着重任务槽跑完)
服务与并发:
- task_registry 读-改-写加锁: 两个前端 fire-and-forget 并发上报时后写者
覆盖先写者 (丢终态翻转或整条记录); 文件写入本身原子, 锁只护 RMW 段
- quote_service 生命周期锁串行化 start/stop/enable 的 check-then-act (双标签页
并发开关会起两条轮询线程 → 双倍拉取配额 + 重复 SSE 广播)
- 系统通知投递移入专用单线程池: notify_adapter 底层 subprocess 逐条最长 5s,
在 _poll_loop 同步执行会让告警风暴阻塞一轮监控评估, 拖慢行情拉取与推送
- sector_monitor / minute_refresh / wecom_bot: 同类单实例与停止时序加固
- ai_provider: 401 识别加词边界 (避免模型正文含 401 数字串误判鉴权失败并
附出不相关指引); 自定义可执行路径校验可执行位
- api/data: 清空数据期间暂停全量分钟增量线程 (否则"清完又被写回部分今日
数据"); 状态接口偏好/能力探测异常降级而不是 500
- api/kline: 失效内存 enriched 快照 (非空缓存不校验 generation, 只刷 DuckDB
视图会让重建结果对自选/筛选/监控不可见直到进程重启)
- api/position_policies: 非法 ID 纵深防御按不存在处理
前端:
- assistant store: 生成终态 (中断提示/流式收敛) 钉在发起会话, 切换或删除会话
不再把"已中断"写进无关新会话
- backtestTask: 键上挂着旧任务且新参数不同 (不同 job_key) 时先取消旧任务,
避免其占着重任务槽跑到自然结束; 同参重跑跳过取消 (后端按同 key 复用 /
force 重建已完成任务)
- 查询键集中与正确性: QK.instrumentNames (排序去重, 同一集合不同来源顺序
复用缓存)、QK.kline 滚动窗口空串边界 (useQuoteStream 焦点股增量合并可
修补)、regimeHistory 用实际请求三元组 + 裸前缀失效全部变体
- Data 页 / Regime / SectorRotationCard / RuleEditor / monitor / lots /
stock-analysis 接入集中键, useQuoteStream 对齐
验证: 后端全量 3546 passed (含 close_t 峰值/分钟回测/跌停递延/并发上报等
新增用例); 前端 49 文件 348 用例 + pnpm build 通过; ruff 改动文件零新增
(141 vs 基线 142)。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-30 00:20:52 +08:00 |
|
shy3130
|
e2c84dbeca
|
fix(dragon-tiger): thscode 为 null 的退市/B股标的归一化, 修复龙虎榜崩溃
用户反馈: 展开复盘页龙虎榜 (2026-10-29 榜单 72 条) 前端崩溃。
根因: fuyao 对退市整理期股/B股返回 thscode=null (ticker 有值) — 今天
首次上榜的萃华退(002731)/宁通信B(200468)/动力B股(900920) 3 条 null
thscode 被后端原样透传, 违反前端 DragonTigerStockItem.thscode: string
契约 (下游按 string 使用, 收到 null 即崩)。
- dragon_tiger 服务新增归一化 (新拉取 + 历史缓存读回共用):
thscode 缺失时由 ticker 推导市场后缀 (6xx/900→SH, 0xx/3xx/200→SZ,
4xx/8xx→BJ), 两者都不可用则丢弃并告警; 游资席位嵌套 rows 同样处理
- 前端: 类型放宽为 string | null (如实反映数据源现实), 榜单卡片统一走
_dtCode/_dtLabel 兜底 (旧缓存/异常数据源也不再崩), 无代码行不触发
onOpenStock
- 实测真实数据: 72 条归一后 0 条 null; 三条退市/B股 →
002731.SZ / 200468.SZ / 900920.SH; 席位嵌套 rows 同样干净
验证: 后端新增 6 条归一化用例 (ticker 推导/不可识别丢弃/嵌套 rows/
缓存读回/端到端); 前端新增龙虎榜卡片回归 2 条 (展开 72 条不崩 + 点击
null 行以 ticker 兜底回调); 后端全量 3546 passed; 前端 49 文件 348
用例 + build 通过; ruff 零新增。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 22:35:30 +08:00 |
|
shy3130
|
b8f1ebaaf0
|
fix(mining): 旧格式锁也能定位持有者并强制释放, 不再永久卡挖掘
用户反馈: 挖掘工作台一直提示「挖掘锁被其他进程占用 — 锁文件为旧格式,
无法定位持有进程」(v0.3.17+ fail-closed 设计)。根因: 锁内容是 v0.2 时代
写入的 b"0" (无 pid), 持有者为升级前启动、仍在运行的旧版后端残留进程;
flock 是 OS 级锁, 进程存活即一直占用, 旧版本无法被识别 → 强制释放按钮
永不出现, 用户只能去任务管理器逐个猜进程。
- mining_process_lock: 新增 locate_lock_holder_pid — 锁内容不可读时用
lsof (POSIX) / psutil (跨平台兜底) 反查打开锁文件的进程; 只认本产品
形态 (python/uvicorn/desktop/tickflow), 且连续两次扫描命中才采信,
避免误杀瞬时探测或无关进程 (误杀是破坏性操作, 宁可定位失败)
- mining_lock_admin.lock_status: 旧格式锁 → OS 反查持有者, 继续走既有
fail-closed 判定 (无进行中挖掘 + 存储静默 >=600s 才允许释放);
状态新增 holder_source 字段
- 前端横幅: 展示「已通过系统扫描定位」并出现既有「强制停止并接管」按钮;
定位失败时保留手动指引
- 设计纪律不变: 仍只提供人工确认的强制释放, 不做启动自动 kill
验证: 新增 4 条用例 (旧格式持锁进程定位 / 强制释放完整接管 / 挖掘活跃时
仍拒绝 fail-closed / 锁空闲不误报); 撤销集成时 3 条红, 恢复后绿;
后端全量 3540 passed; 前端 build + tsc 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 21:21:13 +08:00 |
|
shy3130
|
02712af01b
|
chore(release): v0.3.23 版本号同步
- 修复 #514 漏接 failed_out 参数导致「数据修正/自检修复」路径同步必炸 (b590e5ad)
- 迁移 skip 分支补捞 preferences.json, 防升级后引导重弹 (5ff6e159)
- 数据源偏好回退 tickflow 留痕告警 (3c0ad017)
- 回测页 busy 期统计为 null 不再误判缺数据 (9659237a)
- 数据页 busy 降级 storage=null 崩溃修复 (da4ed647)
- 模拟盘台账补品种名称 (f3ff1d5e); 回测强制重跑按钮 (939149e8)
- 消除 "获取数据" 误弹 (dd589733/e975f782 已随 0.3.21)
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 18:52:20 +08:00 |
|
shy3130
|
3d89e8a126
|
test: 宿主状态隔离补齐 + Codex env_key 正向覆盖 + node:test 转 vitest
- test_assistant_actions: auto_approve_enabled 直读宿主 preferences.json,
本机开「动作免确认」时 4 条门控用例全红 (审批拒绝后动作仍执行 ==
测试环境失真, 非产品 bug); _run_chat 统一 patch 免确认关闭
- test_ai_provider: secrets 排除断言隔离宿主 ~/.codex/config.toml
(宿主配 env_key provider 时随机翻红); 补 env_key 正向注入与非法名
拒绝 2 条用例
- neighborPrefetch / DimensionMembersDialog 测试由 node:test 转 vitest
(文件名 *.test.ts 本就在 vitest 收集范围, 此前每次 vitest run 恒报
2 个收集失败掩盖真失败); 转换后 5 条用例全过
前端 vitest 48 文件 346 用例全绿; 后端全量 3536 passed。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 18:39:40 +08:00 |
|
shy3130
|
9659237a15
|
fix(backtest): 预热/同步期间统计为 null 不再误判缺数据禁用回测
backtestDataUnavailable 原判定 dataStatus.isSuccess && !earliestDate 在
busy 降级期间 (预热 indicators_ready=false / 同步修复 stats_pending=true,
enriched 统计为 null 是未知态) 恒为 true — 回测按钮被禁 + 常驻"缺少指标
数据, 请先同步"横幅, 与 Dashboard 已修的 warmup 误判同族 (stats_pending
契约: 空值不代表无数据)。补 statsPending 放行分支, 真实统计就绪且确无
数据时行为不变。
验证: StrategyBacktest.status.test 2 条 (busy 期无横幅 + 渲染无 TypeError;
就绪确无数据仍提示并禁用 — 修复前红/修复后绿); 全量 vitest 340 passed;
pnpm build 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 13:17:39 +08:00 |
|
shy3130
|
da4ed64707
|
fix(data): busy 降级期间 storage 为 null 不再使数据页整页崩溃
用户反馈桌面客户端数据页 "Unexpected Application Error! Cannot read
properties of null (reading 'total_size_mb')"。根因: /api/data/status 在
预热/同步/修复期间 (busy) 不重算存储统计, 冷启动缓存从未热过时
_get_storage 返回 None — 前端存储卡片 s.storage.total_size_mb 只判了 s
没判 s.storage, 6 处访问全部抛 TypeError, 整页被错误边界接管。与此前
"立即获取数据"误判同族 (busy 降级契约: 空值不代表无数据)。
- DataStatus.storage 类型改为 {...} | null 诚实反映降级契约, 编译期
强制所有消费点判空
- 数据页取安全别名 const storage = s?.storage, 总大小与表统计/扩展数据
全部 storage?. 判空, 缺值降级显示 — 或 0
- 后端补契约测试: 冷启动 busy 且缓存未热时 _get_storage 返回 None
(原测试只覆盖缓存热过后清空仍留 stale 的路径)
验证: Data.status.test 修复前红 (错误与用户截图逐字一致) 修复后绿;
后端 test_data_status_busy 10 passed; 全量 vitest 338 passed; pnpm build。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 13:09:56 +08:00 |
|
shy3130
|
939149e8a0
|
feat(backtest): 强制重跑 — force 绕过同参数任务结果缓存; 修 cancel key 对齐
策略回测按全参数 md5 作 job_key, 已完成任务结果保留 5 分钟 — 同参数再次
运行直接命中缓存返回旧结果 (重连/切页恢复设计的副产物), 用户改完数据后
重跑拿到的仍是旧行为产物, 此前没有绕过手段。
- startBacktest/strategy_stream 新增 force: 掺入 job_key 使其不命中缓存
必然重算; 不动任务复用/并发语义, 重连与取消按同一 qs 重算 key 天然对齐
- 运行回测旁新增「强制重跑」按钮 (RefreshCw, 次要样式, 悬停说明语义),
disabled 条件与主按钮一致
- 补算环境并继续改为 handleRun(true): 已失败任务的 error 同样被任务缓存
保留, 补算成功后自动重跑不带 force 会命中同参数旧 job 直接重放补算前的
报错 — 用户实测补算完成后仍提示"缺少前一交易日环境 2019-10-22 等 112 天"
即此因 (实测数据已补齐: 2019-10-22~2026-10-29 共 1703 行无缺口)
- 修预存 bug: /strategy/cancel 重算 job_key 漏了 minute_fill 与
regime_filter — 开了分钟K精确回测或市场环境过滤的任务停止按钮失效
验证: test_backtest_stream_force 3 passed (force 改 key 且幂等; cancel 带
force/minute_fill/regime_filter 的 qs 能取消到、缺参取消不到 — 走真实
qs→key 解析路径不启动回测线程); ruff 与 HEAD 对照零新增; pnpm build 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 13:09:50 +08:00 |
|
shy3130
|
f3ff1d5e1b
|
feat(paper): 模拟盘订单/成交台账就地显示标的名称
用户反馈订单和成交台账只有代码没有名称。复用账户面板既有的
instrumentNames 批量名称查询 (#454 同模式), 名称查询集合在持仓+回合
基础上并入订单与成交的标的 (已清仓标的的名称也能查到), 持仓/回合的
「代码+灰色小字名称」展示模式对齐到两处行内; 名称缺失时不渲染不留空洞。
变量 holdingSymbols 更名 nameSymbols 以符合扩充后的语义。
验证: pnpm build 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 13:09:43 +08:00 |
|
shy3130
|
9cd8792c9e
|
chore(release): v0.3.22 版本号同步
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 11:10:34 +08:00 |
|
shy3130
|
d7a5edd730
|
fix(signals): 数字右值条件不再整页崩溃 — 修复"扩展 official.signals 暂时不可用"
用户反馈信号库/模拟盘页显示"扩展 official.signals 暂时不可用" — 错误边界
兜底, 真实错误是渲染期 TypeError。根因: 残月策略的两个迁移信号
(canyue_long_enter/exit) 条件右值为 number (0.6/0.2, 迁移时 Python float
直接进 JSON), 后端 isinstance(int,float) 一直合法, 但前端两处
right.startsWith('field:') 假设恒为字符串, 数字右值直接抛
"startsWith is not a function", 整页渲染崩。崩点代码 v0.3.6 即有,
系数据侧新出现数字右值触发, 非本版回归。
修复: 信号库列表渲染与条件编辑器 (ConditionEditor, 多处共享) 均加
typeof 守卫, 数字常量正常显示与回填; CustomSignalCondition.right 类型
放宽为 string | number 诚实反映运行时, 编译期逼出并修复编辑器一处
隐藏收窄问题。
验证: Signals.numeric-right.test.tsx 2 条回归 (真实数据形态 + 错误边界
断言, 修复前 2 failed 复现线上错误 → 修复后 passed); 全量 vitest
337 passed; pnpm build 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 11:09:06 +08:00 |
|
shy3130
|
e6fc60078f
|
chore(release): v0.3.21 版本号同步
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 10:39:58 +08:00 |
|
shy3130
|
2c0141f3eb
|
fix(ai): 修复 Codex 连接测试与自定义源鉴权
使用草稿模型执行连接探测,并向自定义 provider 传递其声明的鉴权环境变量。认证续期仍需单独处理。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 10:38:03 +08:00 |
|
shy3130
|
1c57c54bad
|
fix(ui): 切换 fuyao 后刷新实时行情权限
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 10:25:40 +08:00 |
|
shy3130
|
e975f78240
|
fix(ui): 同步和修复期间不再误判无数据
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 10:25:29 +08:00 |
|
shy3130
|
dd589733ec
|
fix(ui): 看板预热期不再误弹"立即获取数据"引导
v0.3.20 回归: /api/data/status 忙时降级 (977248ce) 在启动指标预热期
(indicators_ready=false, 低配机 50s+) 且 stale 缓存为空时, daily/enriched
返回 null; 看板 hasNoData 判定把 null 当 trading_days=0, 导致升级后有
数据的老用户打开客户端即被误弹"当前暂无数据/立即获取数据"卡片与欢迎
弹窗, 且 staleTime 60s 无轮询, 预热完成后提示也不会自动消失。
修复: 判定提取为 resolveHasNoData — 预热中视为"未知"而非"无数据";
预热期间每 5s 轮询 /status, 预热完成 busy 解除后自动恢复正常判定并停
轮询。老后端无 indicators_ready 字段时行为不变; 新用户引导不受影响。
验证: Dashboard.test.tsx 7 条回归 (修复前 7 failed → 修复后 passed,
覆盖预热 null/预热完成/无字段兼容/部分数据); pnpm build 通过; 全量
vitest 328 passed; 后端契约 test_data_status_busy.py 7 passed。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-29 09:49:20 +08:00 |
|
shy3130
|
a17742c97d
|
chore(release): v0.3.20 版本号同步 (package.json 单源派生)
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-28 13:40:30 +08:00 |
|
shy3130
|
c9f4b0e351
|
fix(ui): 深色主题滚动条发白 — color-scheme 声明
声明标准 scrollbar-color 会让 WebKit 忽略 ::-webkit-scrollbar 伪样式回退
浅色默认 (WKWebView 实测), 现有伪元素方案在 Safari/WebKit 上失效。
:root/html.dark 显式声明 color-scheme: light/dark, Chromium/Firefox/WebKit
三引擎一致取深色滚动条。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-28 12:47:12 +08:00 |
|
shy3130
|
9edaac28b8
|
fix(ui): 轮动走势图线端名称 ≤10 全显, 高密模式封顶 Top10
旧防叠规则 >8 条只显最新值前 6 名, 默认「前10」下有 4 条线常年无名。改为
≤10 条全部常显 (默认行数所见即所名); 15/20 行高密模式按最新值封顶 Top10,
其余靠悬停聚焦与图例 (endLabel 无引导线, 汇聚区推离会与线端脱钩, 不宜全显)。
验证: SectorRotationCard.test 9 条全显/前20 封顶 Top10 断言; 前端 321 测试全绿。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-28 12:47:12 +08:00 |
|
shy3130
|
313be43de4
|
feat(ui): 行业分析/概念分析更名行业板块/概念板块, 财务分析→财务概况
菜单/页面标题/引导文案统一更名; 轮动图默认图表源未设置 (或旧默认值) 时回退
强弱切换而非综合分, 显式选择过的用户不受影响; 文档截图替换为新版概念板块
页面 (旧截图为过期版本)。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-28 12:46:59 +08:00 |
|
shy3130
|
b6c35a9b64
|
feat(ext-data): 扩展序列粒度 auto/intraday/daily — 日级近N日序列
扩展表此前只有日内多盘一种时序形态; 无时间列的每日快照表 (板块成员/评分等)
无法画趋势。新增序列粒度:
- PullConfig.granularity 三态 (auto/intraday/daily, 默认 auto): auto 按时间列
值形态判定 — 含非零 HH:MM:SS 判 intraday, 日期形态/00:00:00/无 time_field
判 daily; 显式声明优先于判定。schema/list 透出 granularity_effective。
- series 端点日级分支: 无需 time_field, 取近 N 日分区按日聚合 (末次非空),
支持标的过滤与 chartDays; 日内分支响应带 granularity 标识。
- 前端拉取配置加「序列粒度」选择 (auto 显示判定结果), 列自定义器按 effective
粒度分流: 日内保持现状, 日级提供近N日柱/线/文本与图宽高配置。
- ExtSparkChart 修全等值退化: min===max 时归一化柱形无意义 (全负值画满格、
全正值画 1px 线), 改回退文本直显。
auto 默认与旧行为完全一致 (向后兼容); 无 time_field 不再 400 而按日级处理。
验证: test_ext_granularity 16 条 + 快照/时间列契约适配; 前端 build + 321 测试。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-28 12:46:51 +08:00 |
|
shy3130
|
81611cefac
|
feat(ui): 轮动图四项改版 — 全天时间轴/并排布局/图例换行/配色统一 (#518)
- 盘中时间轴铺全天 09:30–15:00 (桶起点逐格对齐: 上午止于 11:25、下午含 15:00, 并集兜底), 数据止于当前桶右侧留白, 一眼看进度; 1 分钟桶最近 60 列滑动窗口不铺; 两图指针联动轴窗口一致; showMaxLabel 保证 15:00 末刻度可见
- 宽屏改左右并排: 走势图 aspect 9:5 随列宽 (此前全宽 4.4:1 压扁), 右列=切换图+榜单; 右列内层 xl 下绝对定位脱离行高计算, 榜单列内滚动两列底齐; 窄屏退回堆叠
- 图例 scroll→plain + width 94% 自动换行, 不再「◀1/2▶」翻页
- 配色: 调色板去掉两组近绿/三组琥珀/蓝青近似对; colorForSector 按板块名稳定分配并缓存 — 走势线/易主圆点/切换图标注/榜单圆点四点同源, 切排序不漂; 切换图易主标注走 markPoint (强 8px/弱 5px), 函数式 formatter (字符串会让 markPoint 不渲染)
- 开局领涨也算事件点 (原从 index 1 起算, 开盘即领涨的板块整段无标记); 标签像素级 AABB 碰撞避让 (密集簇隐藏后到标签只留圆点, 最强大点优先占位); 圆点底色描边贴线可辨; 榜单未进矩阵板块给灰色占位点
- 测试 13/13 (6 新增: 刻度边界/并集/稳定配色/铺轴 null 对齐/markPoint 语义/开局事件)
|
2026-10-27 22:54:49 +08:00 |
|
shy3130
|
dc9badc2ff
|
fix(ui): AI 助手悬浮球开关跨端口持久化 — 不再「关了过一会又开」
- 根因: 开关只存 localStorage 且默认开启; 桌面版 _find_free_port 换端口即换 origin, 旧值读不到 → 闪回默认开 (uiPrefs 基建正是为此而生, 该键此前漏接)
- assistant.fab.enabled 入 uiPrefs SPECS + 后端 _UI_PREFS_KEYS 白名单 (assistant_fab_enabled), setFabVisible 走 setUiPref 本地+后端双写
- hydrateUiPrefs 改共享 Promise 的幂等实现: main.tsx 与后进的 assistant store 无论先后, await 到的都是同一次回填; 回填完成后刷新 store 内存态
- 依赖方向保持 扩展→核心, 核心零依赖扩展; 新增白名单回归测试锁住该键
|
2026-10-27 21:07:29 +08:00 |
|
shy3130
|
568a0d69ef
|
chore(release): v0.3.19 版本号同步 (package.json 单源派生)
|
2026-10-27 18:45:27 +08:00 |
|
shy3130
|
e71ca39b25
|
feat(bundle): 策略包导出/导入 — 依赖闭包一键迁移
- 导出: 策略设置「导出策略包」(.zip), 按依赖闭包打包策略源码 + 引用的自定义信号/因子定义 + 用户调参; 叠加策略递归展开子策略与 overrides
- StrategyDef 增 scoring_columns, meta.scoring / module SCORING 引用列进入闭包
- 导入: 策略池「导入策略」同时接受 .py 与 .zip; 条目路径与配置备份白名单形态一致, 复用 apply_archive 安全校验/导入即冒烟/热重载; 包外路径 400 拒绝; 缺失依赖预览黄色预警
- API: GET /api/strategies/{id}/bundle, POST /api/strategies/bundle/inspect|apply
- engine.py 同时携带 #517 的 expected_generation 读 attempts 1→2 (服务级重试见后续 fix 提交)
|
2026-10-27 18:44:51 +08:00 |
|
shy3130
|
a402b93fc8
|
feat(position): 仓位策略 — 用户自定义资金分配规则
- 新增 PositionSizingPolicy: data/user_data/position_policies/*.py, 设置→定义→仓位策略 创建 (表单 META + 只写一个 compute(ctx), 模板起步)
- ctx 只含当日及以前信息 (候选评分/近60日收益/已平仓快照/组合状态/参数), 输出 weights + budget_scale; 引擎侧单仓上限/现金/敞口钳制不变
- 保存/备份导入过 AST 安全校验 → 结构解析 → 合成冒烟 三关; 回测「买入权重→自定义策略」选用, 引用失效 400, 运行期异常当日回退等权并计入统计
- 配置备份白名单新增 position_policies 分类; 回测候选 config 字段同步
|
2026-10-27 18:44:47 +08:00 |
|
shy3130
|
b08a267a87
|
chore(release): v0.3.18 版本号对齐 release 流水线
|
2026-10-26 22:22:36 +08:00 |
|
shy3130
|
5909155fb1
|
feat(ext): 盘中多盘表增量续传 — pull.since_param 游标免全量重拉
拉取前读本地目标日分区 time_field 列最大值, 以 ?{since_param}={值} 附到
请求, 源只返回新于本地的盘次; 缺口感知天然成立 (本地缺多少源补多少)。
未配置/首拉/分区缺失/schema 漂移/文件损坏一律不带参数回退整日全量,
回退方向永远安全; 历史回补与 fanout 两级拉取不注入游标。
- PullConfig 归一: 未配置 time_field 时 since_param 失效
- 分页拉取每页携带 since 过滤器
- API since_param 参数名合法性校验
- 前端拉取面板/统计卡片与 features.md 同步
|
2026-10-26 22:10:39 +08:00 |
|
shy3130
|
5d06af60b2
|
feat(definitions): 统一定义选择器前端 + 冒烟 API 按 id 复检 + 备份导入冒烟展示
- POST /api/definitions/smoke 支持 id 直查已存定义 (smoke_stored),
统一选择器逐条冒烟无需回传原始定义; 不存在 fail-closed 404
- DefinitionPicker 可复用组件: 跨 kind 目录 (21 内置信号实测) +
kind 筛选/搜索/依赖 chips/预热/坏定义隔离展示 + 逐条冒烟
- 设置页新增「定义目录」页签; Backup 导入结果新增「导入冒烟」小节
(apply 响应 smoke 逐条渲染, 失败条目带 issue 编码)
- 验收: pnpm build 过; 浏览器 E2E 导出→覆盖导入 275 项→
冒烟 21/21 通过零 issue; 后端 36 契约测试过
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-26 15:54:03 +08:00 |
|
shy3130
|
2892c644f1
|
feat(backup): 配置备份与迁移 — 18 类别 ZIP 导出导入, 彻底解决多设备配置丢失
- 后端 config_backup service + /api/config-backup 三端点: 按类别导出/预览/导入
- 覆盖策略/监控/信号/因子/偏好/自选/持仓/模拟盘/挖掘候选/数据源/菜单/扩展页面/扩展数据集/语音包/历史记录
- 密钥与访问凭证默认脱敏不导出, 显式勾选才打包; 偏好/密钥 merge 写入
- ZIP 白名单路径 + 防炸弹 + 策略 AST 安全校验, 冲突默认跳过可选覆盖
- 监控徽标/导航形态/回测列表高度/设置页收起接入 uiPrefs 跨端同步
- 设置页新增「配置备份」标签页, 导出/导入向导式 UI; 16 个专项测试
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-26 12:13:19 +08:00 |
|
shy3130
|
b1a4dc6e38
|
chore: v0.3.17
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-26 09:59:09 +08:00 |
|
shy3130
|
b573ca43eb
|
feat(mining): 挖掘锁撞锁降级启动 + 持有者诊断 + 一键强制释放
复现的原始问题: 旧实例挂死在 shutdown (热重载撞上挖掘运行) 或 worker
成为孤儿后, `.mining_process.lock` 被无限期占用, 后续所有后端实例
在 lifespan 抢锁时直接启动失败, 用户只能对着笼统报错手动找进程。
- 锁文件记录持有者 {pid, started_at, role, host} (flock 仍是唯一
事实, 内容只是诊断线索; 旧格式 "0" 兼容, 视为持有者未知);
新增非阻塞探测, 无需抢锁即可判断是否被持有。
- 撞锁降级启动: lifespan 抢锁失败不再上抛, 面板照常可用; 挖掘
启动入口 (手动/自动/周度调度) 返回 409 并指引到挖掘页; 桌面版
预检从「秒退失败页」改为留日志继续启动; 守护复验不受影响。
- 挖掘页锁占用横幅: 显示持有者 pid/角色/挖掘存储静默时长; 满足
陈旧判定时可一键「强制停止并接管」(SIGTERM→SIGKILL→当前后端
获取锁, 挖掘入口立即恢复)。
- 陈旧判定全部 fail-closed: 持有者信息可读、进程存活且 pid 未被
复用 (POSIX 比对进程实际启动时间)、无进行中的挖掘运行、挖掘
存储 10 分钟内无写入 — 任一不满足即拒绝并给出原因。不做启动
时自动清理, 终止进程必须人工确认。
测试: 新增 test_mining_lock_admin (含真实外部持锁进程的强停回路与
五类拒绝路径), 重写 lifespan 降级契约与桌面预检继续启动契约;
后端全量 3239 通过, 前端 308 通过, ruff 零新增; 沙盒 E2E 完整
复刻「持锁→降级→强停→接管→恢复」事故场景通过。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-26 00:01:20 +08:00 |
|
shy3130
|
e01fe96241
|
chore: v0.3.16
本次发布包含自动策略实验室 (feat(lab): 守护复验 + 稳健选冠/权重
精调 + 组合建议 + 闭环编排), 让挖掘发布的策略在真实新数据上被
持续验证 (健康/观察/退役), 冠军按稳健分选出并做权重精调, 健康
冠军间低相关可一键生成组合策略, 实验室战报聚合守护/挖掘/名额。
版本号同源: VERSION / frontend/package.json / backend/pyproject.toml /
backend/app/__init__.py 的 _FALLBACK_VERSION / release.yml 的 inputs
默认值; uv.lock 仅改项目自身条目。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 23:43:45 +08:00 |
|
shy3130
|
21279ecfa2
|
feat(lab): 自动策略实验室 — 守护复验 + 稳健选冠/权重精调 + 组合建议 + 闭环编排
在既有挖掘链路之上补齐「发布后持续验证与持续组合」闭环
(设计: docs/auto-strategy-lab-plan.md):
- P1 策略守护: 挖掘发布自动落 mining_gate 基线 (天然 OOS); 每日收盘
数据更新后在新数据上切 K 段真实回测复验, 按稳健分对比基线判定
健康/观察/退役三态 (段回测失败只降级观察不退役; 新数据 <30 交易日
跳过本轮; retired 不再自动复验)。任意策略可手动入护 (尾随参考基线,
判定只针对入护后新数据)。回测页稳健性验证新增「策略守护」子页。
- P2a 稳健选冠: 冠军排序分从外层折 Sharpe 均值改为 0.6×中位+0.4×最差
(复用 robust_score); artifact 新增可选列 oos_worst_sharpe (v2 旧档
兼容读取); strict 档发布额外要求最差折 Sharpe>0; 算法版本升
mining-v3 并进数据指纹, 防止升级后 claim 幂等复用旧口径结果。
- P2b 权重精调: 冠军组合在 {0.5,1.0,1.5,2.0} 比率网格 (首因子固定
1.0, 截面分位打分天然尺度不变) 两段式精调 — 外层测试窗选优 + 全窗
复验退化>20% 放弃; 消耗 run 剩余预算 (不足自动跳过); 产物为独立
签名候选行, run summary 带 refinement 摘要。
- P2d 组合建议: 守护运行时扫描健康冠军间近 126 个交易日日收益 Pearson
相关性 (≥30 共同交易日, ≤0.7 入选); 前端人工确认后生成等权
composite 策略 (fail-closed 建议对校验 + blake2b 幂等) 并自动以
尾随参考基线入护。
- P3 闭环编排: lab_mined_slot_limit 偏好 (默认 10, 0=不限) 在发布
门槛通过后校验, 名额满则新冠军停在 pending 等位;
/api/backtest/lab/report 聚合守护/挖掘/名额战报 (前端总览卡);
lab_schedule 单入口编排周度挖掘 + 日度守护 (失败互不阻断)。
测试: 新增 guardian 判定/运行时/存储/调度/API/组合与挖掘 v3 选冠/
精调用例; 后端全量 3224 通过, 前端 308 通过; 真实数据沙盒 E2E
(挖掘 v3 全链路 / 发布门槛 / 名额边界 / 复验语义 / 组合扫描 /
战报核对 / 性能延迟) 通过。P2c (overlay 候选) 按设计稿按需启动,
默认不做。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 23:43:34 +08:00 |
|
shy3130
|
797f0c5f70
|
chore(frontend): 清理 klineBatchLimits 测试未用导入
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 20:14:17 +08:00 |
|
shy3130
|
5e2c1f76eb
|
feat(frontend): 回测页策略选择区支持拖拽调高
策略列表底部新增拖拽手柄 (指针捕获, 80-480px, 键盘上下方向键微调),
高度记忆到 localStorage, 刷新自动恢复。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 20:14:17 +08:00 |
|
shy3130
|
df9d178060
|
feat(assistant): 中断提示可点击重试 + 历史会话显示时间
- 生成中断后的"已中断, 可点击重试"提示此前是纯文本, 现在是可点击按钮,
点击即携带原上下文重发
- 历史会话列表每项增加时间行 (今天/昨天 HH:MM, 更早 MM-DD / YYYY-MM-DD)
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 20:14:17 +08:00 |
|
shy3130
|
fff52f93cc
|
feat(settings): 自定义提示音语音包上传
设置页可上传/试听/删除自定义提示音 (mp3/wav/ogg 等 8 类, ≤4MB),
存储 data/sound_packs/, 键名 custom:<文件名> 复用现有 alert_sound
偏好通道, 零新配置项; 删除当前正在用的语音包时自动回退默认提示音。
后端 6 项测试 + 前端 3 项测试。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 20:14:17 +08:00 |
|
shy3130
|
da9dbca422
|
feat(backtest): 稳健参数筛选与滚动样本外检验重构 (P1-P4)
参数排名从单窗样本内得分改为 K 段折外稳健分 R = 0.6×中位 + 0.4×最差
(设计: docs/robust-optimizer-plan.md), 四阶段全部落地:
- guards 共享护栏: 主目标白名单 + 最小交易数门槛 (fail-closed, 缺交易数
按不达标处理), 两模式一处实现
- robust_optimizer: 等分切窗 (2-6 段, 每段≥14天) / 稳健分 / 冠军收敛诊断
(unanimous/majority/scattered) / Top-20 全窗 IS 细化与退化率 /
高原判据 (邻域得分衰减, 零额外回测); worker 接线 robust_optimize 任务
- 滚动样本外检验补强: 每折 OOS 最小交易数门槛 (无效折透明跳过),
前端折预览 / 参数漂移轨迹 / 采用最新折参数
- 前端: 冠军卡 (收敛/高原徽章/乐观偏差) + K 段排名表 + 验证窗预览 +
应用参数闭环 (POST /strategies/config, 可逆); SSE 重连与跨设备接回
- P4 摒弃旧路径: 删 /optimize/stream 与 /optimize/cancel 端点及 worker
optimize 任务类型; 白名单全面生效 (optimizer.VALID_OBJECTIVES 收敛到
guards; walkforward 端点校验退化目标 400)
- 附带修复: 叠加条件×矩阵路径 SignalMatrix 只读违规 (np.where 产物
可写), optimizer_trial 轻量统计恒保留 n_trades
实测: 126 组合全市场网格 1.71× 旧版耗时 (视图复用优化自 2.01×; 差额
为引擎层每 run 固定开销, 详见方案文档第九节); 全量回归 3131 通过。
api.ts 同时带入稳健优化折预览客户端与声效语音包 API 客户端
(语音包功能随后续提交落地界面)。
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 20:14:10 +08:00 |
|
shy3130
|
7f6cad0f8f
|
feat(factors): 因子生命周期状态下发 + 发现页三视图重构 (批量/单因子/挖掘)
- 因子注册表按 id 合并下发完整生命周期 status (draft/active/watch/retired),
registry 的 stability 降为其二元投影; asset_type 过滤适用资产
- FactorDiscovery 重构为 批量/单因子/挖掘 三视图 (MiningWorkbench),
标的列表解析兼容中英文逗号/分号/顿号/空白分隔
- FactorLibrary/FactorEditor/回测页配套调整
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 17:31:16 +08:00 |
|
shy3130
|
6c8805204e
|
feat(assistant): 动作免确认开关 + create_strategy 工具 + 毛玻璃遮罩
- 动作工具免确认开关 (助手界面, 默认关): 只影响动作确认, 轮次检查点
安全阀不受影响; 偏好读取失败一律按关闭处理
- 新增 create_strategy 动作工具: 写入 ai_ 策略草稿, 发布后才生效
- 助手打开时页面毛玻璃遮罩, 点击遮罩关闭助手 (可开关)
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 17:31:11 +08:00 |
|
shy3130
|
d43a3021da
|
feat(kline): 批量上限可配置(前后端同源) + 响应懒净化与 Polars 直出
- 日K/分时批量单请求上限改为系统设置可配 (默认 400), 后端守卫与前端分块
读同一偏好值, 不再发出必然被拒的请求; 两档独立 (分时成本约为日K 20 倍)
- _gzip_payload 懒净化: 无 NaN/inf 常态跳过 _json_safe 整树深拷贝,
峰值 -65% (40→14MB/块), CPU -25%
- minute-batch/daily-batch 全程持有 Polars 帧直出 JSON (write_json 行式),
不再构建 Python dict: 96k 根序列化 1222ms→26ms, 峰值 69→18MB;
字节级等价由 tests/test_kline_batch_frames_json.py 锁定 (含 inf/NaN/None)
- 白盒测试改为解析 Response body (HTTP 真实契约)
- 随 kline.py 同文件: minute-batch 门控在全量分钟服务健康时放行本地读,
补拉限速改走 resolve_limit (×0.8, 与盘后同步同 rpm 桶)
实测: 300 只分时(7.2万根)整请求 191ms; 20 并发尖峰 +728MB→+60MB
Signed-off-by: shy3130 <shy3130@qq.com>
|
2026-10-25 17:31:01 +08:00 |
|