Commit Graph

37 Commits

Author SHA1 Message Date
OpenClaw Agent
c411caea17 feat: Position表增加TotalCost字段 + 金融计算单元测试
1. Position实体增加TotalCost字段
   - 精确追踪卖出后的剩余成本
   - 避免用Shares*AvgPrice计算成本的精度问题

2. PortfolioService逻辑更新
   - 买入时更新TotalCost
   - 卖出时按比例减少TotalCost
   - 所有成本计算改用TotalCost字段

3. 增加关键计算步骤日志
   - 创建/更新持仓时记录成本变化
   - 持仓计算时记录关键数值

4. 新增金融计算单元测试
   - 卖出成本计算测试
   - 汇率变化影响测试
   - 夏普比率计算测试
   - 最大回撤计算测试
   - 边界情况测试

5. 提供数据库迁移SQL脚本
2026-03-25 04:27:40 +00:00
OpenClaw Agent
650d59aaff refactor: 统一使用 SqlSugarClient(官方推荐高性能模式)
官方建议:
- SqlSugarClient 超高性能模式
- 每次 new 创建实例
- IsAutoCloseConnection=true 自动关闭连接
- 适合 DI Scoped 注入、后台任务、Task.Run 场景

修改:
1. DI 注入改为 Scoped(每次 HTTP 请求一个实例)
2. 移除 SqlSugarScope,统一使用 SqlSugarClient
3. 后台任务创建新实例(已实现)
4. MySQL 连接池复用底层 TCP 连接

优点:
- 性能更好
- 代码更简单
- 符合官方最佳实践
2026-03-25 02:47:00 +00:00
OpenClaw Agent
dc50dfc917 fix: 区分 SqlSugarScope 和 SqlSugarClient 使用场景
区分:
- GetSqlSugarScope(): 返回 SqlSugarScope,用于 DI 注入(Singleton)
- GetSqlSugarClient(): 返回 SqlSugarClient,用于后台任务(每次创建新实例)

原因:
- SqlSugarScope 使用 AsyncLocal 隔离上下文
- Task.Run 后台线程中 AsyncLocal 可能无法正确传递
- 后台任务使用 SqlSugarClient 更安全,每个实例独立连接

使用:
- DI 注入:GetSqlSugarScope()
- Repository 后台写入:GetSqlSugarClient()
- MySQL 连接池复用底层 TCP 连接,性能开销小
2026-03-25 02:42:26 +00:00
OpenClaw Agent
cbe0ac9f4a fix: 每次写入创建新 SqlSugarClient 实例
根因分析:
- MarketDataRepository 使用注入的 ISqlSugarClient(Scoped)
- 多个 Task.Run 并发调用 SavePriceCacheAsync
- Storageable 操作使用同一个 SqlSugarScope 实例
- 连接在 await 边界被复用 → 冲突

正确方案:
- SavePriceCacheAsync 每次创建新的 SqlSugarClient 实例
- MySQL 连接池会复用底层 TCP 连接,性能开销很小
- 不再需要 SemaphoreSlim 锁

优点:
- 完全避免连接冲突
- 代码更简洁
- 并发写入无限制
2026-03-25 02:37:18 +00:00
OpenClaw Agent
51b7372d81 fix: 优化 MySQL 连接池配置
问题:Cannot Open when State is Connecting

分析:
- SqlSugarScope 是线程安全的,使用 AsyncLocal 隔离上下文
- Singleton 注册符合官方建议
- 问题可能出在 MySQL 连接池配置

修复:
添加连接池参数:
- Pooling=true(开启连接池)
- MaximumPoolSize=100(最大连接数)
- MinimumPoolSize=5(最小连接数)
- ConnectionTimeout=30(连接超时)
- ConnectionIdleTimeout=180(空闲连接超时,避免使用陈旧连接)

配合内存缓存层,减少数据库查询次数
2026-03-24 10:08:35 +00:00
OpenClaw Agent
8d7e62f8af fix: SqlSugar 注册改为 Scoped 避免并发冲突
问题:
- ISqlSugarClient 注册为 Singleton
- 多个请求共享同一个 SqlSugarScope 实例
- Task.WhenAll 并发查询时连接状态冲突

修复:
- Singleton → Scoped
- 每个 HTTP 请求独立的 SqlSugarScope 实例
- 避免跨请求共享连接对象

配合内存缓存层,双重保障:
1. 内存缓存:减少数据库查询次数
2. Scoped:隔离请求间的连接对象
2026-03-24 09:59:30 +00:00
OpenClaw Agent
3fb2403e85 fix: 增强价格获取稳定性和日志追踪
问题排查:
1. 缓存命中时验证价格有效性(Price > 0)
2. 外部 API 返回无效价格时拒绝写入缓存
3. 缓存查询层添加详细日志
4. 捕获缓存查询异常并返回 null

改进:
- 缓存价格 <= 0 时忽略缓存重新获取
- 外部 API 价格 <= 0 时抛出异常,避免污染缓存
- 详细日志追踪价格获取全流程
2026-03-24 09:35:50 +00:00
OpenClaw Agent
6b50d7fc50 refactor: SqlSugarScope注册为Singleton实现线程安全,移除手动信号量限制 2026-03-17 09:26:26 +00:00
OpenClaw Agent
625bfa1624 fix: 修复编译错误
- PortfolioRepository: Date -> NavDate 属性名修正
- MarketDataRepository: 修复 TiingoTicker.Ticker 空引用警告
2026-03-15 13:07:40 +00:00
niannian zheng
33392c4524 添加缺失的引用 2026-03-15 20:59:46 +08: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
abcdc7110b refactor: 后端架构优化 P0-P1
P0: 移除硬编码 API Key
- MarketDataService Tiingo Key 改为强制环境变量

P1: 拆分 Entity 文件
- 从 Portfolio.cs 提取 Position.cs
- 从 Portfolio.cs 提取 Transaction.cs
- 每个实体独立文件,符合单一职责原则
2026-03-15 11:44:06 +00:00
OpenClaw Agent
6a757f56da fix: 添加 PortfolioNavHistory 到 CodeFirst 初始化,删除手动迁移脚本
- DatabaseService.InitializeDatabase() 添加 PortfolioNavHistory
- 删除 migrations/ 目录,使用 CodeFirst 自动建表
2026-03-15 08:29:05 +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
e7a551ea8b 修复decimal字段定义错误:统一价格字段为decimal(18,8),成交量为decimal(24,8) 2026-03-12 06:22:52 +00:00
f9d24203c6 修复行情缓存字段溢出问题:价格保留8位小数,字段长度扩展为20位 2026-03-12 06:08:57 +00:00
949fa8e85b 实现行情缓存系统:实时价格+历史K线双层缓存,减少API调用提升响应速度 2026-03-10 13:21:54 +00:00
niannian zheng
52af47b41e build: 更新 Microsoft.Extensions.Configuration.Abstractions 依赖版本
将 AssetManager.Data 和 AssetManager.Services 项目中的 Microsoft.Extensions.Configuration.Abstractions 包版本统一更新至 10.0.3,以保持依赖一致性
2026-03-09 17:07:25 +08:00
f2d4351145 refactor: 所有配置优先从环境变量读取,完全支持Docker环境变量注入 2026-03-09 08:56:26 +00:00
739a37f24d refactor: 所有配置改为从appsettings.json/环境变量读取,移除硬编码 2026-03-09 08:49:31 +00:00
虾球
86e073add7 feat: TiingoTicker 预留 Name 字段,支持中文名搜索 2026-03-06 09:50:27 +00:00
niannian zheng
0a053906ef Merge branch 'main' of https://git.jb18cm.plus/fanfpy/AssetManager.API
# Conflicts:
#	AssetManager.Data/TiingoTicker.cs
2026-03-06 17:42:08 +08:00
虾球
0f7213cab8 feat: 删除 TiingoTicker 的 StartDate/EndDate 字段 2026-03-06 09:33:49 +00:00
niannian zheng
95a29cf86a 删除股票字典表时间字段 2026-03-06 17:33:39 +08:00
虾球
ebdc704819 fix: TiingoTicker CreatedAt/UpdatedAt 改为可空 2026-03-06 09:23:42 +00:00
虾球
7a808a1465 feat: 添加 TiingoTicker 股票代码字典实体 2026-03-06 08:40:00 +00:00
niannian zheng
b5499ef7fe refactor: 将模型属性改为可为空类型以增强健壮性
- 修改ApiResponse、RiskParityConfig等DTO类的属性为可空类型
- 在策略计算器中添加空值检查逻辑
- 更新服务层代码处理可能的空值情况
- 添加发布配置文件FolderProfile.pubxml
2026-03-06 15:51:59 +08:00
fanfpy
1ec23bef3d feat(币种): 支持CNY/USD/HKD,添加用户默认本位币、币种枚举和入参校验 2026-03-05 10:36:46 +00:00
fanfpy
f442f0cd1b feat(策略引擎): 实现技术指标库、Mock市场数据、吊灯止损/双均线策略、策略信号API 2026-03-05 09:46:33 +00:00
niannian zheng
fe781db417 refactor(策略): 将标签存储格式从JSON数组改为逗号分隔字符串
修改策略标签的存储格式,从JSON数组序列化改为简单的逗号分隔字符串,简化数据存储和处理逻辑。同时更新相关控制器和服务层的代码以适应这一变更。
2026-03-02 17:29:56 +08:00
niannian zheng
31c598c4bc feat(策略): 添加策略描述、标签和风险等级字段
扩展策略模型,新增描述、标签(JSON数组)和风险等级字段
更新策略服务以处理新增字段
修改策略DTO和控制器返回更详细的策略信息
更新API文档示例
2026-03-02 17:13:16 +08:00
niannian zheng
09bd91e686 refactor(数据库): 优化数据模型并移除初始化脚本
- 删除 InitDatabase.cs 文件,将数据库初始化逻辑移至其他位置
- 为 Portfolio、Position 和 Transaction 类添加索引
- 添加 AssetType 字段以支持多种资产类型
- 将 Shares 和 Amount 字段类型从 int 改为 decimal(18,8)
2026-02-28 16:58:04 +08:00
niannian zheng
d39a6347cd feat: 实现微信登录和用户信息管理功能
- 添加微信登录功能,支持通过微信小程序登录
- 实现用户信息管理接口,包括获取用户信息和统计数据
- 新增投资组合列表和总资产统计接口
- 完善JWT令牌生成逻辑,支持可选用户名
- 添加数据库初始化配置和连接字符串
- 移除传统登录和注册功能,专注微信登录方案
2026-02-26 11:56:14 +08:00
niannian zheng
2fe0b0c134 Remove bin and obj directories from Git tracking 2026-02-24 19:25:28 +08:00
niannian zheng
a1cec21ea1 chore: 更新项目构建缓存文件和.gitignore配置
更新各项目的构建缓存文件,包括assets.cache和AssemblyInfo相关文件
添加.gitignore文件以忽略常见的构建输出和开发环境文件
2026-02-24 17:10:48 +08:00
cd5c3aedbe feat: 初始化项目结构并添加基础功能
- 创建解决方案及各项目层
- 添加API基础控制器和DTO定义
- 实现JWT认证服务和微信登录服务
- 添加Swagger文档支持
- 配置项目依赖和构建文件
2026-02-18 20:36:09 +08:00