Commit Graph

11 Commits

Author SHA1 Message Date
OpenClaw Agent
d07bede125 fix: 修复 BackfillNavHistoryInternalAsync 中卖出成本计算的严重bug
问题:卖出时用全局累计成本计算减少量,而非该标的的成本
修复:使用该标的的成本(转换为目标币种后)计算减少量
同时添加除零安全检查
2026-03-25 04:12:01 +00:00
OpenClaw Agent
82264ecc25 fix: 修复更多金融计算bug
1. PortfolioNavService: CalculateAndSaveDailyNavAsync 卖出成本计算
   - 使用动态持仓数量字典,而非当前持仓状态
   - 确保多次卖出时比例计算正确

2. PortfolioService: GetPortfolioByIdAsync 盈亏率计算
   - 先转换汇率再计算盈亏率,避免汇率变化影响
   - 正确处理跨币种持仓的盈亏计算
2026-03-25 04:09:55 +00:00
OpenClaw Agent
2a297081b0 fix: 修复多个金融计算bug
1. 卖出时累计成本计算:改为按比例减少成本,而非用卖出金额抵扣
2. 夏普比率计算:收益率从百分比转为小数后计算,修正年化公式
3. 最大回撤初始值:使用首条记录的净值作为初始peak,而非硬编码1.0
2026-03-25 04:03:37 +00:00
OpenClaw Agent
c0accdc903 feat: 用户访问时自动触发当日净值计算
修改 GetNavHistoryAsync:
- 检查是否存在今日净值记录
- 如果不存在,自动调用 CalculateAndSaveDailyNavAsync
- 捕获异常避免影响历史数据查询

收益:
- 用户每次访问收益曲线都能获取最新数据
- 无需手动触发或定时任务
2026-03-24 06:22:28 +00:00
OpenClaw Agent
1c3add27ef fix: 修复收益曲线统计数据与组合详情不一致的问题
问题:
- 收益曲线接口 totalReturn 直接取净值历史最后一条的 cumulativeReturn
- 如果净值历史数据过时,统计信息会与当前持仓数据不一致

修复:
- 在 GetNavHistoryAsync 中检查净值历史最后一条是否为今天
- 如果不是,获取当前持仓数据实时计算累计收益率
- 更新 statistics.TotalReturn 为实时值

影响:
- 组合详情 historicalChange 和收益曲线 totalReturn 将保持一致
2026-03-24 06:14:27 +00:00
OpenClaw Agent
60f3b487ff fix: 修复 PortfolioService 和 PortfolioNavService 变量命名
- 统一局部变量使用 camelCase(C# 规范)
- 修复 DTO 属性名引用
- NavItem -> NavHistoryItem
- 修复 for 循环变量名
2026-03-15 13:31:49 +00:00
OpenClaw Agent
4ce29a1036 refactor: 架构优化 P0-P3
P0 - 安全修复:
- 移除硬编码 API Key,启动时校验必填环境变量

P1 - 高优先级:
- Entity 拆分:Position.cs, Transaction.cs 独立文件
- Controller Facade 封装:IPortfolioFacade 减少依赖注入

P2 - 中优先级:
- Repository 抽象:IPortfolioRepository, IMarketDataRepository
- MarketDataService 拆分:组合模式整合 Tencent/Tiingo/OKX

P3 - 低优先级:
- DTO 命名规范:统一 PascalCase
- 单元测试框架:xUnit + Moq + FluentAssertions
2026-03-15 12:54:05 +00:00
OpenClaw Agent
34f06ce941 perf: 优化历史价格获取,优先从缓存表查询
1. 先从 market_kline_cache 缓存表查特定日期价格
2. 缓存命中直接返回,减少 API 调用
3. 缓存未命中才调用 GetHistoricalDataAsync
4. 获取历史数据从 365 天减少到 30 天
5. 大幅减少 Tiingo API 消耗
2026-03-15 10:12:20 +00:00
OpenClaw Agent
da86aa43e6 fix: 行情获取失败时不写入错误数据,添加 429 限流重试机制
1. GetHistoricalPriceAsync 返回 decimal? 而非 decimal
   - 价格获取失败时返回 null 而非 0
2. BackfillNavHistoryInternalAsync 检查价格有效性
   - 任何持仓价格获取失败时跳过该日期
   - 不写入 totalValue=0 的错误数据
3. MarketDataService 添加 GetWithRetryAsync 方法
   - 处理 429 Too Many Requests 限流
   - 最多重试 3 次,指数退避
2026-03-15 10:02:52 +00:00
OpenClaw Agent
1977dd609d fix: 请求收益曲线时自动回填历史数据
- GetNavHistoryAsync现在会自动检查是否有历史数据
- 无历史数据时自动调用BackfillNavHistoryInternalAsync
- 拆分内部回填方法,避免重复验证权限
2026-03-13 16:21:31 +00:00
OpenClaw Agent
05ca501f40 feat: 新增组合净值历史功能
后端实现:
- 新增PortfolioNavHistory实体,记录每日净值、成本、收益率
- 实现IPortfolioNavService接口,支持净值计算和历史回填
- 支持基于交易记录完整计算历史净值(买入卖出都会更新)
- 计算统计指标:最大回撤、夏普比率、波动率

新增API:
- GET /api/v1/portfolio/{id}/nav-history - 获取净值曲线
- POST /api/v1/portfolio/{id}/nav-history/backfill - 回填历史净值
- POST /api/v1/portfolio/{id}/nav-history/calculate - 计算当日净值

数据库:
- 新增portfolio_nav_history表迁移脚本
- 支持组合级别的净值历史记录
2026-03-13 16:08:59 +00:00