refactor(return-leg): 抽取 MtmCalc 标的端盯市计算

把 SwapEodPositionService 4处重复的 UnderlyingMarketValue 公式和
4处 PosiMtmPnL 公式抽成 MtmCalc 纯函数:
- MarketValue(price, qty, contractSize, shortRatio): 标的市值
- UnrealizedPnl(price, costGrossPrice, qty, contractSize, shortRatio, ratio): 盯市未实现盈亏

原代码4处副本(1731/1813/1898/2101 + 1741/1814/1899/2102)全部替换。
验证: 编译0错误, 全量503测试7失败(基线一致)。
This commit is contained in:
hjhan
2026-08-11 10:45:43 +08:00
parent 59651b802e
commit a26f848287
3 changed files with 78 additions and 8 deletions
@@ -0,0 +1,50 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using YLErp.Modules.SwapModule.ReturnLegs;
namespace UnitTestProject.Modules.SwapModule.ReturnLegs
{
[TestClass]
public class MtmCalcTest
{
[TestMethod]
public void MarketValue_多头_为正()
{
// 标的价100 × 1000张 × 乘数1 × 多头(+1) = 100000
Assert.AreEqual(100_000m, MtmCalc.MarketValue(100m, 1000m, 1m, 1));
}
[TestMethod]
public void MarketValue_空头_为负()
{
// 空头 shortRatio=-1
Assert.AreEqual(-100_000m, MtmCalc.MarketValue(100m, 1000m, 1m, -1));
}
[TestMethod]
public void MarketValue_合约乘数10()
{
Assert.AreEqual(1_000_000m, MtmCalc.MarketValue(100m, 1000m, 10m, 1));
}
[TestMethod]
public void UnrealizedPnl_多头浮盈()
{
// (105-100) × 1000 × 1 × 1 × 1 = 5000
Assert.AreEqual(5000m, MtmCalc.UnrealizedPnl(105m, 100m, 1000m, 1m, 1, 1m));
}
[TestMethod]
public void UnrealizedPnl_多头浮亏()
{
// (95-100) × 1000 × 1 × 1 × 1 = -5000
Assert.AreEqual(-5000m, MtmCalc.UnrealizedPnl(95m, 100m, 1000m, 1m, 1, 1m));
}
[TestMethod]
public void UnrealizedPnl_空头反向()
{
// 空头: 价格跌=盈利 (95-100) × 1000 × 1 × (-1) × 1 = 5000
Assert.AreEqual(5000m, MtmCalc.UnrealizedPnl(95m, 100m, 1000m, 1m, -1, 1m));
}
}
}