Skip to content

[合并] 分析洞察与质量门禁:信号基建、交易风控成熟化、工程门禁与多平台发版 - #31

Merged
MayueCif merged 23 commits into
mainfrom
feat/analysis-insight-and-quality-gates
Oct 26, 2026
Merged

MayueCif merged 23 commits into
mainfrom
feat/analysis-insight-and-quality-gates

Conversation

@MayueCif

Copy link
Copy Markdown
Member

概述

本分支聚焦三件事:① 把 AI 分析产出变成可回测的机器可读信号;② 虚拟币交易子系统的风控与资金安全成熟化;③ 工程门禁与多平台发版闭环。

规模:20 个提交、522 个文件(+23.7k / −6.9k),新增 252 个单元测试单元(全量 724 通过)。

主要变更

AI 分析与信号基建

  • MarketAnalysisWorkflow 按职责拆分为 partial(RunTracking / AnalystCreation / ModelResolution),并新增文件规模护栏(存量欠账已登记)
  • 新增 AnalystSignalParser + AnalystSignalSnapshot:从分析师结构化输出提取评级、操作方向、目标价、止损、置信度、持有周期,随报告落库,作为回测与分析师绩效统计的数据基础
  • Token 用量按分析师归属统计(AnalysisTokenUsage / TokenUsageRecorder / TokenTrackingMiddleware)
  • 分析师失败隔离:异常转失败标记消息,Fan-In 仍收齐每位分析师,单点失败不阻断报告
  • 精简无引用的工具模型(AShare / Crypto 部分模型删除)

交易与风控(仅 Crypto)

  • 风控新增闸门:紧急停机(TradingHaltState)、交易所 API 健康、连续亏损熔断、策略级单标的上限、合约名义敞口上限
  • 持仓保护:交易所侧条件单(止损/止盈/reduceOnly)挂撤与对账、孤儿单撤销、参数漂移检测
  • 紧急停止 + 全部平仓专用通道(kill switch),停机标记持久化、重启不自动复活
  • 绩效与对账:影子交易账本、策略绩效统计、订单状态同步、限价单超时撤单、强平距离预警
  • 本轮合并前修复:熔断期间放行退出单;成交滑点落库

UI 与稳定性

  • 首屏骨架屏 + 统一 StateOverlayView(加载/空/失败重试),资产页信息密度调整
  • 报告导出(Markdown / 分享图 PNG / PDF)、每日 AI 简报、告警中心历史筛选与一键 AI 归因

工程质量与发版

  • Directory.Build.props 开启 TreatWarningsAsErrors,全库 0 警告
  • CI 新增:格式校验、三平台构建、单元测试门禁(此前单测从不自动触发)
  • 版本号改为 Git Tag 驱动(ResolveVersionFromGitTag + 发版后回写 FallbackVersion)
  • 修复 .gitignore 误忽略 .github;解除 .secrets 追踪;图标生成与多平台打包脚本更新

合并前复核修复(4 项)

  1. 熔断拒平仓单:RiskManager.ValidateOrderAsync 新增 isExitOrder,退出单跳过 9 道开仓侧闸门(金额门槛、交易次数、连亏、API 健康、仓位/敞口上限、回撤、日亏损),保留持仓充足性与余额校验;用户显式停机仍全拒,离场走「全部平仓」
  2. 滑点从不落库:滑点计算前移到 SaveTradeRecordAsync 之前,slippage_percent 不再恒为空
  3. 信号缺失评级被写成 StrongBuy:非空枚举改为字段存在性判定(新增 LlmJsonExtractor.TryExtractJson),删除 ?? Neutral 死代码
  4. 失败分析师终态被覆盖为完成:AnalystRunState.MarkSucceeded 增加失败态守卫

验证

  • Debug 构建:0 警告 / 0 错误
  • Release 全量 Rebuild -warnaserror:0 警告 / 0 错误
  • dotnet format --verify-no-changes:通过
  • 单元测试:724 通过 / 0 失败(tests/unit.runsettings,与 CI 同参数)
  • 新增回归用例已做反向验证:移除守卫后降级用例精确报出「终态应为 Failed,实际为 Completed」

风险与部署注意

  • 行为变化:止损/止盈/网格破网/AI 硬边界等退出单在熔断期间现在会成交(此前被拒并暂停策略)
  • 停机期间所有经风控的订单仍被拒,手动离场需使用「全部平仓」
  • 收藏列表虚拟币代码统一为 BTCUSDT 形式,启动时自动迁移(幂等,按最早一条去重)
  • 版本号依赖 Git Tag:发版须打 v* tag;release 工作流最后会把 FallbackVersion 回写 main,需允许 bot 推送或放宽保护
  • 仅在 Windows 本机验证,Linux/macOS 由 CI 矩阵覆盖;UI 层无自动化测试

回滚

按提交粒度回滚:两项修复为独立提交(e9b09e0 交易侧、12b1e1d 分析侧),其余为该分支既有功能提交。

MayueCif and others added 23 commits September 24, 2026 19:10
- AssetPage 四区块并行加载(行情速览/技术指标/盘口深度/逐笔成交,Crypto 专属),
  A 股以数据源说明替代错误态,新增价格告警直达与单区块重试
- Token 消耗透出:ITokenUsageRecorder 作用域归集至 MarketAnalysisReport.Usage,
  设置页按分析师角色配置模型,缓存指纹纳入角色映射
- 稳定性:LoadState 五态 + 首屏骨架屏 + StateOverlayView 统一降级,
  数据层区分无结果与数据源不可用
- 技术指标计算收敛为 TechnicalIndicatorService,盘口/逐笔抽取为独立市场服务
- 同步 roadmap.md 与各子项目 AGENTS.md 状态

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- CoordinatorResult 补机器可读字段 TargetPriceValue/ExpectedChangePercent(与文本字段互补)
- FinancialAnalysisResult 补 FinancialRating,补齐六位分析师的方向性评级覆盖
- 新增 AnalystSignalSnapshot/AnalystSignalParser:从各分析师 JSON 输出提取
  评级/操作/目标价位,CoordinatorExecutor 生成报告时写入 AnalystSignals
- 事件性质 MajorPositive..MajorNegative 等价映射为投资评级,统一绩效口径
- 解析失败静默降级(信号提取不阻断报告),失败标记/未知作者/协调者不产出信号
- 新增 AnalystNames 常量类统一分析师 ASCII 名称
- 补 AnalystSignalParserTest 6 个用例,同步更新 Agents/App.Services AGENTS.md

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- 历史页新增按级别(全部/提示/警告/紧急)与标的关键词(代码或标题)筛选,
  全量副本本地过滤,筛选为空与无记录两种空态文案区分
- 每条带标的历史告警新增 AI 归因入口:跳转多分析师研判页,
  告警归属市场与当前市场不一致时先切换市场,保证解析正确市场的数据服务
- AlertEvent 补 HasSymbol/MarketTypeText 展示辅助属性
- 筛选纯逻辑抽取为 AlertHistoryFilter(无 IO 可单测),补 5 个单元测试
- ViewModelBase 补 SetReady(),供筛选后重新产生可见数据时退出空态
- PriceAlertPageViewModel 透传 MarketContext,同步更新 App AGENTS.md 与 roadmap P1 状态

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- 新增 Applications/Briefing:IDailyBriefingService 按市场 Keyed 注册,
  基于自选行情与最新要闻单次 LLM 调用生成隔夜要闻+异动归因,
  SQLite briefings 表按 (market, 本地日期) 唯一,当天缓存复用不重复烧 Token
- Token 预算硬边界:自选 8 条(按异动幅度优先)/要闻 8 条/正文 80 字截断/
  简报 1200 字/输出 800 tokens;失败不落盘、不自动重试
- 空输入(无自选无要闻)返回 null 走引导空态,不生成无意义内容;
  提示词禁止编造与买卖建议
- 首页新增每日简报卡片(生成中骨架/失败重试/空态引导),
  HomePageViewModel 组合 DailyBriefingViewModel 子 VM
- 补 DailyBriefingServiceTest 7 个用例(缓存复用/强制刷新/空输入/预算边界),
  同步更新 App/App.Services AGENTS.md 与 roadmap M2 状态

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- 新增 ReportShareCardRenderer:1080x1350 固定画布离屏渲染分享卡(Avalonia 视觉树,中文由宿主字体保证),
  PDF 由同一渲染位图经 SkiaSharp SKDocument 封装单页,分享图与 PDF 视觉一致,无第二套排版
- 分析页新增导出分享图 PNG 与导出 PDF 入口(CanExportReport 门控)
- 新增模型价格表:UserSetting.ModelPrices(元/1M tokens)+ 设置页编辑分区,
  ModelCostCalculator 纯计算 + AnalysisCostService 模型解析
  (口径与 ResolveRuntimeForRole 一致:角色级优先、回落默认)
- 报告页 Token 面板展示成本:约等于金额 / 部分未定价下界标记 / 无有效金额隐藏,
  不猜价格(未覆盖模型只计入下界标记)
- App 显式引用 SkiaSharp(Svg.Skia 已传递依赖,显式化避免漂移)
- 补 ModelCostCalculatorTest 8 个用例,同步更新 App/App.Services AGENTS.md 与 roadmap M2/P1 状态

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- 新增 docs/backtest-metrics.md:信号事件定义、T+1 开盘对齐与持有期映射、
  A股涨跌停不可成交剔除、手续费/滑点、Wilson 置信区间、样本量下限 30、
  对照基准(沪深300 全收益/BTC HODL)与超额收益、分析师绩效四指标
  (方向准确率/置信度分桶校准/协调者一致性/滚动衰减)、MVP 范围与验收
- roadmap M3 与方向 B 同步引用口径文档与数据基础现状

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
将抽象基类与生成器等改为 C# 12 主构造函数写法,统一字段初始化与空值校验风格;

清理不再使用的成员与冗余分支,收敛重复的构造参数转发逻辑。

同步更新受影响测试的构造方式,保持行为不变。
.secrets 曾被 Git 追踪(内容形如 GITHUB_TOKEN=...),存在密钥误提交风险。

本次仅解除追踪并补充 .gitignore 规则,本地文件保留。

注意:该文件仍存在于远端历史中,相关 token 必须在 GitHub

Settings → Developer settings 中轮换;已删除不等于失效。
CI:恢复 test.yml 的 push/PR 触发(原被注释致 533 个测试从不执行),

并修正 --filter 与 runsettings 语义冲突导致的 56 个用例漏跑;新增格式门禁 job。

质量门:Directory.Build.props 开启 TreatWarningsAsErrors,全库存量警告清零。

正确性:全库标的比较改用 Ordinal/Invariant(原先依赖当前区域设置,tr-TR 下

IOTA→İOTA 会导致路由错误标的);ChatSessionPersistenceService 的

DateTime.Parse 对齐写入侧往返格式;4 处 Dispose 补GC.SuppressFinalize。

功能:简报后台调用开关与Token 成本可见(S3)、模型参考价与引导(S4)、

告警历史按市场筛选(S5)、A 股五档盘口与逐笔接入(S6)。
1086 行的单体工作流拆为四个文件:主文件仅保留编排(768 行),

进度跟踪(RunTracking)、模型解析(ModelResolution)、分析师创建(AnalystCreation)各自独立。

采用 partial 拆分而非独立类,确保嵌套类型与公开成员的引用面完全不变。

新增 FileSizeGuardTest 约束单文件 ≤600 行,防止拆分成果回退。
FileSizeGuardTest 此前因 8 个存量超限文件而失败,会导致 CI 长期红灯。

按方案 B 登记豁免台账(逐条写明原因),并补充三重约束:

  1. 条目不得指向已删除文件

  2. 条目不得指向已降至阈值内的文件(防止隐藏豁免)

  3. 豁免数不得超过递减预算,当前上限 8,只能减少不能增加

阈值保持 600 行不变,作为长期目标线。
迁移故障只在真实升级场景暴露(测试环境每次都是全新库),且多为静默失效:

reports.market_type 缺失时 M3 回测仍能出结果,只是分市场数字全错。

将 DailyBriefingService.MigrateSchemaAsync 与 ReportArchiveService.EnsureMarketColumnsAsync

提取为接收 SqliteConnection 的静态方法(参照 TradingDataService 既有模式),

从而可用内存 SQLite 覆盖旧库升级路径。

覆盖:补列、历史行保留、新库建表、幂等性、唯一索引,

并显式锁定'历史 market_type 必须保持 NULL,禁止由 asset_code 反推'。

已做变异测试验证:移除列存在性判断后 3 个用例失败。
本次提交大幅改进数据源、UI、打包与交易抽象,并加强容错与测试覆盖:
- A 股数据双源回退:AShareKLineService 优先智兔(ZhiTu),失败/404/不覆盖时回退 Sina;AShareMarketSnapshotService 优先 CLS,失败回退 Sina;Cls/Sina 返回模型数值字段改为 nullable,缺失字段不再伪造为 0。
- K 线与指标增强:KLineChartView 暴露指标可见性属性(MA/BOLL/Vol/MACD/KDJ/Legend),web 脚本支持动态开关、分图自适应、万/亿格式与上海时区显示;跳过含 null OHLC 的无效 bar、成交量缺失按 0 处理。
- 资产页与布局调整:资产详情信息密度提升;右栏恒显(宽度 360)、逐笔仅保留 Crypto;顶栏/导航行为收敛,市场切换移至左侧导航。
- 每日 AI 简报改为纯手动生成:引入 DailyBriefingWindow/IWindowService,ViewModel 单例策略、Token 预算与标题/正文截断;移除自动触发与自动计费路径。
- 移除货币成本估算链路:停用/移除 AnalysisCostService/ModelCostCalculator 等,保留 Token 用量展示并隐藏相关 UI。
- 交易抽象重构:将 CryptoTradingMode 替换为通用 TradingMode(LiveSpot/LiveFutures/FuturesTestnet/SpotDemo);更新 TradingCredentialStore、路由、工厂与相关服务签名以支持市场无关契约,为未来 A 股模拟盘铺路。
- 数据提供者与网络防护:新增 SinaKLineClient、加强 SinaStockQuote 解析与校验;对 Binance 增加地区限制(HTTP 451)检测并抛出专用 BinanceRegionUnavailableException 避免无限重试;ErrorMessageMapper 保留并截断 LLM 服务端错误用于诊断。
- 构建/图标与打包:加入 scripts/icons/generate_icons.py 并将多分辨率图标并入 Assets,更新 deb/rpm/mac/innosetup 打包脚本以使用预生成产物,避免嵌入超大母版图。
- DI/服务注册调整:新增 SinaKLine HttpClient、A 股模块使用 NoopTickTradeService(无逐笔);DailyBriefing 注册为 Singleton;DialogService 同时实现 IWindowService。
- 容错、日志与异常友好化:大量 null 防护、OrZero 辅助、FriendlyException/映射增强以保留服务端诊断文本与限制长度。
- 测试:重构并扩展单元/集成测试,新增对 AShare 双源回退、Sina/CLS 字段漂移、Binance 地区不可用、简报手动化与 Token 截断等场景的覆盖;移除/迁移成本相关测试(ModelCostCalculatorTest)。

总体目标:提升资产详情与图表交互能力,强化对外部不稳定数据源的鲁棒性,避免自动化消费风险,统一交易模式抽象并改进跨平台打包流程与测试覆盖。
完成大范围重构与契约收敛,主要变更摘要:
- 文档与路线图更新:README、design.md、roadmap.md,记录 K 线/区块布局、A 股盘口/逐笔接入与回退、TopBar/Agent 行为等产品决策与版本说明。
- 公共工具与格式约定:新增 PercentFormatter(带符号百分比、InvariantCulture)、DateKeys(yyyy-MM-dd 本地日期键);统一 SinaHqText GBK+quoted-payload 处理;新增 JsonFileConfigStore(进程内文件锁与原子写回);增强 StockSymbolConverter 并复用到 FavoriteCodeNormalizer、HomeAssetService 等。
- 告警系统简化:AlertSuppressionPolicy 移除全局每小时配额状态(QuotaState),Evaluate 签名改为由调用方传入抑制参数并仅返回合并状态与 ShouldNotify;AlertCenterService 与 UserSetting 相应调整。
- 配置/设置持久化重构:MCPServerConfigService、UserSettingService 继承 JsonFileConfigStore,使用统一文件锁与 SaveAtomic;Secret 存储迁移保留;MCP 配置页增加 McpToolAuditLogger 审计展示。
- 行情数据与格式化收敛:AShare/指数/crypto 服务与 Sina 客户端统一使用 PercentFormatter 与 SinaHqText 提取逻辑;新增 TickerTrendExtensions;修正交易所前缀处理、停牌/无成交表现。
- 交易与重试:抽取 PlaceOrderWithRetryAsync,统一指数退避重试(1s/2s/4s)、日志与异常语义;引入 OrderRetryCount 常量,移除重复重试代码。
- UI 与会话历史:聊天侧栏新增历史会话面板(摘要、恢复、删除、新建)并持久化;MCPConfigPage 增加审计区块;若干视图/样式微调。
- 移除冗余模型/方法:删除早期冗余模型(如部分 FinancialData、CryptoSentiment、OnChainModels 的 LargeTransferSignal 等);LlmJsonExtractor 去除冗余方法。
- 单元测试扩充:新增/更新 PercentFormatterTest、DateKeysTest、FavoriteCodeNormalizerTest、ChatSessionSummaryItemTest、McpToolAuditLoggerTest、StockSymbolConverterTest 等;适配 AlertSuppressionPolicy 的测试场景。
- 其它清理:移除 WorkflowVisualizationService 注册,收敛服务注册与重复代码,广泛用统一工具替换分散字符串/格式化实现。

总体影响:跨模块契约收敛(日期键、百分比格式、交易所前缀、文件写回)、告警/持久化/重试语义调整,减少重复实现并修正 A 股数据判读,增强健壮性并通过新增单元测试降低回归风险。
统一告警中心并新增外部通道(Feishu)
- 引入 IAlertChannel/FeishuAlertChannel 与 FeishuWebhookClient(URL 验证、签名、短超时+重试),通道隔离异常、按 MinimumLevel 过滤,抑制/合并由 AlertSuppressionPolicy 管理。
- AnalysisRatingAlertService 订阅评级变更上报告警;告警规则扩展支持指标类告警、指标度量随上报。

价格/指标告警重构为周期评估
- PriceAlertRule 支持 Scope(Single/Watchlist)、KLineType、指标条件、交叉/突破语义及去抖/冷却/限次。
- IndicatorMetricCalculator 为纯函数计算度量;IndicatorAlertEvaluator 周期拉取 K 线与指标快照(5 分钟级),按 (market,symbol,KLine) 缓存并驱动规则状态机;自选股批量规则与 per-symbol 副本隔离。

飞书 UI/设置与 DI 启动激活
- UserSetting/设置页新增飞书配置与“发送测试消息”;DI 注册 FeishuWebhookClient、FeishuAlertChannel、IndicatorAlertEvaluator、AnalysisRatingAlertService 等并在启动时显式激活周期任务与订阅。

交易成熟化与风控增强
- 引入 TradingHaltState 与 EmergencyStopService(trading_control 持久化),支持 StopStrategiesAndOrdersAsync 与 CloseAllPositionsAsync。
- TradeExecutor 支持条件单“腿别”(Stop/TakeProfit)、clientOrderId 腿后缀、ExecuteEmergencyCloseAsync(绕过风控确认但保留资金安全机制)、滑点记录与阈值告警、开仓前杠杆钳制。
- ExchangeConditionOrderService 按腿管理在途订单,支持 OCO(CancelSiblingLegs)。
- RiskManager 首位校验 TradingHaltState,集成 ApiHealthMonitor 做 API 熔断,支持策略级仓位/名义敞口/连续亏损限制。
- PendingOrderTimeoutService 周期撤限价单并告警;LiquidationRiskEvaluator 监控合约距强平价并发告警/联动门控。

影子交易与绩效、持久化改造
- 新增 ShadowTradingService 与 shadow_trades 表,实现影子账本(FIFO 平仓、记账、查询)及影子绩效统计(StrategyPerformanceService)。
- DB schema 扩展与迁移:新增 trading_control、shadow_trades 表与 trade_records.slippage_percent、trade_records.realized_pnl、daily_stats.consecutive_losses 等列;TradingDataService 暴露 Load/Save TradingHalt、OpenShadowConnection、UpdateTradeRecordRealizedPnl 等接口。

UI/资源与单元测试
- PriceAlert、TradeMonitor、Settings 等页面表单/展示增强(规则作用域、K 线周期、紧急停止横幅、强平风险卡、飞书配置)。
- 增加/修正大量单元测试覆盖 Feishu webhook、告警通路、指标规则状态机、ConditionOrderLeg/OCO、ApiHealthMonitor、LiquidationRiskEvaluator、PendingOrderTimeout、影子交易与绩效等。

总体影响
- 告警从进程内桌面通知扩展到进程外通道(以飞书为首例),指标告警改为周期化评估并复用 K 线,交易路径增加紧急停机/全平仓、条件单双腿/OCO、API 熔断、限价超时撤单、合约强平风险告警与影子记账,完成相应的持久化、UI 与 DI 支持,且覆盖相应单元测试。
添加单元测试质量门禁与多平台构建配置;重构关键服务提升稳定性、性能与资源管理;增强 UI 一致性与用户体验;扩展行情、策略及风控功能支持
</final_answer>
@MayueCif
MayueCif merged commit 60cca33 into main Oct 26, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant