Files
zszq-trs/YLErpDAL/Modules/SwapModule/Margin/SwapSpanBalanceCalc.cs
T

58 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace YLErp.Modules.SwapModule.Margin
{
/// <summary>
/// R2 阶段三 §3.2 可用资金公式(需求拆分 R2 口径,实时/EOD/报告三处共用保证一致)。
/// 授信额度取 credit.Credit 合计(阶段一 §1.1 已在保存时折算 原始授信值×最大授信可用比例,消费方不再乘比例);
/// 现金结存 = 期末结存 AmountFund(阶段二起授信不进资金,流水天然不含授信部分,无需排除);
/// 已使用授信 = 授信出入表 Σ(amount);
/// 初始保证金(净收取为正)= 应付预付金流水收付净额(平仓返还自动冲减);
/// 维持保证金(净收取为正)= MySideMarginclient_span 维持保证金写入 trade_span 后经 CalcClientMargin 反号聚合)。
/// 公式整体待业务校验(EQD-6948),参数化集中在此便于校验后调整。
/// </summary>
public static class SwapSpanBalanceCalc
{
/// <summary>
/// 可用资金(客户维度,MarginWatchRule=1):
/// Max(现金结存 + 授信额度 − 已使用授信 + 初始保证金 − 维持保证金, 0)(现金结存已扣初始保证金,故加回)。
/// maintenanceMargin/initialMargin 均为净收取为正;未配置维度的存量客户不走本公式(调用方保证)。
/// </summary>
public static double CalcClientDimensionAvailable(double cashBalance, double totalCredit, double usedCredit,
double initialMargin, double maintenanceMargin)
{
return Math.Max(cashBalance + totalCredit - usedCredit + initialMargin - maintenanceMargin, 0);
}
/// <summary>
/// 可用资金(合约维度,MarginWatchRule=0):
/// Max(现金结存 + 授信额度 − 已使用授信 − 交易维度追加保证金合计, 0);
/// 交易维度追加保证金合计 = Σ(维持保证金 − 累计保证金)(阶段三:累计=应付预付金净额;阶段四含追加保证金流水)。
/// </summary>
public static double CalcContractDimensionAvailable(double cashBalance, double totalCredit, double usedCredit,
double tradeAdditionalMarginSum)
{
return Math.Max(cashBalance + totalCredit - usedCredit - tradeAdditionalMarginSum, 0);
}
/// <summary>
/// 追保金额(客户维度,MarginWatchRule=1,阶段四 §4.2 双向——不以 0 截断):
/// (维持保证金 − 初始保证金) − (现金结存 + 授信额度 − 已使用授信),正=需追保、负=可返还。
/// 即客户维度可用资金公式的反向值(去 Max 截断)——与需求原文"现金结存+授信额度−(维持−初始)"数值互为相反数,
/// 此处按 MarginByPayableMarginTotal 字段既有口径(正数=应追加,估值报告"应追加预付金X元")定向。
/// </summary>
public static double CalcClientDimensionCallMargin(double cashBalance, double totalCredit, double usedCredit,
double initialMargin, double maintenanceMargin)
{
return Math.Round(maintenanceMargin - initialMargin - (cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 追保金额(合约维度,MarginWatchRule=0):Max((现金结存 + 授信额度 − 已使用授信), 0)。
/// 即需求原文公式 Max((现金结存+授信额度−已使用授信)×−1, 0):账户透支(现金+授信不足)为正=应补足,盈余截断为 0(不展示负数)。
/// </summary>
public static double CalcContractDimensionCallMargin(double cashBalance, double totalCredit, double usedCredit)
{
return Math.Max(Math.Round(-(cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero), 0);
}
}
}