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);
}
}
}
}