feat(swap): 添加基金现金分红处理功能

- 实现 ApplyFundCashDividends 方法处理基金现金分红逻辑
- 现金分红在生效日 EOD 即执行,计入已实现分红字段
- 从盯市盈亏中分离分红金额,避免收益重复计算
- 更新测试用例验证现金分红正确记入已实现分红
- 修正测试方法名称反映实际功能变更
- 完善单元测试验证分红金额计算准确性
This commit is contained in:
张名锐
2026-08-18 15:43:11 +08:00
parent aa1a13d7a3
commit ddf233678d
2 changed files with 90 additions and 10 deletions
@@ -107,6 +107,11 @@ namespace YLErp.Modules.SwapModule
flowEvents,
dividendInfos.ToDictionary(x => x.UnderlyingCode, StringComparer.OrdinalIgnoreCase),
SettleDate);
ApplyFundCashDividends(
positions,
previousEodPositions,
dividendInfos.ToDictionary(x => x.UnderlyingCode, StringComparer.OrdinalIgnoreCase),
SettleDate);
}
}
@@ -327,7 +332,7 @@ namespace YLErp.Modules.SwapModule
}
[TestMethod]
public void SPC_FUND_002_现金分红_只调整价格不生成分红流水()
public void SPC_FUND_002_现金分红_收盘时记入已实现分红()
{
var td = CreateTrade();
var position = CreateFloatPosition(1, 1000m);
@@ -342,22 +347,20 @@ namespace YLErp.Modules.SwapModule
new List<swap_flow_event>(),
price: 100m);
service.ExDividendInfos.Add(CreateFundCorporateAction(cashAmount: 10m));
var actual = previousEod.Clone();
actual.ValueDate = SettleDate;
actual.UnderlyingPrice = 100m;
service.ExecuteSwapPositionCompose(SettleDate, PreSettleDate);
service.ExecuteFundCorporateActions(
new[] { actual },
new[] { previousEod },
Array.Empty<swap_flow_event>(),
service.ExDividendInfos);
var actual = service.CreatedEodPositions.Single(x => x.PositionId == 1);
Assert.AreEqual(1000m, actual.PosiQuantity);
Assert.AreEqual(0m, actual.TdChangedQty);
Assert.AreEqual(99m, actual.PosiGrossPrice);
Assert.AreEqual(0m, actual.TdPosiDividend);
Assert.AreEqual(1000m, actual.TdPosiDividend);
Assert.AreEqual(0m, actual.PosiDividendSum);
Assert.AreEqual(99000m, actual.PosiNotionalValue);
Assert.AreEqual(0m, actual.PosiMtmPnL);
Assert.AreEqual(0m, actual.PosiProfitSum);
Assert.AreEqual(1000m, actual.RealizedDividend);
Assert.AreEqual(1000m, actual.RealizedPnl);
}
[TestMethod]