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

81 lines
5.3 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);
/// 初始保证金(净收取为正)= 初始预付金的和 = 应付预付金流水收付净额 + 初始预付金授信占用净额(2026-08-28 业务裁定:与页面"初始保证金金额"字段同口径);
/// 维持保证金(净收取为正)= 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)(定稿 2026-08-28:删除"−交易维度追加保证金"——
/// 每日追保落账后现金部分已进现金结存、授信部分已进已使用授信,再减属双重扣减)。
/// </summary>
public static double CalcContractDimensionAvailable(double cashBalance, double totalCredit, double usedCredit)
{
return Math.Max(cashBalance + totalCredit - usedCredit, 0);
}
/// <summary>
/// 追保金额(客户维度,MarginWatchRule=1,定稿 2026-08-28Max(...,0) 截断,恒 ≥ 0,只追不退):
/// Max((维持保证金 − 初始保证金) − (现金结存 + 授信额度 − 已使用授信), 0),正=需追保;
/// 资金富余时为 0(富余状态由可用资金/可取资金为正表达)。
/// 即客户维度可用资金公式反向值的 Max 截断——与需求原文"现金结存+授信额度−(维持−初始)"数值互为相反数,
/// 此处按 MarginByPayableMarginTotal 字段既有口径(正数=应追加,估值报告"应追加预付金X元")定向。
/// </summary>
public static double CalcClientDimensionCallMargin(double cashBalance, double totalCredit, double usedCredit,
double initialMargin, double maintenanceMargin)
{
return Math.Max(Math.Round(maintenanceMargin - initialMargin - (cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero), 0);
}
/// <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);
}
/// <summary>
/// 可取资金(客户维度,MarginWatchRule=1,定稿 2026-08-28 新增):
/// Max(现金结存 + 初始保证金 − 维持保证金 + min(持仓盈亏, 0), 0)。
/// 可用资金含授信但授信不可取现,可取资金只算现金部分;min(持仓盈亏,0) 只扣未实现亏损、浮盈不放行;
/// 客户维度追保不产生现金流,需显式叠加保证金约束(+初始−维持)。
/// initialMargin/maintenanceMargin 均为净收取为正。
/// </summary>
public static double CalcClientDimensionDesirableFund(double cashBalance, double initialMargin,
double maintenanceMargin, double positionPnl)
{
return Math.Max(cashBalance + initialMargin - maintenanceMargin + Math.Min(positionPnl, 0), 0);
}
/// <summary>
/// 可取资金(合约维度,MarginWatchRule=0,定稿 2026-08-28 新增):
/// Max(现金结存 + min(持仓盈亏, 0), 0)。
/// 合约维度追保已通过资金记录反映在现金结存中,无需再叠加保证金约束。
/// </summary>
public static double CalcContractDimensionDesirableFund(double cashBalance, double positionPnl)
{
return Math.Max(cashBalance + Math.Min(positionPnl, 0), 0);
}
}
}