Files
zszq-trs/Framework/YLErp.Core/Models/ClientSettleBalance.cs
T

1110 lines
38 KiB
C#

using Qdp.Foundation.Utilities;
using System.ComponentModel.DataAnnotations.Schema;
using YLErp.DBModels;
namespace YLErp.Models
{
/// <summary>
/// 客户结算对象
/// </summary>
public class ClientSettleBalance
{
/// <summary>
/// 客户编号
/// </summary>
public int ClientId { get; set; }
/// <summary>
/// 互换交易类别(0:非DMA,1;DMA)
/// </summary>
public int ClientType { get; set; }
[NotMapped]
public string ClientTypeStr
{
get
{
if (ClientType == 1)
{
return "定义文件";
}
return "普通";
}
}
/// <summary>
/// 客户编号
/// </summary>
public string ClientNumber { get; set; }
public string ClientName { get; set; }
/// <summary>
/// 日期
/// </summary>
public DateTime? ValueDate { get; set; }
/// <summary>
/// 当日应付冻结权利金 绝对值
/// </summary>
public double FreezePremium { get; set; }
/// <summary>
/// 冻结出金 绝对值
/// </summary>
public double FrozenOutFund { get; set; }
/// <summary>
/// 冻结抵押品赎回
/// </summary>
public double FrozenRedeemFunds { get; set; }
/// <summary>
/// 当日期权费收支
/// </summary>
public double OptionPremium { get; set; }
/// <summary>
/// 当日期权费收支 -- 互换
/// </summary>
public double OptionPremiumSwap { get; set; }
/// <summary>
/// 当日结算收支
/// </summary>
public double SettlementBalance { get; set; }
/// <summary>
/// 当日平仓收支
/// </summary>
public double UnwindBalance { get; set; }
/// <summary>
/// 当日互换收益
/// </summary>
public double SwapBalance { get; set; }
/// <summary>
/// 当日了结收支 SettlementBalance + SwapBalance
/// </summary>
public double ToEndBalance
{
get
{
return SettlementBalance + SwapBalance + Coupon;
}
}
/// <summary>
/// 权利金总和 -- 和开始时间无关 -- 国投
/// </summary>
public double OptionPremiumAndSwapSum { get; set; }
/// <summary>
/// 了结权利金总和 -- 和开始时间无关-- 国投
/// </summary>
public double EndPremiumSum { get; set; }
public double EodPremium
{
get
{
return PositionPnl - PositionPv;
}
}
/// <summary>
/// 本日权利金收支(新增字段):当日该客户的权利金收支+平仓收支
/// </summary>
public double OptionPremiumAndUnwindBalance
{
get
{
return OptionPremium + OptionPremiumSwap + UnwindBalance;
}
}
public double OptionPremiumAndUnwindBalanceTotal { get; set; }
/// <summary>
/// 当日行权收支
/// </summary>
public double ExerciseBalance { get; set; }
/// <summary>
/// 当日新增权利金
/// </summary>
public double TodayNewMargin { get; set; }
/// <summary>
/// 当日应收冻结权利金
/// </summary>
public double ReceivablesPremium { get; set; }
/// <summary>
/// 当日资金净出入
/// </summary>
public double NetFund { get; set; }
/// <summary>
/// 其他收支
/// </summary>
public double OtherFund { get; set; }
/// <summary>
/// 当日入金
/// </summary>
public double InFund { get; set; }
public double VmInFund { get; set; }
/// <summary>
/// 总入金
/// </summary>
public double InFundSum { get; set; }
/// <summary>
/// 追保总入金
/// </summary>
public double VmInFundSum { get; set; }
/// <summary>
///追保账户金额
/// </summary>
public double VmFundSum { get { return VmInFundSum-VmOutFundSum; } }
/// <summary>
/// 总出入金金额
/// </summary>
public double NetFundAll { get { return NetFund+VmFundSum; } }
/// <summary>
/// 当日出金
/// 为绝对值,即不包含出金方向
/// </summary>
public double OutFund { get; set; }
public double VmOutFund { get; set; }
/// <summary>
/// 总出金
/// </summary>
public double OutFundSum { get; set; }
/// <summary>
/// 追保总出金
/// </summary>
public double VmOutFundSum { get; set; }
/// <summary>
/// 票息
/// </summary>
public double Coupon { get; set; }
/// <summary>
/// 期末结存(不包含抵押品价值)
/// </summary>
public double AmountFund { get; set; }
/// <summary>
/// 账户资金(包含抵押品价值)
/// </summary>
public double AmountFundWithProduct
{
get { return AmountFund + GuaranteesTotalAmount; }
}
/// <summary>
/// 市值权益 (账户资金+持仓盈亏)
/// </summary>
public double AmountFundWithPositionPnl
{
get
{
return AmountFund + (PS.Config.IsPVRounded ? RoundedPositionPv : PositionPv);
}
}
/// <summary>
/// 今日可用资金(可为负)
/// 国投:可用资金=授信额度+期末结存-预付金占用
/// 伴兴:在系统可用资金的基础上 + 授信额度
/// </summary>
public double AvailableAmount
{
get
{
return _AvailableAmount;
}
set
{
_AvailableAmount = value;
}
}
/// <summary>
/// 已使用授信(R2/R4,阶段三 §3.2):授信出入表 client_credit_inout 按 Σ(amount) 汇总(与资金流水同号口径),
/// 估值报告展示与可用资金公式共用。
/// </summary>
public double UsedCredit { get; set; }
/// <summary>
/// 互换初始保证金(R2,阶段三 §3.2,净收取为正):客户 应付预付金 流水收付净额(平仓返还自动冲减)。
/// </summary>
public double SwapInitMargin { get; set; }
/// <summary>
/// 交易维度追加保证金合计(R2/R3 合约维度公式输入):Σ(维持保证金 − 累计保证金),
/// 累计保证金=该交易 应付预付金+追加保证金 流水收付净额;阶段四产生追加保证金资金记录后口径自然完整。
/// </summary>
public double SwapAdditionalMarginTotal { get; set; }
private double _AvailableAmount;
/// <summary>
/// 交易总额
/// </summary>
public double TotalTradeAmount { get; set; }
/// <summary>
/// 授信额度
/// </summary>
public double TotalCredit { get; set; }
/// <summary>
/// 原始授信额度(展示用:credit 表 Σ(OriginalCredit ?? Credit),未经 MaxCreditUseRatio 折算;
/// TotalCredit 仍是折算后值,供可用资金/追保公式使用)
/// </summary>
public double OriginalTotalCredit { get; set; }
/// <summary>
/// 用户可用的名义本金规模
/// </summary>
public double TotalCreditStockEqvNotional { get; set; }
/// <summary>
/// 授信占用
/// </summary>
public double CreditUsed
{
get
{
// 国投,伴兴:当前可用资金加过授信额度
if (PS.Config.Is伴兴 || PS.Config.Is湘财 || PS.Config.Is国投)
{
//授信是否可用于互换(互换的权利金目前是可以被支付的,可能后面还需设计改进)
if (CreditCanApplySwap)
{
return TotalCredit > 0 ? Math.Min(Math.Max(-(AvailableAmount - TotalCredit) / TotalCredit, 0.0), 1) : 0.0;
}
else
{
//优先支付收益互换资金剩余,取小于0的部分则为互换预付金超出可用资金部分,可用资金减除 则为期权占用授信部分,Math.Min((AvailableAmount - PayableMargin) + SwapPayableMargin, 0)
//如果为正 则资金有限抵扣预付金,预付金未完全抵扣部分计算占用授信百分比
return TotalCredit > 0 ? Math.Min(Math.Max(-((AvailableAmount - TotalCredit) - Math.Min(SwapPayableMargin, 0)) / TotalCredit, 0.0), 1) : 0.0;
}
}
//授信是否可用于支付权利金
else if (IsTradeCredit)
{
//授信是否可用于互换(互换的权利金目前是可以被支付的,可能后面还需设计改进)
if (CreditCanApplySwap)
{
return TotalCredit > 0 ? Math.Min(Math.Max(-AvailableAmount / TotalCredit, 0.0), 1) : 0.0;
}
else
{
//优先支付收益互换资金剩余,取小于0的部分则为互换预付金超出可用资金部分,可用资金减除 则为期权占用授信部分,Math.Min((AvailableAmount - PayableMargin) + SwapPayableMargin, 0)
//如果为正 则资金有限抵扣预付金,预付金未完全抵扣部分计算占用授信百分比
return TotalCredit > 0 ? Math.Min(Math.Max(-(AvailableAmount - Math.Min(SwapPayableMargin, 0)) / TotalCredit, 0.0), 1) : 0.0;
}
}
else
{
//授信是否可用于互换
if (CreditCanApplySwap)
{
//MarginBalance为预付金余额(资金余额) 授信不可用于支付权利金时 剩余资金(减去预付金之前)
//如果为正 则资金有限抵扣预付金,预付金未完全抵扣部分计算占用授信百分比
return TotalCredit > 0 ? Math.Min(Math.Max((MarginOccupation - Math.Max(MarginBalance, 0)) / TotalCredit, 0.0), 1) : 0.0;
}
else
{
//如果为正 则资金有限抵扣预付金,预付金未完全抵扣部分计算占用授信百分比
return TotalCredit > 0 ? Math.Min(Math.Max(((MarginOccupation + SwapPayableMargin) - Math.Max(MarginBalance + SwapPayableMargin, 0)) / TotalCredit, 0.0), 1) : 0.0;
}
}
}
}
/// <summary>
/// 授信使用金额
/// </summary>
public double CreditUsedValue => CreditUsed * TotalCredit;
/// <summary>
/// 交易笔数
/// </summary>
public int TradeCount { get; set; }
/// <summary>
/// 名义本金(买入)
/// </summary>
public double SellNotionalPrincipal { get; set; }
/// <summary>
/// 名义本金(买入)
/// </summary>
public double BuyNotionalPrincipal { get; set; }
/// <summary>
/// 持仓名义本金
/// </summary>
public double PositionNotionalPrincipal { get; set; }
/// <summary>
/// 持仓笔数
/// </summary>
public int PositionCount { get; set; }
private double _payableMargin;
/// <summary>
/// 应付预付金(要么为负要么为零)
/// 最新概念:负数代表客户应缴预付金,正数代表客户应收预付金
/// </summary>
public double PayableMargin
{
get
{
if (_payableMarginReCaculateFlag) //如果被重新计算过,取计算后的值
{
return _payableMargin;
}
var result = 0.0;
if (IsGap)
{
if (ClientBalanceGap.IsImportOuterMargin)
{
result = -ClientBalanceGap.PayableMargin ?? 0;
}
else
{
result = (_payableMargin - (ClientBalanceGap.PayableMargin ?? 0));
}
}
else
{
result = _payableMargin;
}
return result;
}
set { _payableMargin = value; }
}
/// <summary>
/// delta预付金
/// </summary>
public double DeltaMargin { get; set; }
/// <summary>
/// 互换预付金
/// 负数代表客户应缴预付金,正数代表客户应收预付金
/// </summary>
public double SwapPayableMargin { get; set; }
/// <summary>
/// 互换预付金容忍额
/// </summary>
public double SwapUnMargin { get; set; }
/// <summary>
/// 应付预付金(结算报告客户角度,正数代表他要付钱,负数代表应收)
/// </summary>
public double MinusPayableMargin
{
get
{
//if (PS.Config.Is宏源)
//{
// return -PayableMarginShow;
//}
return -PayableMargin;
}
}
public double MinusPayableMarginTotal { get; set; }
/// <summary>
/// 双向预付金
/// </summary>
public double TwoSideMargin { get; set; }
/// <summary>
/// 初始保证金金额
/// </summary>
public double MySideMargin { get; set; }
/// <summary>
/// 客户角度预付金
/// </summary>
public double OtherSideMargin { get; set; }
/// <summary>
/// 是否是手动修改过的预付金占用
/// </summary>
public bool? IsPayableMarginManual { get; set; }
/// <summary>
/// 是否锁定修改过的预付金占用
/// </summary>
public bool? IsPayableMarginLock { get; set; }
/// <summary>
/// 潜在行权盈余
/// </summary>
public double PotentialSurpluses { get; set; }
/// <summary>
/// 预付金余额
/// </summary>
public double MarginBalance { get; set; }
/// <summary>
/// 追保金额(所有欠缺金额)
/// 负数代表客户应缴,正数代表客户应收
/// </summary>
public double Margin { get; set; }
/// <summary>
/// 追保金额绝对值(所有欠缺金额)
/// </summary>
public double AbsMargin
{
get
{
return Math.Abs(Margin);
}
}
/// <summary>
/// 追保金额(非申万维持预付金欠缺的金额)不可为负数,只会向客户追保
/// 申万账户资金为负数时,也要算进追保金额里面
/// </summary>
public double MarginByPayableMargin
{
get
{
if (PS.Config.Is广期资本)
{
return OtherAbsMarginByPayableMargin;
}
var funDiff = !IsGap || (ClientBalanceGap.MarginByPayableMargin ?? 0) == 0 ? 0 : (ClientBalanceGap.ClosedTradePayableFund ?? 0)
+ (ClientBalanceGap.PositionTradePayableFund ?? 0)
+ (ClientBalanceGap.ToDayRemainFund ?? 0);
var payableMarginDiff = !IsGap || (ClientBalanceGap.MarginByPayableMargin ?? 0) == 0 ? 0 : (-ClientBalanceGap.PayableMargin ?? 0);
var diffSW = !IsGap || (ClientBalanceGap.MarginByPayableMargin ?? 0) == 0 ? 0 : (-ClientBalanceGap.PayableMargin ?? 0)
+ (ClientBalanceGap.ToDayRemainFund ?? 0)
+ (ClientBalanceGap.Credit ?? 0);
if (PS.Config.Is申万)
{
//追缴预付金=max(当日应缴纳预付金-预付金总额)
//预付金总额=乙方权益-max(期权市值,0)-期权空头浮动盈亏
//详情见JIRA OTC-8297
return Math.Max(-PayableMargin - (AmountFund + GuaranteesTotalAmount + TotalCredit + PositionPv - Math.Max(PositionPv, 0) - ClientSellPositionPnl) + diffSW, 0) + ((!IsGap || ClientBalanceGap.IsImportOuterMargin) ? 0 : ClientBalanceGap.MarginByPayableMargin ?? 0);
}
else if (PS.Config.Is海通)
{
//新增字段“同业追保”,用于手动记录“双向追保”客户向我司通知的追保金额;该字段默认值为0,仅呈现于公司软件界面,不显示在对客发送的盯市结算报告中; 系统: 预付金占用 手动减
// 调整字段“追保金额”逻辑,追保金额 = MAX(预付金占用 - MAX(期末结存 + 应付了结交易款 + 应付存续交易款, 0) - (授信额度 + 质押市值) - 同业追保, 0)
// 预付金占用 手动减同业追保的值
return Math.Max(-PayableMargin - Math.Max(AmountFund + ClosedTradePayableFund + PositionTradePayableFund, 0) - (TotalCredit + GuaranteesTotalAmount), 0);
}
else if (PS.Config.Is润和)
{
//东证:追保金额,当可用资金为负数时,追保金额取可用资金的相反数,可用资金≥0时,追保金额=0
return Math.Max(-(AvailableAmount + TotalCredit), 0);
}
else if (PS.Config.Is东吴)
{
return Math.Max(-AvailableAmount - TotalCredit, 0);
}
else
{
var margin = 0d;
//授信可用于互换时
if (CreditCanApplySwap)
{
margin = Math.Max(-(PayableMargin - SwapUnMargin) - Math.Max(AmountFund + ClosedTradePayableFund + PositionTradePayableFund - funDiff, 0) - GuaranteesTotalAmount - TotalCredit + payableMarginDiff, 0) + ((!IsGap || ClientBalanceGap.IsImportOuterMargin) ? 0 : ClientBalanceGap.MarginByPayableMargin ?? 0);
}
else
{//授信不可用于互换
margin = Math.Max((Math.Max(-(PayableMargin - SwapPayableMargin) - TotalCredit, 0) - (SwapPayableMargin - SwapUnMargin)) - Math.Max(AmountFund + ClosedTradePayableFund + PositionTradePayableFund - funDiff, 0) - GuaranteesTotalAmount + payableMarginDiff, 0) + ((!IsGap || ClientBalanceGap.IsImportOuterMargin) ? 0 : ClientBalanceGap.MarginByPayableMargin ?? 0);
}
return margin;
}
}
}
public double MarginByPayableMarginTotal { get; set; }
/// <summary>
/// 申万特有
/// 预付金总额=乙方权益-max(期权市值,0)-期权空头浮动盈亏
/// </summary>
public double TotalMargin
{
get
{
return AmountFund + GuaranteesTotalAmount + TotalCredit - Math.Abs(SellPv) - ClientSellPositionPnl;
}
}
public double TotalMarginTotal { get; set; }
/// <summary>
/// 卖出期权权利金
/// </summary>
public double SellerPositionPremium { get; set; }
/// <summary>
/// 买入期权预付金
/// </summary>
public double BuyerPositionMargin { get; set; }
/// <summary>
/// 可取保金额
/// </summary>
public double AdvisableMargin { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateDate { get; set; }
/// <summary>
/// 授信是否可用于期权费
/// 国投伴兴可用资金已经加过授信了
/// </summary>
public bool IsTradeCredit { get; set; }
/// <summary>
/// 抵押品总价值
/// </summary>
public double GuaranteesTotalAmount { get; set; }
/// <summary>
/// 持仓市值
/// </summary>
public double PositionPv { get; set; }
/// <summary>
/// 四舍五入处理后的持仓市值
/// </summary>
public double RoundedPositionPv { get; set; }
/// <summary>
/// 空头持仓市值
/// </summary>
public double SellPv { get; set; }
/// <summary>
/// 预付金部分
/// </summary>
public double PrepaymentAmount { get; set; }
/// <summary>
/// 当日盈亏
/// </summary>
public double DaliyPnl { get; set; }
public double RoundedDaliyPnl { get; set; }
/// <summary>
/// 持仓盈亏
/// </summary>
public double PositionPnl { get; set; }
/// <summary>
/// 四舍五入处理后的持仓盈亏
/// </summary>
public double RoundedPositionPnl { get; set; }
/// <summary>
/// 期权空头浮动盈利=∑max(期权空头持仓*(期权合约成本价-期权合约现价), 0) 从客户角度看的
/// </summary>
public double ClientSellPositionPnl { get; set; }
/// <summary>
/// 总资产(账户资金(包含抵押品价值)+持仓市值)
/// </summary>
public double TotalAmount
{
get { return AmountFundWithProduct + PositionPv - PrepaymentAmount; }
}
public double TotalAmountTotal { get; set; }
/// <summary>
/// 客户权益(现金+四舍五入处理后的持仓市值)
/// </summary>
public double RoundedTotalAmount
{
get { return AmountFundWithProduct + RoundedPositionPv - PrepaymentAmount; }
}
public double RoundedTotalAmountTotal { get; set; }
/// <summary>
/// 抵押品变化
/// </summary>
public double CashInCashOutProductChange { get; set; }
/// <summary>
/// 抵押品前一日价值
/// </summary>
public double LastGuaranteesTotalAmount { get; set; }
/// <summary>
/// 上日资金(不包含抵押金额)
/// </summary>
public double LastDayRemainFund { get; set; }
/// <summary>
/// 上日资金(包含抵押金额)
/// </summary>
public double LastDayRemainFundWithProduct { get; set; }
/// <summary>
/// 可用于支付权利金的资金总额
/// </summary>
public double AvailablePayAmount
{
get
{
// 伴兴:当前可用资金加过授信额度
if (IsTradeCredit && !PS.Config.Is伴兴 && !PS.Config.Is湘财 && !PS.Config.Is国投)
{
return AvailableAmount + TotalCredit;
}
else
{
return AvailableAmount;
}
}
}
/// <summary>
/// 交易总数
/// </summary>
public int TotalTradeCount { get; set; }
/// <summary>
/// 名义本金总额
/// </summary>
public double TotalNotionalPrincipal { get; set; }
/// <summary>
/// 买权交易数
/// </summary>
public int BuyCount { get; set; }
/// <summary>
/// 卖权交易数
/// </summary>
public int SellCount { get; set; }
/// <summary>
/// 当日交易名义本金
/// </summary>
public double TodayNotionalPrincipal { get; set; }
/// <summary>
/// 冻结预付金(该处是绝对值)
/// </summary>
public double FrozenMarginMoney { get; set; }
/// <summary>
/// 资信等级
/// </summary>
public string CreditRating { get; set; }
//是否需要追加预付金
public bool IsMargin(double Temp = 0.0)
{
return PayableFund > Temp;
}
/// <summary>
/// 预付金占用(应付预付金 + 冻结预付金)
/// </summary>
/// <returns></returns>
public double MarginOccupation
{
get
{
return -PayableMargin + FrozenMarginMoney;
}
}
/// <summary>
/// 所有冻结资金(带方向) 正则为应收,负为应付
/// </summary>
/// <returns></returns>
public double AllFreezeBalance()
{
return ReceivablesPremium - (FreezePremium + FrozenOutFund + FrozenRedeemFunds + FrozenMarginMoney);
}
public double FrozenBalance { get; set; }
/// <summary>
/// 可取抵押品价值
/// </summary>
/// <returns></returns>
public double AvailableGuaranteesValue()
{
return Math.Min(Math.Max(MarginBalance, 0), GuaranteesTotalAmount);
}
/// <summary>
/// 可用期权费
/// </summary>
/// <returns></returns>
public double AvailablePremium()
{
// 伴兴:当前可用资金加过授信额度
if (IsTradeCredit && !PS.Config.Is伴兴 && !PS.Config.Is湘财 && !PS.Config.Is国投)
{
IsTradeCredit = true;
//期权费授信可以支付权利金 则预付金余额为0时 资金从
return Math.Max(AvailableAmount + TotalCredit, 0);
}
else
{
//期权费授信不可以支付权力金时 则可用期权费为 当日可用资金
return Math.Max(AvailableAmount, 0);
}
}
/// <summary>
/// 持仓期权费净额(客户角度卖出为负,买入为正)
/// </summary>
public double PositionPremiumNetCash { get; set; }
/// <summary>
/// 期初持仓交易净额
/// </summary>
public double LastDayPositionPremiumNetCash { get; set; }
/// <summary>
/// 权利金冻结:当日该客户所有持仓的卖出期权权利金
/// </summary>
public double SellTradePrice { get; set; }
/// <summary>
/// 实现盈亏
/// </summary>
public double WinLoss { get; set; }
/// <summary>
/// 当日实现盈亏
/// </summary>
public double TdWinLoss { get; set; }
/// <summary>
/// 实现盈亏 -- 结束日之前的所有实现盈亏 (WinLoss 开始日有值是区间) 国投不含 最后一天
/// </summary>
public double WinLossSum { get; set; }
/// <summary>
/// 已了结交易缺口
/// </summary>
public double ClosedTradeFundGap
{
get { return LastDayRemainFund + NetFund + OtherFund + LastDayPositionPremiumNetCash + WinLoss; }
}
/// <summary>
/// 应付了结交易款
/// </summary>
public double ClosedTradePayableFund
{
get
{
if (IsGap)
{
return (-1 * Math.Min(AmountFund + PositionPremiumNetCash, 0)) + (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.ClosedTradePayableFund ?? 0);
}
else
{
return -1 * Math.Min(AmountFund + PositionPremiumNetCash, 0);
}
}
}
public double ClosedTradePayableFundTotal { get; set; }
public ClientBalanceGap ClientBalanceGap { get; set; }
public bool IsGap { get; set; }
/// <summary>
/// 应付存续交易款
/// </summary>
public double PositionTradePayableFund
{
get
{
if (IsGap)
{
return Math.Max(PositionPremiumNetCash - Math.Max(AmountFund + PositionPremiumNetCash, 0), 0) + (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.PositionTradePayableFund ?? 0);
}
else
{
return Math.Max(PositionPremiumNetCash - Math.Max(AmountFund + PositionPremiumNetCash, 0), 0);
}
}
}
public double PositionTradePayableFundTotal { get; set; }
/// <summary>
/// 可取资金 (可用资金 - 持仓期权费净额)
/// </summary>
public double DesirableFund { get; set; }
/// <summary>
/// 已了结部分可取资金 (期末结存_权利金后付)
/// </summary>
public double EndDesirableFund
{
get
{
if (PS.Config.Is东吴)
{
return NetFund + SettlementBalance + EndPremiumSum;
}
return 0;
}
}
public double DesirableFundTotal { get; set; }
/// <summary>
/// 应付资金总额
/// </summary>
public double PayableFund
{
get
{
if (PS.Config.Is广期资本)
{
return OtherAbsMarginByPayableMargin;
}
if (MarginOptionType == 1 && PS.Config.ErpElement.TwoSideMargin)
{
if (IsGap)
{
return ClosedTradePayableFund - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.ClosedTradePayableFund ?? 0)
+ PositionTradePayableFund - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.PositionTradePayableFund ?? 0)
+ MarginByPayableMargin - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.MarginByPayableMargin ?? 0)
+ (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.PayableFund ?? 0);
}
else
{
return ClosedTradePayableFund + PositionTradePayableFund + MarginByPayableMargin;
}
}
else
{
if (IsGap)
{
return Math.Max(ClosedTradePayableFund - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.ClosedTradePayableFund ?? 0)
+ PositionTradePayableFund - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.PositionTradePayableFund ?? 0)
+ MarginByPayableMargin - (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.MarginByPayableMargin ?? 0), 0)
+ (ClientBalanceGap.IsImportOuterMargin ? 0 : ClientBalanceGap.PayableFund ?? 0);
}
else
{
return Math.Max(ClosedTradePayableFund + PositionTradePayableFund + MarginByPayableMargin, 0);
}
}
}
}
public double PayableFundTotal { get; set; }
/// <summary>
/// 总盈亏
/// </summary>
public double TotalNetSettlement => WinLoss + (PS.Config.IsPVRounded ? RoundedPositionPnl : PositionPnl);
public double TotalNetSettlementTotal { get; set; }
public int? MarginOptionType { get; set; }
/// <summary>
/// 判断实时数据是否是最新的(客户有交易操作后服务是否有更新数据)
/// </summary>
public bool IsLatestDate { get; set; }
/// <summary>
/// 可用名义本金规模
/// </summary>
public double AvailableStockEqvNotional { get; set; }
/// <summary>
/// 阈值
/// </summary>
public double? FundThreshold { get; set; }
/// <summary>
/// 是否结算数据
/// </summary>
public bool IsEodData { get; set; }
public string FundJson { get; set; }
/// <summary>
/// 潜在风险暴露
/// </summary>
public double? PFE { get; set; }
/// <summary>
/// 违约风险暴露
/// </summary>
public double? EAD { get; set; }
/// <summary>
/// 互换是否可使用
/// </summary>
public bool CreditCanApplySwap { get; set; }
/// <summary>
/// 获取可取系数方法
/// </summary>
public double DesirableRate;
/// <summary>
/// 客户 同业/非同业(0:同业;1:非同业)
/// </summary>
public int SamePeer { get; set; }
/// <summary>
/// 其它公司 追保预付金
/// </summary>
public double OtherMarginByPayableMargin
{
get
{
double result = 0;
if (PS.Config.Is广期资本)
{
result = AvailableAmount;
}
return result;
}
}
/// <summary>
/// 其它公司 追保预付金绝对值
/// </summary>
public double OtherAbsMarginByPayableMargin
{
get
{
return Math.Abs(Math.Min(OtherMarginByPayableMargin, 0));
}
}
/// <summary>
/// 初始预付金系数
/// </summary>
public double? Ratio1 { get; set; }
///// <summary>
///// 界面显示 预付金占用
///// </summary>
//public double PayableMarginShow
//{
// get
// {
// var result = PayableMargin;
// if (PS.Config.Is宏源)
// {
// if (MarginByPayableMargin > 0)
// {
// result = result * Ratio1 ?? 1.0;
// }
// }
// return result;
// }
//}
/// <summary>
/// 标识字段 PayableMargin 是否被重新计算过,如果true,直接取计算后的值
/// </summary>
private bool _payableMarginReCaculateFlag { get; set; } = false;
/// <summary>
/// 2.2在计算预付金占用时,如果直接计算出的预付金占用需要追保,则当日预付金占用=计算出中预付金占用*初始预付金系数
/// 2.3在追保条件下,乘了系数预付金预付金占用再去算追保金额、可用资金、可取资金、应付资金总额等(凡与预付金相关的都要重新算一遍)
/// </summary>
public void ReCaculatePayableMargin(int clientId, Dictionary<int, SpanConfig> marginFactorDict)
{
var coefficientFactor = marginFactorDict.TryGetValue(clientId, out var spanConfig) ? spanConfig.CoefficientFactor : 1.05;
if (_payableMarginReCaculateFlag)
{
return;
}
var value = PayableMargin;
if (PS.Config.Is宏源 || PS.Config.Company == Configuration.CompanyEnum.广发商贸)
{
var rate = Ratio1 ?? 1.0;
if (PS.Config.Company == Configuration.CompanyEnum.广发商贸)
{//todo后续改成取配置;
rate = coefficientFactor;
}
if (MarginByPayableMargin > ConsGlobal.TooSmallValue)
{
value = value * rate;
}
if (PS.Config.Is宏源 && !string.IsNullOrWhiteSpace(MarginJson))
{
var UserGroupPV = JsonHelper.Deserialize<UserGroupPVJson>(MarginJson);
PayableMarginA = UserGroupPV.ValueA;
PayableMarginB = UserGroupPV.ValueB;
if (MarginByPayableMargin > ConsGlobal.TooSmallValue)
{
PayableMarginA = PayableMarginA * rate;
PayableMarginB = PayableMarginB * rate;
}
}
}
PayableMargin = value;
_payableMarginReCaculateFlag = true;
}
public string MarginJson { get; set; }
public double PayableMarginA { get; set; }
public double PayableMarginB { get; set; }
/// <summary>
/// 系统收盘时间
/// </summary>
[NotMapped]
public DateTime? LastSettlemetTime { get; set; }
/// <summary>
/// 衡泰清算时间
/// </summary>
[NotMapped]
public string LastHTSettlemetTime { get; set; }
public double MaintenanceLine { get; set; }
/// <summary>
/// 互换存续预付金
/// </summary>
public double SwapMargin { get; set; }
/// <summary>
/// 维持保证金
/// </summary>
public double MaintenanceMargin { get; set; }
/// <summary>
/// 互换合并盯市金额B=现金结存+∑(组合待实现收益)
/// </summary>
public double SwapMarketAmount
{
get
{
return AmountFund + RoundedPositionPnl;
}
}
/// <summary>
/// 履约保证金比例:合并盯市价格/持仓名义本金
/// </summary>
public decimal SwapMarketAmountPercent
{
get
{
if (PositionNotionalPrincipal == 0)
{
return 0;
}
var percent = (decimal)Math.Round(SwapMarketAmount / PositionNotionalPrincipal, 6, MidpointRounding.AwayFromZero);
return percent > 1 ? 1 : percent;
}
}
/// <summary>
/// 是否需要追保
/// </summary>
public bool NeedAddMargin { get; set; }
/// <summary>
/// 交易费用
/// </summary>
public double TradeFee { get; set; }
/// <summary>
/// 利息盈亏
/// </summary>
public double InterestPnl { get; set; }
}
}