1. Position实体增加TotalCost字段 - 精确追踪卖出后的剩余成本 - 避免用Shares*AvgPrice计算成本的精度问题 2. PortfolioService逻辑更新 - 买入时更新TotalCost - 卖出时按比例减少TotalCost - 所有成本计算改用TotalCost字段 3. 增加关键计算步骤日志 - 创建/更新持仓时记录成本变化 - 持仓计算时记录关键数值 4. 新增金融计算单元测试 - 卖出成本计算测试 - 汇率变化影响测试 - 夏普比率计算测试 - 最大回撤计算测试 - 边界情况测试 5. 提供数据库迁移SQL脚本
78 lines
2.1 KiB
C#
78 lines
2.1 KiB
C#
using SqlSugar;
|
|
|
|
namespace AssetManager.Data;
|
|
|
|
/// <summary>
|
|
/// 持仓明细表
|
|
/// </summary>
|
|
[SugarTable("positions")]
|
|
public class Position
|
|
{
|
|
/// <summary>
|
|
/// 主键
|
|
/// </summary>
|
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = false)]
|
|
public string? Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// 所属组合ID
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "portfolio_id", IndexGroupNameList = new string[] { "idx_portfolio_id" })]
|
|
public string? PortfolioId { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标的代码 (如: UPRO.US)
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "stock_code", Length = 50)]
|
|
public string? StockCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标的名称
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "stock_name", Length = 200)]
|
|
public string? StockName { get; set; }
|
|
|
|
/// <summary>
|
|
/// 资产类型 (Stock/Crypto)
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "asset_type", Length = 20)]
|
|
public string? AssetType { get; set; }
|
|
|
|
/// <summary>
|
|
/// 持有数量
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "shares", ColumnDataType = "decimal(18,8)")]
|
|
public decimal Shares { get; set; }
|
|
|
|
/// <summary>
|
|
/// 持仓均价
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "avg_price", ColumnDataType = "decimal(18,4)")]
|
|
public decimal AvgPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// 剩余成本(原始币种)
|
|
/// 用于精确追踪卖出后的剩余成本,避免汇率变化影响成本计算
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "total_cost", ColumnDataType = "decimal(18,4)")]
|
|
public decimal TotalCost { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标的币种
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "currency", Length = 10)]
|
|
public string? Currency { get; set; }
|
|
|
|
/// <summary>
|
|
/// 建仓时间
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "created_at")]
|
|
public DateTime CreatedAt { get; set; }
|
|
|
|
/// <summary>
|
|
/// 最后更新时间
|
|
/// </summary>
|
|
[SugarColumn(ColumnName = "updated_at")]
|
|
public DateTime UpdatedAt { get; set; }
|
|
}
|