59 lines
3.9 KiB
C#
59 lines
3.9 KiB
C#
namespace YLErp.Modules.SwapModule.Margin
|
||
{
|
||
/// <summary>
|
||
/// R2 阶段三 §3.2 可用资金公式(需求拆分 R2 口径,实时/EOD/报告三处共用保证一致)。
|
||
/// 授信额度取 credit.Credit 合计(阶段一 §1.1 已在保存时折算 原始授信值×最大授信可用比例,消费方不再乘比例);
|
||
/// 现金结存 = 期末结存 AmountFund(阶段二起授信不进资金,流水天然不含授信部分,无需排除);
|
||
/// 已使用授信 = 授信出入表 Σ(amount);
|
||
/// 初始保证金(净收取为正)= 应付预付金流水收付净额(平仓返还自动冲减);
|
||
/// 维持保证金(净收取为正)= −MySideMargin(client_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,阶段四 §4.2):−(现金结存 + 授信额度 − 已使用授信)。
|
||
/// 需求原文公式为 现金结存+授信额度−已使用授信(与"交易维度追加保证金"的关系为开放问题2,两值均有产出),
|
||
/// 此处取负对齐字段"正数=应追加"口径:账户透支(现金+授信不足)为正=应补足,盈余为负。
|
||
/// </summary>
|
||
public static double CalcContractDimensionCallMargin(double cashBalance, double totalCredit, double usedCredit)
|
||
{
|
||
return Math.Round(-(cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero);
|
||
}
|
||
}
|
||
}
|