Bugfix 累加预付金的问题
This commit is contained in:
@@ -94,6 +94,23 @@ namespace YLErp.Modules.SwapModule
|
||||
Assert.AreEqual(20, day3, 1e-6);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 授信垫付的初始预付金计入已缴(2026-08-27 修正,交易2538实证):
|
||||
/// 初始预付金走授信腿不产生应付预付金流水(现金净收额=0),已缴初始=授信初始占用净额——
|
||||
/// 目标追加 = 维持 −(现金净收额+初始授信占用净额),否则每个结算日按维持全额重复开追加。
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
public void AM_009_授信初始预付金计入已缴_不重复追加()
|
||||
{
|
||||
//交易2538 首日实际数据:维持2,808,000;初始预付金2,000,000全走授信(现金净收额0)
|
||||
var payableNetCash = 0d;
|
||||
var initCreditNet = 2_000_000d;
|
||||
var target = SwapAdditionalMarginCalc.CalcTarget(2_808_000, payableNetCash + initCreditNet);
|
||||
Assert.AreEqual(808_000, target, 1e-6);
|
||||
|
||||
//对照:修正前只扣现金净收额 → 目标2,808,000 全额追加(多收2,000,000 授信占用,即本BUG)
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 追保回落(维持下降到应付之下)不返还:目标为 0 → 已补足保持,新增 0;
|
||||
/// 超付部分由可用资金公式的负缺口(Σ维持−累计)体现,不产生返还记录。
|
||||
|
||||
@@ -131,6 +131,55 @@ namespace YLErp.Modules.SwapModule
|
||||
Assert.AreSame(tiers[3], SwapSpanMarginCalc.MatchTier(tiers, false, 2.00));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 层间空隙不落最深层(2026-08-27 修正,交易2538实证):
|
||||
/// 真实模板空头档位 (−∞,0.99]∪(1.00,1.03],(0.99,1.00] 为价格在期初附近小幅波动的"未触发追保"空隙——
|
||||
/// 此前兜底一律按最深层计,ratio≈0.99999 被错误收取最深档(0.04×基数)。
|
||||
/// 修正后:空隙返回 null(追加保证金按0);仅穿出最深层边界(ratio>最深上界)才按最深层计。
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
public void SS_008_空头层间空隙_不落最深层_追加为零()
|
||||
{
|
||||
//模板"保证金测试01"实际配置形态:第1层 (−∞,0.99],第2~4层 (1.00,1.03]
|
||||
var tiers = new List<SpanTierConfig>
|
||||
{
|
||||
Tier(null, 0.99, 0.01),
|
||||
Tier(1.00, 1.01, 0.02),
|
||||
Tier(1.01, 1.02, 0.03),
|
||||
Tier(1.02, 1.03, 0.04),
|
||||
};
|
||||
//交易2538 08-24:净价100 → ratio = 100/100.0011 ≈ 0.99999 落 (0.99,1.00] 空隙 → 不追保
|
||||
Assert.IsNull(SwapSpanMarginCalc.MatchTier(tiers, false, 0.99999));
|
||||
Assert.IsNull(SwapSpanMarginCalc.MatchTier(tiers, false, 0.995));
|
||||
//空隙边界归第1层
|
||||
Assert.AreSame(tiers[0], SwapSpanMarginCalc.MatchTier(tiers, false, 0.99));
|
||||
//空隙上方正常落档
|
||||
Assert.AreSame(tiers[1], SwapSpanMarginCalc.MatchTier(tiers, false, 1.005));
|
||||
Assert.AreSame(tiers[2], SwapSpanMarginCalc.MatchTier(tiers, false, 1.015));
|
||||
Assert.AreSame(tiers[3], SwapSpanMarginCalc.MatchTier(tiers, false, 1.025));
|
||||
//穿出最深层上界 → 按最深层计(原有语义不变)
|
||||
Assert.AreSame(tiers[3], SwapSpanMarginCalc.MatchTier(tiers, false, 1.0301));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 多头层间空隙同理:空隙返回 null(追加0),仅跌破最深层下界才按最深层计。
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
public void SS_009_多头层间空隙_不落最深层()
|
||||
{
|
||||
var tiers = new List<SpanTierConfig>
|
||||
{
|
||||
Tier(0.98, null, 0.01),
|
||||
Tier(0.96, 0.97, 0.03), //留出 (0.97,0.98) 空隙
|
||||
Tier(0.95, 0.96, 0.04),
|
||||
};
|
||||
Assert.IsNull(SwapSpanMarginCalc.MatchTier(tiers, true, 0.975));
|
||||
Assert.AreSame(tiers[1], SwapSpanMarginCalc.MatchTier(tiers, true, 0.9699));
|
||||
Assert.AreSame(tiers[2], SwapSpanMarginCalc.MatchTier(tiers, true, 0.955));
|
||||
//穿出最深层下界 → 按最深层计(原有语义不变)
|
||||
Assert.AreSame(tiers[2], SwapSpanMarginCalc.MatchTier(tiers, true, 0.94));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SS_008_无可用层_返回null()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user