#EQD-7194 估值报告页面:追报金额,可取资金,可用资金不正确
This commit is contained in:
@@ -387,8 +387,9 @@ namespace YLErp.BLL.EodSettlement
|
||||
// 未配置(MarginWatchRule=NULL,存量客户)维持旧口径:期末结存-追保账户余额
|
||||
if (client?.MarginWatchRule == 0)
|
||||
{
|
||||
//定稿 2026-08-28:Max(现金结存 + 授信额度 − 已使用授信, 0),不再减交易维度追加保证金(避免双重扣减)
|
||||
balance.AvailableAmount = SwapSpanBalanceCalc.CalcContractDimensionAvailable(
|
||||
balance.AmountFund, balance.TotalCredit, balance.UsedCredit, balance.SwapAdditionalMarginTotal);
|
||||
balance.AmountFund, balance.TotalCredit, balance.UsedCredit);
|
||||
}
|
||||
else if (client?.MarginWatchRule == 1)
|
||||
{
|
||||
@@ -401,8 +402,8 @@ namespace YLErp.BLL.EodSettlement
|
||||
{
|
||||
balance.AvailableAmount = balance.MarginBalance - (balance.VmInFundSum - balance.VmOutFundSum);
|
||||
}
|
||||
// 是否追保/追保金额(阶段四 §4.2 按维度分流,允许负值=双向,不以 0 截断):
|
||||
// 客户维度(==1)= (维持−初始) − (现金+授信−已使用),负=可返还;
|
||||
// 是否追保/追保金额(按维度分流,定稿 2026-08-28 起均 Max(...,0) 截断、恒 ≥ 0,只追不退):
|
||||
// 客户维度(==1)= Max((维持−初始) − (现金+授信−已使用), 0);
|
||||
// 合约维度(==0)= Max(−(现金+授信−已使用), 0)(需求原文公式,盈余截断为 0);
|
||||
// 未配置(NULL 存量)维持旧口径:盯市低于维持时 = 初始保证金金额−盯市金额,否则 0
|
||||
if (client?.MarginWatchRule == 1)
|
||||
@@ -422,8 +423,24 @@ namespace YLErp.BLL.EodSettlement
|
||||
balance.NeedAddMargin = balance.SwapMarketAmount < balance.MaintenanceMargin;
|
||||
balance.MarginByPayableMarginTotal = balance.NeedAddMargin ? (balance.MySideMargin - balance.SwapMarketAmount) : 0;
|
||||
}
|
||||
// 可取资金=Math.Max(期末结存-min(持仓盈亏,0)-初始保证金,0)
|
||||
balance.DesirableFund = Math.Max(balance.MarginBalance + Math.Min(balance.RoundedPositionPnl, 0), 0);
|
||||
// 可取资金(定稿 2026-08-28 分维度口径,只算现金部分——授信不可取现;min(持仓盈亏,0) 只扣浮亏、浮盈不放行):
|
||||
// 合约维度(==0)= Max(现金结存 + min(持仓盈亏,0), 0)(追保已落账进现金结存,无需再叠加保证金约束);
|
||||
// 客户维度(==1)= Max(现金结存 + 初始保证金 − 维持保证金 + min(持仓盈亏,0), 0)(追保不产现金流,显式叠加保证金约束);
|
||||
// 未配置(NULL 存量)维持旧口径
|
||||
if (client?.MarginWatchRule == 0)
|
||||
{
|
||||
balance.DesirableFund = SwapSpanBalanceCalc.CalcContractDimensionDesirableFund(
|
||||
balance.AmountFund, balance.RoundedPositionPnl);
|
||||
}
|
||||
else if (client?.MarginWatchRule == 1)
|
||||
{
|
||||
balance.DesirableFund = SwapSpanBalanceCalc.CalcClientDimensionDesirableFund(
|
||||
balance.AmountFund, balance.SwapInitMargin, -balance.MySideMargin, balance.RoundedPositionPnl);
|
||||
}
|
||||
else
|
||||
{
|
||||
balance.DesirableFund = Math.Max(balance.MarginBalance + Math.Min(balance.RoundedPositionPnl, 0), 0);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,8 +286,9 @@ namespace YLErp.BLL.Eod
|
||||
var ruleClient = DataCacheProvider.GetClientDataSource().GetData(clientId);
|
||||
if (ruleClient?.MarginWatchRule == 0)
|
||||
{
|
||||
//定稿 2026-08-28:Max(现金结存 + 授信额度 − 已使用授信, 0),不再减交易维度追加保证金(避免双重扣减)
|
||||
item.AvailableAmount = SwapSpanBalanceCalc.CalcContractDimensionAvailable(
|
||||
item.AmountFund, item.TotalCredit, item.UsedCredit, item.SwapAdditionalMarginTotal);
|
||||
item.AmountFund, item.TotalCredit, item.UsedCredit);
|
||||
}
|
||||
else if (ruleClient?.MarginWatchRule == 1)
|
||||
{
|
||||
@@ -300,8 +301,8 @@ namespace YLErp.BLL.Eod
|
||||
{
|
||||
item.AvailableAmount = item.MarginBalance - item.FrozenMarginMoney;
|
||||
}
|
||||
// 是否追保/追保金额(按维度分流,与 ClientBalanceUtility 报告口径一致):
|
||||
// 客户维度(==1)双向追保 = (维持−初始) − (现金+授信−已使用),允许负值(负=可返还);
|
||||
// 是否追保/追保金额(按维度分流,与 ClientBalanceUtility 报告口径一致,定稿 2026-08-28 起均 Max(...,0) 截断):
|
||||
// 客户维度(==1)= Max((维持−初始) − (现金+授信−已使用), 0);
|
||||
// 合约维度(==0)= Max(−(现金+授信−已使用), 0),盈余截断为 0;NULL 存量维持旧口径
|
||||
if (ruleClient?.MarginWatchRule == 1)
|
||||
{
|
||||
@@ -322,8 +323,24 @@ namespace YLErp.BLL.Eod
|
||||
// 追保金额=初始保证金金额-盯市金额
|
||||
item.MarginByPayableMarginTotal = item.NeedAddMargin ? (item.MySideMargin - item.SwapMarketAmount) : 0;
|
||||
}
|
||||
// 可取资金=max(期末结存+min(持仓盈亏,0)-初始保证金,0)
|
||||
item.DesirableFund =Math.Max( item.MarginBalance - item.FrozenMarginMoney + Math.Min(item.RoundedPositionPnl, 0),0);
|
||||
// 可取资金(定稿 2026-08-28 分维度口径,只算现金部分;min(持仓盈亏,0) 只扣浮亏、浮盈不放行):
|
||||
// 合约维度(==0)= Max(现金结存 + min(持仓盈亏,0), 0);
|
||||
// 客户维度(==1)= Max(现金结存 + 初始保证金 − 维持保证金 + min(持仓盈亏,0), 0);
|
||||
// NULL 存量维持旧口径(含冻结保证金扣减)
|
||||
if (ruleClient?.MarginWatchRule == 0)
|
||||
{
|
||||
item.DesirableFund = SwapSpanBalanceCalc.CalcContractDimensionDesirableFund(
|
||||
item.AmountFund, item.RoundedPositionPnl);
|
||||
}
|
||||
else if (ruleClient?.MarginWatchRule == 1)
|
||||
{
|
||||
item.DesirableFund = SwapSpanBalanceCalc.CalcClientDimensionDesirableFund(
|
||||
item.AmountFund, item.SwapInitMargin, -item.MySideMargin, item.RoundedPositionPnl);
|
||||
}
|
||||
else
|
||||
{
|
||||
item.DesirableFund = Math.Max(item.MarginBalance - item.FrozenMarginMoney + Math.Min(item.RoundedPositionPnl, 0), 0);
|
||||
}
|
||||
}
|
||||
|
||||
return _clientBalanceDic.Values;
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace YLErp.Modules.SwapModule.Margin
|
||||
/// 授信额度取 credit.Credit 合计(阶段一 §1.1 已在保存时折算 原始授信值×最大授信可用比例,消费方不再乘比例);
|
||||
/// 现金结存 = 期末结存 AmountFund(阶段二起授信不进资金,流水天然不含授信部分,无需排除);
|
||||
/// 已使用授信 = 授信出入表 Σ(amount);
|
||||
/// 初始保证金(净收取为正)= 应付预付金流水收付净额(平仓返还自动冲减);
|
||||
/// 初始保证金(净收取为正)= 初始预付金的和 = 应付预付金流水收付净额 + 初始预付金授信占用净额(2026-08-28 业务裁定:与页面"初始保证金金额"字段同口径);
|
||||
/// 维持保证金(净收取为正)= −MySideMargin(client_span 维持保证金写入 trade_span 后经 CalcClientMargin 反号聚合)。
|
||||
/// 公式整体待业务校验(EQD-6948),参数化集中在此便于校验后调整。
|
||||
/// </summary>
|
||||
@@ -24,25 +24,25 @@ namespace YLErp.Modules.SwapModule.Margin
|
||||
|
||||
/// <summary>
|
||||
/// 可用资金(合约维度,MarginWatchRule=0):
|
||||
/// Max(现金结存 + 授信额度 − 已使用授信 − 交易维度追加保证金合计, 0);
|
||||
/// 交易维度追加保证金合计 = Σ(维持保证金 − 累计保证金)(阶段三:累计=应付预付金净额;阶段四含追加保证金流水)。
|
||||
/// Max(现金结存 + 授信额度 − 已使用授信, 0)(定稿 2026-08-28:删除"−交易维度追加保证金"——
|
||||
/// 每日追保落账后现金部分已进现金结存、授信部分已进已使用授信,再减属双重扣减)。
|
||||
/// </summary>
|
||||
public static double CalcContractDimensionAvailable(double cashBalance, double totalCredit, double usedCredit,
|
||||
double tradeAdditionalMarginSum)
|
||||
public static double CalcContractDimensionAvailable(double cashBalance, double totalCredit, double usedCredit)
|
||||
{
|
||||
return Math.Max(cashBalance + totalCredit - usedCredit - tradeAdditionalMarginSum, 0);
|
||||
return Math.Max(cashBalance + totalCredit - usedCredit, 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 追保金额(客户维度,MarginWatchRule=1,阶段四 §4.2 双向——不以 0 截断):
|
||||
/// (维持保证金 − 初始保证金) − (现金结存 + 授信额度 − 已使用授信),正=需追保、负=可返还。
|
||||
/// 即客户维度可用资金公式的反向值(去 Max 截断)——与需求原文"现金结存+授信额度−(维持−初始)"数值互为相反数,
|
||||
/// 追保金额(客户维度,MarginWatchRule=1,定稿 2026-08-28:Max(...,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.Round(maintenanceMargin - initialMargin - (cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero);
|
||||
return Math.Max(Math.Round(maintenanceMargin - initialMargin - (cashBalance + totalCredit - usedCredit), 2, MidpointRounding.AwayFromZero), 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -53,5 +53,28 @@ namespace YLErp.Modules.SwapModule.Margin
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user