Commit Graph
372 Commits
Author SHA1 Message Date
wshy fffd89fce0 Merge pull request #138 from intfoo/feat/custom-source-timeout-param-ui
自定义数据源超时与请求参数名支持前端配置
2026-07-25 22:01:11 +08:00
wshy ae6cf3bee4 Merge pull request #140 from intfoo/fix/index-quotes-change-pct-polling
fix(index-quotes): compute change_pct for custom data source
2026-07-25 16:59:11 +08:00
wshy dd33821acc Merge pull request #141 from HelloByeAll/agent/backtest-position-curve
feat: 回测净值图叠加仓位曲线
2026-07-25 16:52:03 +08:00
HelloByeAll 852cc2f319 新增: 在回测净值图叠加仓位曲线 2026-07-24 21:12:26 +08:00
intfoo 99b0c6cb35 fix(index-quotes): compute change_pct for custom data source
Custom data source realtime quotes were missing change_pct because _build_index_quotes only kept pre-existing columns. TickFlow path computes it in _fetch_full_market_quotes, but custom source path bypasses that computation.

- _build_index_quotes computes change_pct/change_amount from last_price/prev_close when not provided by the source
- guards prev_close=0 (Polars produces inf, invalid JSON)
- aligns with TickFlow path and _fallback_index_quotes_from_daily
2026-07-24 11:35:19 +08:00
intfoo a15d0468cc feat(data-source): expose custom source timeout & request param names in UI
- backend: pass timeout through DatasetConfigIn / _config_to_dict / _sanitize_dataset
  (previously a hand-set YAML timeout was silently wiped on UI save, resetting to 30s)
- frontend: add per-dataset timeout input; collapsible 请求参数字段映射 with
  symbols/start/end_param (non-realtime) + asset_type/freq_param (minute);
  rename 字段映射 -> 响应参数字段映射; chevron at title end; realtime empty-state hint
- test: timeout config round-trip (custom value persists, default 30 not emitted)
- docs: document timeout in custom-data-source.md
2026-07-23 16:22:18 +08:00
shy3130 60fe9e6fa6 修复回测指标数据缺失提示问题 2026-07-22 13:30:02 +08:00
shy3130 a12e49d66d 修复实时行情下策略图表闪烁问题 2026-07-22 11:42:57 +08:00
shy3130 2d9fe4a4af 修复策略文件无法删除问题 2026-07-22 11:21:13 +08:00
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
intfoo d9a77a534a fix(minute): 承接 #122 review 三处阻断问题整改 + resolver 异常边界加固 2026-07-19 16:00:22 +08:00
intfoo 91e16db547 fix(layout): 修复 None 档+自定义实时源用户侧边栏指数行情不显示
承接 #121 review: Layout.tsx:631 的 !isNoneTier 一刀切判定与同文件
546 行实时行情开关判据不一致, 导致 None 档+自定义实时源用户监控页
放行、实时开关可用, 但侧边栏指数行情卡片不渲染。后端
/api/intraday/indices 从缓存读取不调 TickFlow, 对该用户有数据,
纯前端拦截导致 UI 体验不一致。

将 !isNoneTier 改为 (!isNoneTier || !!realtimeProviderName),
与实时行情开关判据对齐。
2026-07-19 13:35:36 +08:00
intfoo 4c85f99633 fix(minute): 自定义分钟数据源用户单股补拉/监控页整改 (承接 #121 review) 2026-07-19 13:35:35 +08:00
intfooandshy3130 e2ffde99d5 fix(minute,monitoring): 自定义数据源用户单股补拉/监控页打通 (#121)
承接 #126: 能力探测已补 KLINE_MINUTE_BATCH, 但两处取数/UI 仍按 TickFlow
档位拦截, 配了自定义分钟/实时源的 None 档用户依旧被挡。

- kline_sync.fetch_minute_single: 与 sync_minute_batch 一致, 先查
  preferences.get_minute_data_provider(), 非 tickflow 且自定义源有
  minute dataset 时走 custom provider, 避免分时图首次打开(本地无数据)
  补拉返回空。
- Monitoring.tsx: None 档但配了自定义实时源时, 后端
  is_realtime_allowed(realtime_mode=full_market) 仍返回 True。
  以 quoteStatus.realtime_allowed 作为最终判据, 不再用 isNoneTier
  一刀切拦截实时监控页。

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-19 13:26:52 +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
wshy c5049d26a7 Merge pull request #130 from lytem28/feat-matrix-pr
feat: 大幅优化回测速度以及内存占用
2026-07-16 13:25:44 +08:00
lytem28 b6cf0495e1 feat: complete matrix-native backtest engine
Unify strategy execution across backtest, screener, and monitoring; isolate backtest workloads in spawn workers; and add shared matrix caching plus valid-bar indicator acceleration.
2026-07-16 12:17:27 +08:00
wshy b1845cf491 Merge pull request #129 from CJ0Hn/feat/watchlist-screenshot-import
feat(watchlist): 支持从券商自选截图批量导入
2026-07-16 00:03:18 +08:00
ChenJunheng 0d6b341945 fix(watchlist): 采纳 #94 审查 — 防大图 OOM、OCR 不阻塞事件循环、收紧图片类型
为截图预处理增加像素上限与长边降采样;import-image 将 OCR 放入线程池;
去掉任意 image/* 放行,仅允许白名单 MIME/扩展名。
2026-07-15 23:28:30 +08:00
ChenJunheng 6f084e1b29 feat(watchlist): 支持从券商自选截图批量导入
基于 Tesseract OCR 识别六位代码并校验证券主数据,前端提供导入确认弹窗;
修复批量添加后 enriched 缓存未刷新导致需手动刷新页面的问题。
2026-07-15 23:25:46 +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
wshyandshy3130 963092384f fix(capabilities): 自定义分钟数据源补 KLINE_MINUTE_BATCH 能力 (#126)
issue #121: 用户配了自定义分钟数据源, 但分时图/自动同步/回测等功能
仍提示"需 Pro+"。根因: 能力探测(detect_capabilities)只探测 TickFlow
API Key 档位, 不感知用户本地配的自定义数据源。

修复:
- capabilities.py: CapabilitySet 加 grant() 方法 (不覆盖已有能力)
- policy.py: detect_capabilities 拆成 _detect_tickflow_caps (原逻辑不动)
  + _augment_custom_sources (探测完检查自定义分钟源, 有的话补能力)

补能力后所有 capset.has(KLINE_MINUTE_BATCH) 检查自动通过; 取数函数
内部仍按 preferences.get_minute_data_provider() 分流到自定义源,
不会错误调用 TickFlow。前端读后端返回的 capabilities, 无需改动。

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 22:27:03 +08:00
wshyandshy3130 e456d018fc feat(strategy): AI生成/自定义编写 tab 加策略开发指南链接 (#125)
两个 tab 的描述行都加了指向 GitHub strategy-guide.md 的链接,
方便用户参考指标列/信号列/filter_history 写法/参数类型等。

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 21:59:56 +08:00
wshyandshy3130 ee17261feb fix(strategy): parsePyValue 对非 JSON 值兜底, 修复 AI 修改 date 参数崩溃 (#124)
get() 对字符串值去外层引号后传给 parsePyValue, 字符串型 default
(如 date 类型的 "2024-01-01") 去引号变成 2024-01-01, JSON.parse
在 position 4 报错 → 整个 StrategyBuilderDialog 白屏。

parsePyValue 加 try/catch: JSON.parse 失败时返回原始字符串。
数字/布尔不受影响, 字符串值兜底为字符串。

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 21:52:24 +08:00
wshyandshy3130 2f762b3bcc fix(strategy): import 白名单加 datetime + date 参数处理补进文档 (#123)
问题: ai_single_yang_unbroken 策略用 from datetime import date 做
date 类型参数转换, 被安全修复的 import 白名单(只允许 polars)拦截,
策略加载失败消失。同时 date 列(Polars Date)与字符串参数直接比较
报 InvalidOperationError 导致 500。

修复:
- ai_generator.py: import 白名单加入 datetime (纯日期运算, 无文件/
  网络/进程能力, 安全)。验证 os/sys/subprocess 仍被拦。
- strategy-guide.md: params type 补全(float/int/bool/select/date);
  filter_history 要点新增 date 参数必须 fromisoformat 转换的代码示例
- strategy-guide-compact.md: 同步补充 (AI 运行时实际用的文档)

从源头避免 AI 生成的 date 类型参数策略再犯字符串 vs Date 列比较错误。

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 21:47:26 +08:00
wshyandshy3130 f470e46f2b fix(security): 策略代码 RCE 漏洞三层修复 (#122)
漏洞链 (安全研究员 Aeon 报告):
1. StrategyCodeSaveRequest.strict 由客户端控制, 传 false 完全跳过安全校验
2. AST 名单只拦 ast.Name 直接调用, dunder 遍历可绕过
   ((lambda:0).__globals__["__builtins__"]["__import__"]("os"))
3. _load_file 用 exec_module 执行策略文件, 执行侧零校验
   => 未认证局域网用户可写入任意代码并立即执行 (RCE)

修复:
- strategy.py: 移除 strict 字段, 安全校验无条件执行 (第1层)
- ai_generator.py: _validate_safety 加固, 拦截 dunder 属性访问
  (__globals__/__builtins__/__class__/__subclasses__ 等) 和字符串下标
  访问 (第2层)
- engine.py: _load_file 在 exec_module 前读文件内容跑一次 _validate_safety,
  防止策略文件被直接篡改绕过 API 校验 (第3层 纵深防御)

前端: api.ts 移除 strict 参数, StrategyBuilderDialog/StrategyPoolDialog
移除 strict:true 传参 (前端本就全部传 true, 行为不变)

验证: PoC 三种攻击 payload 全部拦截, 正常策略(只import polars)无误杀

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 21:32:39 +08:00
wshyandshy3130 0fba9eb57b chore: 版本号升至 0.1.85 (#119)
Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 18:54:17 +08:00
wshyandshy3130 70a4aad010 feat(monitor): 个股通知带行业/概念 ext 标签 + 全局配置 (#118)
监控中心顶部加全局配置(齿轮), 选择要在个股通知里展示的 ext 字段
(默认概念 ext_gn_ths + 行业 ext_hy_ths)。开启后触发记录卡片和推送
toast 统一显示行业(蓝)/概念(橙)标签。

架构: 源头富化 — 后端 SSE 推送前 (_enrich_alerts_ext) 用
_load_ext_value_maps (带 mtime 缓存) 按 symbol 富化; GET /api/alerts
读取时同样富化。前端零额外请求。

配置支持细粒度裁剪:
- 字段下拉按扩展表分组 (optgroup)
- 显示前N个 (maxTags), 留空=全部
- 隐藏指定位置 (hiddenIndices), 点数字划掉

数据结构 {field, maxTags, hiddenIndices} 向后兼容旧字符串格式。

后端:
- preferences.py: get_monitor_ext_fields + _normalize_ext_field
- settings.py: RealtimeMonitorConfigIn + get_preferences 加字段
- quote_service.py: _enrich_alerts_ext SSE 推送前富化
- alerts.py: list_alerts 加 ext_columns 参数

前端:
- api.ts: MonitorExtFieldItem 类型 + alertsList extColumns 参数
- Monitor.tsx: 齿轮入口 + 配置弹窗 + 卡片标签行
- AlertToast.tsx: toast 底行加标签

Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
2026-07-14 18:49:23 +08:00
wshy 002fb9387e fix(docker): Codex CLI 挂载路径可覆盖 + 版本号单点维护 (#117)
PR #116 review 遗留两项非阻塞建议的后续修复:Windows 挂载路径可覆盖 + 版本号单点维护。
2026-07-14 18:16:27 +08:00