可用资金计算修复

This commit is contained in:
吴方海
2025-04-08 21:40:56 +08:00
parent 8f377a4ca3
commit 29dc006050
4 changed files with 13 additions and 104 deletions
@@ -797,41 +797,7 @@ namespace YLErp.Models
/// <summary>
/// 可取资金 (可用资金 - 持仓期权费净额)
/// </summary>
public double DesirableFund
{
get
{
if (PS.Config.Is申万 || PS.Config.Is宏源)
{
return Math.Max(AvailableAmount + FrozenRedeemFunds, 0);
}
else if (PS.Config.Is厦门象屿)
{
return Math.Max(AvailableAmount + FrozenRedeemFunds - Math.Max(FrozenBalance, 0) - Math.Max(-PositionPremiumNetCash, 0), 0);
}
else if (PS.Config.Is国投)
{
return Math.Max(AvailableAmount - TotalCredit, 0);
}
//伴兴 可用资金改为 可用资金=授信额度+期末结存-预付金占用 这里 -TotalCredit 是为了恢复系统默认算法
else if (PS.Config.Is伴兴)
{
return Math.Max(AvailableAmount + FrozenRedeemFunds - Math.Max(-PositionPremiumNetCash, 0) - TotalCredit, 0);
}
else if (PS.Config.Is湘财)
{
return Math.Max(AvailableAmount + FrozenRedeemFunds - TotalCredit, 0);
}
else if (PS.Config.Is东吴)
{
return Math.Max(AmountFund + PayableMargin * DesirableRate, 0);
}
else
{
return Math.Max(AvailableAmount + FrozenRedeemFunds - Math.Max(-PositionPremiumNetCash, 0), 0);
}
}
}
public double DesirableFund { get; set; }
/// <summary>
/// 已了结部分可取资金 (期末结存_权利金后付)
@@ -228,7 +228,9 @@ namespace YLErp.BLL.EodSettlement
}
else
{
data.AvailableAmount = data.AmountFund + data.TotalCredit + data.PayableMargin + data.GuaranteesTotalAmount;
//data.AvailableAmount = data.AmountFund + data.TotalCredit + data.PayableMargin + data.GuaranteesTotalAmount;
var AvailableMoney = data.AmountFund + data.TotalCredit + data.PayableMargin + data.GuaranteesTotalAmount;
data.AvailableAmount = AvailableMoney - data.FrozenMarginMoney;
data.MinusPayableMarginTotal = data.MinusPayableMargin;
data.MarginByPayableMarginTotal = data.MarginByPayableMargin;
}
@@ -238,15 +238,7 @@ namespace YLErp.BLL.Eod
#endregion
item.ValueDate = calcDate;
if (clientFrozenFunds.TryGetValue(item.ClientId, out var clientFrozenFund))
{
item.FreezePremium = clientFrozenFund.FrozenPayableOptionMoney;
item.ReceivablesPremium = clientFrozenFund.FrozenReceivableOptionMoney;
item.FrozenOutFund = clientFrozenFund.OutFunds;
item.FrozenRedeemFunds = clientFrozenFund.RedeemFunds;
//冻结预付金
item.FrozenMarginMoney = clientFrozenFund.FrozenMarginMoney;
}
item.NetFund = item.InFund - item.OutFund;
item.OtherFund = item.InFundOther + item.OutFundOther;
//上日资金余额
@@ -256,68 +248,16 @@ namespace YLErp.BLL.Eod
//当前账号资金
item.AmountFund = item.AmountFund + item.NetFund + item.OtherFund + item.Coupon + item.OptionPremium + item.OptionPremiumSwap + item.SwapBalance + item.SettlementBalance;
//当日可用资金 账户总资金 - 应付冻结权利金 - 冻结出金 - 冻结抵押品赎回 + 应收冻结权利金 - 应付预付金 - 冻结预付金
item.AvailableAmount = item.AmountFund - item.FreezePremium - item.FrozenOutFund - item.FrozenRedeemFunds +
item.ReceivablesPremium + item.PayableMargin - item.FrozenMarginMoney;
item.AvailableAmount = item.AmountFund + item.TotalCredit + item.PayableMargin + item.GuaranteesTotalAmount + item.RoundedPositionPnl - item.FrozenMarginMoney;
item.DesirableFund = item.AvailableAmount;
//预付金余额
item.MarginBalance = item.AmountFund - item.FreezePremium - item.FrozenOutFund - item.FrozenRedeemFunds +
item.ReceivablesPremium + item.GuaranteesTotalAmount;
//判断潜在行权盈余是否计入预付金余额
if (_systemDate.IsPotentialSurplusUseMargin == 1)
{
item.MarginBalance += item.PotentialSurpluses;
item.AvailableAmount += item.PotentialSurpluses;
}
//互换最大可用资金
var marginBalanceSurplus = 0d;
item.CreditCanApplySwap = clientDic.ContainsKey(clientId) ? clientDic[clientId].creditCanApplySwap : false;
//计算追保金额
//是否期权费授信
if (item.IsTradeCredit)
{
//授信是否可用于互换
if (item.CreditCanApplySwap)
{
//期权费授信可以支付权利金 则预付金余额未0时 资金从 互换剔除互换容忍金额
item.Margin = Math.Min(item.MarginBalance + item.TotalCredit + (item.PayableMargin - item.SwapUnMargin), 0);
}
else
{
//互换最大可用资金
marginBalanceSurplus = Math.Max(Math.Min(Math.Max(item.MarginBalance - item.OptionPremiumSwap + item.TotalCredit + (item.PayableMargin - item.SwapPayableMargin), 0), Math.Max(item.MarginBalance - item.OptionPremiumSwap, 0)), 0);
//收益互换追保金额 剩余可支付互换资金 - (互换占用预付金 - 互换容忍预付金额度)
var SwapMargin = Math.Min(marginBalanceSurplus + item.OptionPremiumSwap + (item.SwapPayableMargin - item.SwapUnMargin), 0);
//计算期权追保
item.Margin = Math.Min(item.MarginBalance - item.OptionPremiumSwap + item.TotalCredit + (item.PayableMargin - item.SwapPayableMargin), 0) + SwapMargin;
}
}
else
{
//授信是否可用于互换
if (item.CreditCanApplySwap)
{
//期权费授信不可以支付权力金时
item.Margin = Math.Min(Math.Max(item.MarginBalance, 0) + item.TotalCredit + (item.PayableMargin - item.SwapUnMargin), 0) + Math.Min(item.MarginBalance, 0);
}
else
{
//互换最大可用资金
marginBalanceSurplus = Math.Max(Math.Min(Math.Max(Math.Max(item.MarginBalance - item.OptionPremiumSwap, 0) + item.TotalCredit + (item.PayableMargin - item.SwapUnMargin), 0), Math.Max(item.MarginBalance - item.OptionPremiumSwap, 0)), 0);
//收益互换追保金额 剩余可支付互换资金 - (互换占用预付金 - 互换容忍预付金额度)
var SwapMargin = Math.Min(marginBalanceSurplus + item.OptionPremiumSwap + (item.SwapPayableMargin - item.SwapUnMargin), 0) + Math.Min(marginBalanceSurplus + item.OptionPremiumSwap, 0);
//计算期权追保
item.Margin = Math.Min(Math.Max(item.MarginBalance - item.OptionPremiumSwap, 0) + item.TotalCredit + (item.PayableMargin - item.SwapUnMargin), 0) + Math.Min(item.MarginBalance - item.OptionPremiumSwap, 0) + SwapMargin;
}
}
//可取预付金为预付金余额 - 应缴预付金(上浮 + 0.02)
item.AdvisableMargin = Math.Max(item.MarginBalance + item.PayableMargin * marginMaxRation / marginRation, 0);
@@ -1485,12 +1425,12 @@ namespace YLErp.BLL.Eod
foreach (var itemGroup in flowGroup)
{
var balance = clientBalanceDic[itemGroup.Key.ClientId ?? 0];
string marginType = balance.ClientType == 1 ? "多空组合" : "品种";
//string marginType = balance.ClientType == 1 ? "多空组合" : "品种";
// 获取客户预付金比例设置
var clientMarginTemplate = clientMarginTemplates.FirstOrDefault(x => x.ClientId == itemGroup.Key.ClientId && x.Type == marginType);
var clientMarginTemplate = clientMarginTemplates.FirstOrDefault(x => x.ClientId == itemGroup.Key.ClientId );
if (clientMarginTemplate == null)
{
clientMarginTemplate = clientMarginTemplates.FirstOrDefault(x => x.ClientId == 0 && x.Type == marginType);
clientMarginTemplate = clientMarginTemplates.FirstOrDefault(x => x.ClientId == 0 );
}
// 没有设置预付金比例则跳过
if (clientMarginTemplate == null)
@@ -62,7 +62,7 @@ namespace RealTimeCalcPositionService
var clientSettles = new RealTimeClientBanlanceService(new OptUserInfo(0, "实时客户资金服务", OptUserFrom.Service)).GetBalances();
foreach (var cb in clientSettles)
{
cb.AvailableAmount = cb.AmountFund + cb.TotalCredit + cb.PayableMargin + cb.GuaranteesTotalAmount;
var AvailableMoney = cb.AvailableAmount + cb.FrozenMarginMoney;
Result result = new Result();
try
{
@@ -75,7 +75,8 @@ namespace RealTimeCalcPositionService
DaliyPnl = Math.Round(cb.DaliyPnl, 2),
ClientId = cb.ClientId,
ClientType = cb.ClientType,
Credit = cb.TotalCredit
Credit = cb.TotalCredit,
AvailableMoney = AvailableMoney
};
result.success = true;
result.obj = obj;