更新合约维度追保金额计算逻辑

This commit is contained in:
锦麟 王
2026-08-28 13:31:05 +08:00
parent 821d984ef8
commit 07dd3e8eb5
5 changed files with 58 additions and 18 deletions
@@ -6,7 +6,8 @@ namespace YLErp.Modules.SwapModule
/// R2 阶段三 §3.2 可用资金/追保/可取资金公式测试(定稿 2026-08-28 口径,实时/EOD/报告三处共用 SwapSpanBalanceCalc):
/// 客户维度可用 = Max(现金结存 + 授信 − 已使用授信 + 初始保证金 − 维持保证金, 0);
/// 合约维度可用 = Max(现金结存 + 授信 − 已使用授信, 0)(定稿删除"−交易维度追加保证金",避免与现金结存/已使用授信双重扣减);
/// 追保金额两维度均 Max(...,0) 截断、恒 ≥ 0(只追不退);
/// 追保金额两维度均 Max(...,0) 截断、恒 ≥ 0(只追不退);合约维度(2026-08-28 调整)= 当日追加保证金现金部分合计
/// (不与现金结存轧差、闲置现金不冲抵、授信不追),客户维度 = Max((维持−初始) − (现金+授信−已使用), 0);
/// 可取资金只算现金部分:合约维度 = Max(现金结存 + min(持仓盈亏,0), 0),客户维度 = Max(现金结存 + 初始 − 维持 + min(持仓盈亏,0), 0)。
/// 授信额度为 credit.Credit 合计(保存时已折算比例),现金结存=期末结存(阶段二起授信不进资金)。
/// </summary>
@@ -99,22 +100,23 @@ namespace YLErp.Modules.SwapModule
}
/// <summary>
/// 合约维度追保金额(Max((现金+授信−已使用)×−1, 0)):账户透支为正=应补足,盈余截断为 0。
/// 合约维度追保金额(2026-08-28 新口径):当日产生的追加保证金现金部分合计,不与现金结存轧差、
/// 闲置现金不冲抵、授信部分不追;Max(...,0) 兜底截断(正常无负记录,追保回落不返还)。
/// </summary>
[TestMethod]
public void SB_013_合约维度追保金额_透支为正()
public void SB_013_合约维度追保金额_当日现金追加全额()
{
//现金−80 + 授信100 − 已使用30 = −10 → 追保 = 10(应补足)
Assert.AreEqual(10, SwapSpanBalanceCalc.CalcContractDimensionCallMargin(
cashBalance: -80, totalCredit: 100, usedCredit: 30), 1e-6);
//场景:入金60万、现金初保50万(闲置10万),当日需追加40万(现金)——
//旧口径缺口法追 30万(闲置现金被冲抵);新口径追当日现金追加全额 40万
Assert.AreEqual(400000, SwapSpanBalanceCalc.CalcContractDimensionCallMargin(400000), 1e-6);
}
[TestMethod]
public void SB_014_合约维度追保金额_盈余截断为0()
public void SB_014_合约维度追保金额_无当日追加为0()
{
//现金50 + 授信100 已使用20 = 130 → 盈余,Max(...,0) 截断 → 追保 = 0
Assert.AreEqual(0, SwapSpanBalanceCalc.CalcContractDimensionCallMargin(
cashBalance: 50, totalCredit: 100, usedCredit: 20), 1e-6);
//当日追加全走授信(无现金流水)/当日无追保 → 0;负值兜底截断为 0
Assert.AreEqual(0, SwapSpanBalanceCalc.CalcContractDimensionCallMargin(0), 1e-6);
Assert.AreEqual(0, SwapSpanBalanceCalc.CalcContractDimensionCallMargin(-100), 1e-6);
}
/// <summary>