1104 lines
38 KiB
C#
1104 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>
|
|
/// 用户可用的名义本金规模
|
|
/// </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; }
|
|
}
|
|
}
|