496 lines
14 KiB
C#
496 lines
14 KiB
C#
using System.ComponentModel.DataAnnotations.Schema;
|
|
|
|
namespace YLErp.DBModels
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
[Table("client_span")]
|
|
public class ClientSpan : DBModelWithOperator
|
|
{
|
|
///日终
|
|
public const int SpanType_Eod = 0;
|
|
|
|
///实时
|
|
public const int SpanType_RealTime = 1;
|
|
|
|
/// <summary>
|
|
/// 客户ID
|
|
/// </summary>
|
|
[DisplayName("客户ID")]
|
|
public int ClientId { get; set; }
|
|
|
|
/// <summary>
|
|
/// 标的Id
|
|
/// </summary>
|
|
[NotMapped]
|
|
public int? UnderlyingId { get; set; }
|
|
|
|
[NotMapped]
|
|
public IEnumerable<ClientPVJson> PVJsonList { get; set; }
|
|
public string PVJsons { get; set; }
|
|
/// <summary>
|
|
/// 标的预付金率
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? MaxMarginRate { get; set; }
|
|
|
|
/// <summary>
|
|
/// 品种Id
|
|
/// </summary>
|
|
[NotMapped]
|
|
public int? VarietyId { get; set; }
|
|
|
|
/// <summary>
|
|
/// 份额
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? Notional { get; set; }
|
|
|
|
/// <summary>
|
|
/// 名义本金
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? StockEqvNotional { get; set; }
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
[DisplayName("ValueDate")]
|
|
public DateTime? ValueDate { get; set; }
|
|
|
|
private double? _spv1;
|
|
/// <summary>
|
|
/// 涨停波动率不变
|
|
/// 海通:价格涨 + 波动率变大
|
|
/// </summary>
|
|
[DisplayName("涨停波动率不变")]
|
|
public double? Spv1
|
|
{
|
|
set { _spv1 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv1;
|
|
}
|
|
private double? _spv2;
|
|
/// <summary>
|
|
/// 涨停波动率变
|
|
/// 海通:价格涨 + 波动率不变
|
|
/// </summary>
|
|
[DisplayName("涨停波动率变")]
|
|
public double? Spv2
|
|
{
|
|
set { _spv2 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv2;
|
|
}
|
|
private double? _spv3;
|
|
/// <summary>
|
|
/// 跌停波动率变
|
|
/// 海通:价格涨 + 波动率变小
|
|
/// </summary>
|
|
[DisplayName("跌停波动率变")]
|
|
public double? Spv3
|
|
{
|
|
set { _spv3 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv3;
|
|
}
|
|
private double? _spv4;
|
|
/// <summary>
|
|
/// 跌停波动率不变
|
|
/// 海通:价格不变 + 波动率变大
|
|
/// </summary>
|
|
[DisplayName("跌停波动率不变")]
|
|
public double? Spv4
|
|
{
|
|
set { _spv4 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv4;
|
|
}
|
|
private double? _spv5;
|
|
|
|
/// <summary>
|
|
/// 海通:价格不变 + 波动率变小
|
|
/// </summary>
|
|
public double? Spv5
|
|
{
|
|
set { _spv5 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv5;
|
|
}
|
|
private double? _spv6;
|
|
|
|
/// <summary>
|
|
/// 海通:价格跌 + 波动率变大
|
|
/// </summary>
|
|
public double? Spv6
|
|
{
|
|
set { _spv6 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv6;
|
|
}
|
|
private double? _spv7;
|
|
|
|
/// <summary>
|
|
/// 海通:价格跌 + 波动率不变
|
|
/// </summary>
|
|
public double? Spv7
|
|
{
|
|
set { _spv7 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv7;
|
|
}
|
|
private double? _spv8;
|
|
|
|
/// <summary>
|
|
/// 海通:价格跌 + 波动率变小
|
|
/// </summary>
|
|
public double? Spv8
|
|
{
|
|
set { _spv8 = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _spv8;
|
|
}
|
|
|
|
|
|
private double? spv9;
|
|
private double? spv10;
|
|
private double? spv11;
|
|
private double? spv12;
|
|
private double? spv13;
|
|
private double? spv14;
|
|
|
|
public double? Spv9
|
|
{
|
|
get => spv9;
|
|
set => spv9 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv10
|
|
{
|
|
get => spv10;
|
|
set => spv10 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv11
|
|
{
|
|
get => spv11;
|
|
set => spv11 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv12
|
|
{
|
|
get => spv12;
|
|
set => spv12 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv13
|
|
{
|
|
get => spv13;
|
|
set => spv13 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv14
|
|
{
|
|
get => spv14;
|
|
set => spv14 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv15
|
|
{
|
|
get => spv15;
|
|
set => spv15 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv16
|
|
{
|
|
get => spv16;
|
|
set => spv16 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
public double? Spv17
|
|
{
|
|
get => spv17;
|
|
set => spv17 = (value == null || double.IsNaN(value.Value)) ? 0 : value;
|
|
}
|
|
private double? _worstCastClientPayable;
|
|
|
|
/// <summary>
|
|
/// 最新概念:负数代表客户应缴预付金,正数代表客户应收预付金
|
|
/// </summary>
|
|
[DisplayName("WorstCastClientPayable")]
|
|
|
|
public double? WorstCastClientPayable
|
|
{
|
|
set { _worstCastClientPayable = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _worstCastClientPayable;
|
|
}
|
|
|
|
private double? _swapWorstCastClientPayable;
|
|
|
|
/// <summary>
|
|
/// 最新概念:负数代表客户应缴预付金,正数代表客户应收预付金
|
|
/// </summary>
|
|
[DisplayName("SwapWorstCastClientPayable")]
|
|
|
|
public double? SwapWorstCastClientPayable
|
|
{
|
|
set { _swapWorstCastClientPayable = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _swapWorstCastClientPayable;
|
|
}
|
|
|
|
private double? _swapInitMargin;
|
|
|
|
/// <summary>
|
|
/// 互换初始预付金
|
|
/// </summary>
|
|
[DisplayName("SwapInitMargin")]
|
|
|
|
public double? SwapInitMargin
|
|
{
|
|
set { _swapInitMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _swapInitMargin;
|
|
}
|
|
|
|
private double? _swapWinLoss;
|
|
|
|
/// <summary>
|
|
/// 互换盈亏
|
|
/// </summary>
|
|
[DisplayName("SwapWinLoss")]
|
|
|
|
public double? SwapWinLoss
|
|
{
|
|
set { _swapWinLoss = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _swapWinLoss;
|
|
}
|
|
|
|
|
|
private double? _swapUnMargin;
|
|
/// <summary>
|
|
/// 互换无需追保部分(容忍额度)
|
|
/// </summary>
|
|
[DisplayName("SwapUnMargin")]
|
|
|
|
public double? SwapUnMargin
|
|
{
|
|
set { _swapUnMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _swapUnMargin;
|
|
}
|
|
|
|
[NotMapped]
|
|
public double? MaxSpotPrice { get; set; }
|
|
/// <summary>
|
|
/// 品种级别
|
|
/// DeltaSell为客户角度卖出,且为客户角度看Delta
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? DeltaSell { get; set; }
|
|
/// <summary>
|
|
/// 品种级别
|
|
/// 客户方向买入正的delta之和
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? DeltaBuy { get; set; }
|
|
/// <summary>
|
|
/// 品种级别
|
|
/// 客户方向买入负的delta之和
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? DeltaBuyMinus { get; set; }
|
|
/// <summary>
|
|
/// 品种级别Delta预付金
|
|
/// 最终客户级别Delta预付金
|
|
/// 负数代表客户应缴预付金(瑞达目前只有客户缴纳预付金这种方式)
|
|
/// 国君也有deltamargin
|
|
/// </summary>
|
|
public double? DeltaMargin { get; set; }
|
|
|
|
/// <summary>
|
|
/// Delta Margin最终需要加上所有的Pv
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? PvForDelta { get; set; }
|
|
/// <summary>
|
|
/// 浮盈浮亏
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? PositionWinLoss { get; set; }
|
|
|
|
private double? _twoSideMargin;
|
|
|
|
/// <summary>
|
|
/// 双向预付金(暂时只有国君用到了该字段)
|
|
/// </summary>
|
|
public double? TwoSideMargin
|
|
{
|
|
set { _twoSideMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _twoSideMargin;
|
|
}
|
|
private double? _mySideMargin;
|
|
|
|
/// <summary>
|
|
/// 本方角度预付金
|
|
/// </summary>
|
|
public double? MySideMargin
|
|
{
|
|
set { _mySideMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _mySideMargin;
|
|
}
|
|
private double? _otherSideMargin;
|
|
|
|
/// <summary>
|
|
/// 客户角度看的预付金
|
|
/// </summary>
|
|
public double? OtherSideMargin
|
|
{
|
|
set { _otherSideMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _otherSideMargin;
|
|
}
|
|
private double? _additionalWorstCastClientPayable;
|
|
|
|
/// <summary>
|
|
/// 额外追保
|
|
/// </summary>
|
|
[DisplayName("额外追保")]
|
|
public double? AdditionalWorstCastClientPayable
|
|
{
|
|
set { _additionalWorstCastClientPayable = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _additionalWorstCastClientPayable;
|
|
}
|
|
private double? _variationMargin;
|
|
private double? spv15;
|
|
private double? spv16;
|
|
private double? spv17;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
[DisplayName("VariationMargin")]
|
|
|
|
public double? VariationMargin
|
|
{
|
|
set { _variationMargin = (value == null || double.IsNaN(value.Value)) ? 0 : value; }
|
|
get => _variationMargin;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int SpanType { get; set; }
|
|
|
|
/// <summary>
|
|
/// 风险敞口(假设公司当天行权,客户需要支付的payoff)
|
|
/// </summary>
|
|
public double? RiskExposure { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:IM
|
|
/// </summary>
|
|
public double? IM { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:PFE
|
|
/// </summary>
|
|
public double? PFE { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:VM
|
|
/// </summary>
|
|
public double? VM { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:手续费
|
|
/// </summary>
|
|
public double? Commission { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:抵扣额度
|
|
/// </summary>
|
|
public double? Deduct { get; set; }
|
|
|
|
/// <summary>
|
|
/// 中金:已占用PFE授信
|
|
/// </summary>
|
|
public double? PFEUsed { get; set; }
|
|
|
|
/// <summary>
|
|
/// 是否从人工修改过
|
|
/// </summary>
|
|
public bool ModifiedFlag { get; set; }
|
|
|
|
/// <summary>
|
|
/// 初始预付金 * 额外系数
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double? InitialMargin { get; set; }
|
|
|
|
public void SetWorstCastClientPayableMin()
|
|
{
|
|
var worst = Spv1 ?? 0;
|
|
|
|
if (Spv2.HasValue && worst > Spv2.Value)
|
|
{
|
|
worst = Spv2.Value;
|
|
}
|
|
|
|
if (Spv3.HasValue && worst > Spv3.Value)
|
|
{
|
|
worst = Spv3.Value;
|
|
}
|
|
|
|
if (Spv4.HasValue && worst > Spv4.Value)
|
|
{
|
|
worst = Spv4.Value;
|
|
}
|
|
|
|
if (Spv5.HasValue && worst > Spv5.Value)
|
|
{
|
|
worst = Spv5.Value;
|
|
}
|
|
|
|
if (Spv6.HasValue && worst > Spv6.Value)
|
|
{
|
|
worst = Spv6.Value;
|
|
}
|
|
|
|
if (Spv7.HasValue && worst > Spv7.Value)
|
|
{
|
|
worst = Spv7.Value;
|
|
}
|
|
|
|
if (Spv8.HasValue && worst > Spv8.Value)
|
|
{
|
|
worst = Spv8.Value;
|
|
}
|
|
|
|
if (Spv9.HasValue && worst > Spv9.Value)
|
|
{
|
|
worst = Spv9.Value;
|
|
}
|
|
|
|
if (Spv10.HasValue && worst > Spv10.Value)
|
|
{
|
|
worst = Spv10.Value;
|
|
}
|
|
|
|
if (Spv11.HasValue && worst > Spv11.Value)
|
|
{
|
|
worst = Spv11.Value;
|
|
}
|
|
|
|
if (Spv12.HasValue && worst > Spv12.Value)
|
|
{
|
|
worst = Spv12.Value;
|
|
}
|
|
|
|
if (Spv13.HasValue && worst > Spv13.Value)
|
|
{
|
|
worst = Spv13.Value;
|
|
}
|
|
|
|
if (Spv14.HasValue && worst > Spv14.Value)
|
|
{
|
|
worst = Spv14.Value;
|
|
}
|
|
if (Spv15.HasValue && worst > Spv15.Value)
|
|
{
|
|
worst = Spv15.Value;
|
|
}
|
|
if (Spv16.HasValue && worst > Spv16.Value)
|
|
{
|
|
worst = Spv16.Value;
|
|
}
|
|
if (Spv17.HasValue && worst > Spv17.Value)
|
|
{
|
|
worst = Spv17.Value;
|
|
}
|
|
WorstCastClientPayable = worst;
|
|
}
|
|
}
|
|
}
|