using Muchinfo.MTPClient.Data.Enums; using Muchinfo.MTPClient.Data.Helper; using Muchinfo.MTPClient.Resources; using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Media; namespace Muchinfo.MTPClient.Data.Model.Account { using GalaSoft.MvvmLight; /// /// 资金账号类 /// public class FundsAccount : ObservableObject { #region 字段备注 //AccountId 账户id //TradeStatus 交易状态 //Currency 币种 //IsMain 是否母账户 //ParentAccountID 所属母账户 //TAAccountType 内、外部 //RelationMainAccountID 关联账户 //Balance 期初余额 //CurrentBalance 期末余额 //UsedMargin 占用保证金 //FreezeMargin 冻结保证金 //OtherFreezeMargin 其他冻结保证金 //FreezeCharge 手续费冻结 //MortgageCredit 授信金额 //OtherCredit 其他授信金额 //OutAmountFreeze 出金冻结 //OutAmount 今日出金 //InAmount 今日入金 //PayCharge 今日手续费支出 //ClosePL 今日平仓盈亏 //CreditIncrease 今日授信增加 //CreditDecrease 今日授信减少 //OtherCreditIncrease 今日其他授信增加 //OtherCreditDecrease 今日其他授信减少 //TransferAmount 今日划转金额 //OtherPay 其他支出 //OtherIncome 其他收入 //OutThreshold 出金阀值 #endregion public FundsAccount() { } //市值=最新价*数量*合约单位 //净值=期末余额+市值+浮动盈亏-授信金额-其他授信金额; //可用=净值-市值-占用-冻结-其他冻结-手续费冻结-出金冻结; //风险率=【占用/(净值-市值)】或【(净值-市值)/占用】; //冻结=做市冻结+竞价冻结+混合冻结+发售冻结+交割冻结+挂牌冻结+出金冻结 private const int c_figures = 2; #region 业务服务属性 /// /// /// 可用保证金 /// public decimal AvailMargin { get { //账户总浮动盈亏为负: =期末余额+总浮动盈亏-占用-冻结-其它冻结-手续费冻结-出金冻结 //账户总浮动盈亏为正 且 113 = 0 =期末余额-占用-冻结-其它冻结-手续费冻结-出金冻结 //账户总浮动盈亏为正 且 113 = 1 =期末余额+总浮动盈亏-占用-冻结-其它冻结-手续费冻结-出金冻结 //*系统参数”113“(当日浮动盈利是否可用) 0:不可用 1:可用 var pl = FloatPL; if (pl > 0 && !FloatAvaliabelFlag) pl = 0; var avail = CurrentBalance + pl - (UsedMargin + FreezeMargin + OtherFreezeMargin + FreezeCharge + OutAmountFreeze); return Math.Round(avail, c_figures, MidpointRounding.AwayFromZero); } } public string AvailMarginDisplay { get { var value = AvailMargin; return value.ToString("N" + c_figures); //if (value > 0) return value.ToString("N" + c_figures); //return "0.00"; } } /// /// 期初余额 /// private decimal _balance; /// /// 期初余额 /// [PropertyDisc("balance")] public decimal Balance { get { return _balance; } set { Set(() => Balance, ref _balance, value); RaisePropertyChanged(() => CurrentNetWorth); RaisePropertyChanged(() => CurrentNetWorthDisplay); RaisePropertyChanged(() => AvailMargin); RaisePropertyChanged(() => AvailMarginDisplay); } } /// /// 期初余额 /// public string BalanceDisplay { get { return Balance.ToString("N" + c_figures); } } public string CurrentBalanceDisplay { get { return CurrentBalance.ToString("N" + c_figures); } } /// /// 平仓盈亏 /// private decimal _closePL; /// /// 平仓盈亏 /// [PropertyDisc("ClosePL")] public decimal ClosePL { get { return _closePL; } set { Set(() => ClosePL, ref _closePL, value); RaisePropertyChanged(() => ClosePLDisplay); RaisePropertyChanged(() => ClosePLBrush); } } /// /// 账户币种 /// private string _currency; /// /// 账户币种 /// public string Currency { get { if (string.IsNullOrEmpty(_currency)) { return "RMB"; } return _currency; } set { Set(() => Currency, ref _currency, value); } } /// /// 期末余额 /// private decimal _currentBalance; /// /// 期末余额 /// [PropertyDisc("currentBalance")] public decimal CurrentBalance { get { return _currentBalance; } set { Set(() => CurrentBalance, ref _currentBalance, value); RaisePropertyChanged(() => CurrentNetWorth); RaisePropertyChanged(() => CurrentNetWorthDisplay); RaisePropertyChanged(() => AvailMargin); RaisePropertyChanged(() => AvailMarginDisplay); RaisePropertyChanged(() => RiskRatioDisplay); } } /// /// 期末净值 /// private decimal _currentNetWorth; /// /// 风控净值(期末净值) /// // [PropertyDisc("currentNetworth")] public decimal CurrentNetWorth { get { //净值 = 期末余额+浮动盈亏 = 占用+可用+冻结保证金+外部冻结+出金冻结+交收冻结+期间冻结金额 (旧的) //return Math.Round(CurrentBalance + FloatPL, c_figures, MidpointRounding.AwayFromZero); //#35141与风控确认,风控计算净值时减掉了部分冻结的资金,现在客户端作同步: //仅全额模式时 //净值=期末余额+市值- 出金冻结 - 交易费用冻结 - 发售冻结 - 交收冻结 - 摘牌冻结 - 托管冻结 - 挂牌冻结; //无风险率 //仅保证金模式时 //净值=期末余额+浮动盈亏- 出金冻结 - 交易费用冻结 - 发售冻结 - 交收冻结 - 摘牌冻结 - 托管冻结 - 挂牌冻结; //风险率=【占用/净值】 或 【净值/占用】; //即有全额又有保证金时 //净值=期末余额+市值+浮动盈亏- 出金冻结 - 交易费用冻结 - 发售冻结 - 交收冻结 - 摘牌冻结 - 托管冻结 - 挂牌冻结; //风险率=【占用/(净值-市值)】或【(净值-市值)/占用】 // var v = Math.Round(CurrentBalance + FloatPL - OutAmountFreeze - IMFreezeMargin - DeliveryFreeze - DepositFreeze - DelistingFREEZE - ListingFREEZE - Trade_FEEFREEZE, c_figures, MidpointRounding.AwayFromZero); // 错误 #90740 权益不减出金冻结 var v = Math.Round(CurrentBalance + FloatPL - IMFreezeMargin - DeliveryFreeze - DepositFreeze - DelistingFREEZE - ListingFREEZE - Trade_FEEFREEZE, c_figures, MidpointRounding.AwayFromZero); return v; } } public string CurrentNetWorthDisplay { get { //净值 = 期末余额+浮动盈亏 = 占用+可用+冻结保证金+外部冻结+出金冻结+交收冻结+期间冻结金额 var value = CurrentNetWorth; RaisePropertyChanged(() => SumCurrentNetWorthDisplay); //更新总净值 return value.ToString("N" + c_figures); //if (value > 0) return value.ToString("N" + c_figures); //return "0.00"; } } private decimal _payNetWorth; /// /// 全额市值 /// public decimal PayNetWorth { get { return _payNetWorth; } set { Set(() => PayNetWorth, ref _payNetWorth, value); RaisePropertyChanged(() => SumCurrentNetWorthDisplay); //更新总净值 RaisePropertyChanged(() => PayNetWorthDisplay); //全额市值格式化 } } /// /// 全额市值格式化 /// public string PayNetWorthDisplay { get { return (PayNetWorth).ToString("N" + c_figures); } } /// /// 净值(总净值=风控净值+市值) 期末余额+市值+浮动盈亏; /// public decimal SumCurrentNetWorth { get { return (PayNetWorth + CurrentNetWorth); } } public string SumCurrentNetWorthDisplay { get { return SumCurrentNetWorth.ToString("N" + c_figures); } } /// /// 冻结保证金 /// private decimal _freezeMargin; /// /// 冻结保证金 /// [PropertyDisc("freezeMargin")] public decimal FreezeMargin { get { return _freezeMargin; } set { Set(() => FreezeMargin, ref _freezeMargin, value); RaisePropertyChanged(() => SumFreezeMarginDisplay); } } private decimal _deliveryFreeze; /// /// 交收冻结保证金 /// [PropertyDisc("DELIVERYFREEZE")] public decimal DeliveryFreeze { get { return _deliveryFreeze; } set { _deliveryFreeze = value; } } private decimal _outMouneyThreshold; /// /// 出金阀值 /// /// [PropertyDisc("outMoneyThreshold")] public decimal OutThreshold { get { return _outMouneyThreshold; } set { _outMouneyThreshold = value; } } /// /// 入金金额 /// private decimal _inAmount; /// /// 入金金额 /// [PropertyDisc("inAmount")] public decimal InAmount { get { return _inAmount; } set { Set(() => InAmount, ref _inAmount, value); RaisePropertyChanged(()=>InAmountDisplay); } } /// /// 最高利用保证金 /// private decimal _maxUsedMargin; /// /// 最高利用保证金 /// public decimal MaxUsedMargin { get { return _maxUsedMargin; } set { Set(() => MaxUsedMargin, ref _maxUsedMargin, value); } } /// /// 期初净值 /// private decimal _netWorth; /// /// 期初净值 /// [PropertyDisc("networth")] public decimal NetWorth { get { return _netWorth; } set { Set(() => NetWorth, ref _netWorth, value); } } /// /// 出金金额 /// private decimal _outAmount; /// /// 出金金额 /// [PropertyDisc("outAmount")] public decimal OutAmount { get { return _outAmount; } set { Set(() => OutAmount, ref _outAmount, value); RaisePropertyChanged(()=>OutAmountDisplay); } } /// /// 结算盈亏 /// private decimal _reckonPL; /// /// 结算盈亏 /// [PropertyDisc("reckonPL")] public decimal ReckonPL { get { return _reckonPL; } set { Set(() => ReckonPL, ref _reckonPL, value); } } /// /// 当前银行利率 /// public decimal BankRate { get; set; } //浮动盈亏 private decimal _floatPL; /// /// 浮动盈亏(不包括全额) /// public decimal FloatPL { get { return _floatPL; } set { Set(() => FloatPL, ref _floatPL, value); RaisePropertyChanged(() => CurrentNetWorth); RaisePropertyChanged(() => CurrentNetWorthDisplay); RaisePropertyChanged(() => AvailMargin); RaisePropertyChanged(() => AvailMarginDisplay); RaisePropertyChanged(() => RiskRatioDisplay); RaisePropertyChanged(() => BalanceDisplay); if (this.TradeAccount != null) { RaisePropertyChanged(() => this.TradeAccount.FundsUsageRate); } RaisePropertyChanged(() => FloatPLBrush); RaisePropertyChanged(()=>FloatPLDisplay); RaisePropertyChanged(() => SumCurrentNetWorthDisplay); //更新总净值 } } /// /// 可用资金 /// public decimal AvailAmount { get; set; } public Brush FloatPLBrush { get { try { if (_floatPL == 0) { return ResourceHelper.GetFromResource("AccountTextForeground"); } else if (_floatPL > 0) { return ResourceHelper.GetFromResource("QuoteAscBrush"); } else { return ResourceHelper.GetFromResource("QuoteDecBrush"); } } catch { return null; } } } //全额盈亏 private decimal _payFloatPL; /// /// 全额盈亏 /// public decimal PayFloatPL { get { return _payFloatPL; } set { Set(() => PayFloatPL, ref _payFloatPL, value); } } /// /// 手续费 /// private decimal _tradeCharge; /// /// 手续费 /// public decimal TradeCharge { get { return _tradeCharge; } set { Set(() => TradeCharge, ref _tradeCharge, value); } } /// /// 资金账号 /// [PropertyDisc("accountId")] public ulong AccountId { get; set; } /// /// 交易状态 /// public uint TradeStatus { get; set; } /// /// 是否母账户 /// public uint IsMain { get; set; } /// /// 所属母账户 /// public ulong ParentAccountID { get; set; } /// /// 内、外部 /// public uint TAAccountType { get; set; } /// /// 关联账户 /// public ulong RelatedMainAccountID { get; set; } private decimal _otherFreezeMargin; /// /// 其他冻结保证金 /// public decimal OtherFreezeMargin { get { return _otherFreezeMargin; } set { Set(() => OtherFreezeMargin, ref _otherFreezeMargin, value); RaisePropertyChanged(() => SumFreezeMarginDisplay); } } private decimal _freezeCharge; /// /// 手续费冻结 /// public decimal FreezeCharge { get { return _freezeCharge; } set { Set(() => FreezeCharge, ref _freezeCharge, value); RaisePropertyChanged(() => FreezeChargeDisplay); } } /// /// 授信金额 /// public decimal MortgageCredit { get; set; } /// /// 其它授信金额 /// public decimal OtherCredit { get; set; } private decimal _payCharge; /// /// 今日手续费支出 /// //public decimal PayCharge { get; set; } public decimal PayCharge { get { return _payCharge; } set { Set(() => PayCharge, ref _payCharge, value); RaisePropertyChanged(() => PayChargeDisplay); } } /// /// 今日授信增加 /// public decimal CreditIncrease { get; set; } /// /// 今日授信减少 /// public decimal CreditDecrease { get; set; } /// /// 今日其它授信增加 /// public decimal OtherCreditIncrease { get; set; } /// /// 今日其它授信减少 /// public decimal OtherCreditDecrease { get; set; } /// /// 今日划转金额 /// public decimal TransferAmount { get; set; } /// /// 其他支出 /// public decimal OtherPay { get; set; } /// /// 其他收入 /// public decimal OtherIncome { get; set; } /// /// 占用保证金 /// private decimal _usedMargin; /// /// 占用保证金 /// [PropertyDisc("usedMargin")] public decimal UsedMargin { get { return _usedMargin; } set { Set(() => UsedMargin, ref _usedMargin, value); } } /// /// 发售冻结保证金 /// [PropertyDisc("IMFREEZEMARGIN")] public decimal IMFreezeMargin { get; set; } /// /// 混合冻结保证金 /// [PropertyDisc("XMFREEZEMARGIN")] public decimal XMFreezeMargin { get; set; } /// /// OTC冻结保证金 /// [PropertyDisc("MMFREEZEMARGIN")] public decimal MMFreezeMargin { get; set; } /// /// 竞价冻结保证金 /// [PropertyDisc("BMFREEZEMARGIN")] public decimal BMFreezeMargin { get; set; } /// /// 外部冻结 /// [PropertyDisc("OTRFREEZE")] public decimal OTRFreezeMargin { get; set; } /// /// OTC占用保证金 /// [PropertyDisc("MMUSEDMARGIN")] public decimal MMUsedMargin { get; set; } /// /// 混合占用保证金 /// [PropertyDisc("XMUSEDMARGIN")] public decimal XMUsedMargin { get; set; } /// /// 竞价占用保证金 /// [PropertyDisc("BMUSEDMARGIN")] public decimal BMUsedMargin { get; set; } /// /// 发售手续费 /// [PropertyDisc("IMTRADEFEE")] public decimal IMTradeFee { get; set; } /// /// 混合手续费 /// [PropertyDisc("XMTRADEFEE")] public decimal XMTradeFee { get; set; } /// /// 即期手续费 /// [PropertyDisc("MMTRADEFEE")] public decimal MMTradeFee { get; set; } /// /// 竞价手续费 /// [PropertyDisc("BMTRADEFEE")] public decimal BMTradeFee { get; set; } /// /// 账号所属机构角色 /// [PropertyDisc("AreaRoles")] public int AreaRoles { get; set; } /// /// 挂牌手续费 /// [PropertyDisc("ListingFee")] public decimal ListingFee { get; set; } /// /// 摘牌手续费 /// [PropertyDisc("DelistingFee")] public decimal DelistingFee { get; set; } /// /// 摘牌冻结 /// [PropertyDisc("DelistingFREEZE")] public decimal DelistingFREEZE { get; set; } /// /// 挂牌冻结 /// [PropertyDisc("ListingFREEZE")] public decimal ListingFREEZE { get; set; } /// /// 托管冻结 /// [PropertyDisc("DepositFreeze")] public decimal DepositFreeze { get; set; } private decimal _SumFreezeMargin = decimal.Zero; /// /// 总冻结保证金 /// public decimal SumFreezeMargin { get { //return TASumFreezeMargin + OTRFreezeMargin + OutAmountFreeze; //MTP2.0变更字段 return FreezeMargin + OtherFreezeMargin + OutAmountFreeze; } } /// /// 总冻结保证金格式化 /// public string SumFreezeMarginDisplay { get { return SumFreezeMargin.ToString("N" + c_figures); } } /// /// 总交易手续费 /// public decimal SumTradeFee { get { return XMTradeFee + IMTradeFee + MMTradeFee + BMTradeFee; } } /// /// /// public string UsedMarginDisplay { get { return UsedMargin.ToString("N" + c_figures); } } /// /// (会员风控) 风险率 /// public decimal RiskRatio { get { decimal rate = -100; switch (TradeAccount.RiskRatioCalcMode) { case eRiskRateMode.WORTHOCCUPY: if (UsedMargin == 0) { return 0; } rate=(CurrentNetWorth / UsedMargin); break; default: if (CurrentNetWorth == 0) { return 0; } rate=(UsedMargin / CurrentNetWorth); break; } if (rate < 0) { rate = -100; } return rate; } } /// /// 风险率 /// public string RiskRatioDisplay { get { if (TradeAccount == null) { return "--"; } decimal rate = -100; switch (TradeAccount.RiskRatioCalcMode) { case eRiskRateMode.WORTHOCCUPY: if (UsedMargin == 0) { return "--"; } rate= (CurrentNetWorth / UsedMargin) ; break; default: if (CurrentNetWorth == 0) { return "--"; } rate= (UsedMargin / CurrentNetWorth) ; break; } if (rate < 0) { return (-100).ToString("P2"); } return rate.ToString("P2"); } } /// /// 调整 /// public decimal Adjust { get; set; } private decimal _outAmountFreeze; /// /// 出金冻结保证金 /// [PropertyDisc("OutMoneyFreeze")] public decimal OutAmountFreeze { get { return _outAmountFreeze; } set { Set(() => OutAmountFreeze, ref _outAmountFreeze, value); RaisePropertyChanged(() => SumFreezeMarginDisplay); } } /// /// 最大合约价格 /// [PropertyDisc("maxAgreeAmount")] public decimal MaxAgreeAmount { get; set; } #endregion Properties /// /// 所属交易账号 /// public TradeAccount TradeAccount { get; set; } /// /// 显示用户状态 /// public string AccountStatusDisplay { get { return AccountStatus.Discription(); } } /// /// 会员证件类型 /// public eCardType CardType { get; set; } /// /// 会员证件号码 /// public string CardNum { get; set; } public override string ToString() { string strbuff = Client_Resource.Domain_Account + this.AccountId + Client_Resource.Domain_AvailableFunds + this.AvailMargin + Client_Resource.Domain_RiskRatio + this.RiskRatioDisplay; return strbuff; } /// /// 冻结保证金(总冻结)(数据库查询不包括出金冻结) /// [PropertyDisc("TASumFreezeMargin")] public decimal TASumFreezeMargin { get; set; } /// /// 仓单冲抵最低保证金 /// [PropertyDisc("mincurrentbalance")] public decimal MincurrentBalance { get; set; } /// /// 人工冻结 /// [PropertyDisc("ManualFreeze")] public decimal ManualFreeze { get; set; } /// /// 当天入金是否可出 0:不可出 1:可出 /// [PropertyDisc("IsAllowInMoney")] public int IsAllowInMoney { get; set; } /// /// 交易费用冻结 /// [PropertyDisc("Trade_FEEFREEZE")] public decimal Trade_FEEFREEZE { get; set; } // public eAccountStatus AccountStatus { get; set; } private eAccountStatus _accountStatus; /// /// 账号状态 /// [PropertyDisc("accountstatus")] public eAccountStatus AccountStatus { get { return _accountStatus; } set { _accountStatus = value; } } /// /// Gets or sets the currency identifier. /// /// The currency identifier. public uint CurrencyID { get; set; } /// /// 冻结手续费 /// /// The freeze charge display. public string FreezeChargeDisplay { get { return FreezeCharge.ToString("N" + c_figures); } } /// /// 入金 /// /// The freeze charge display. public string InAmountDisplay { get { return InAmount.ToString("N" + c_figures); } } /// /// 出金 /// /// The freeze charge display. public string OutAmountDisplay { get { return OutAmount.ToString("N" + c_figures); } } /// /// Gets the close pl display. /// /// The close pl display. public string ClosePLDisplay { get { return ClosePL.ToString("N" + c_figures); } } /// /// Gets the float pl display. /// /// The float pl display. public string FloatPLDisplay { get { return FloatPL.ToString("N" + c_figures); } } /// /// Gets the pay charge display. /// /// The pay charge display. public string PayChargeDisplay { get { return PayCharge.ToString("N" + c_figures); } } /// /// Gets the freeze margin display. /// /// The freeze margin display. public string FreezeMarginDisplay { get { return FreezeMargin.ToString("N" + c_figures); } } /// /// Gets the close pl brush. /// /// The close pl brush. public Brush ClosePLBrush { get { try { if (_closePL == 0) { return ResourceHelper.GetFromResource("AccountTextForeground"); } else if (_closePL > 0) { return ResourceHelper.GetFromResource("QuoteAscBrush"); } else { return ResourceHelper.GetFromResource("QuoteDecBrush"); } } catch { return null; } } } private bool _floatAvaliabelFlag; public bool FloatAvaliabelFlag { get { return _floatAvaliabelFlag; } set { Set(() => FloatAvaliabelFlag, ref _floatAvaliabelFlag, value); RaisePropertyChanged(() => AvailMarginDisplay); } } } }