using YLErp.Abstract.DataProviders; using YLErp.Enums; namespace YLErp.BLL.MarginCalculation { /// /// 预付金计算请求参数 /// public class RunMarginCalculationReq { public RunMarginCalculationReq(OptUserInfo user) { UserInfo = user ?? throw new ArgumentNullException(nameof(user)); } public OptUserInfo UserInfo { get; private set; } /// /// 操作人ID /// public int userId => UserInfo.UserId; /// /// 操作人名称 /// public string userName => UserInfo.UserName; /// /// 结算日 /// public DateTime settleDate { get; set; } /// /// 用于计算的交易数据列表 /// public List tradeList { get; set; } /// /// 计算单笔交易初始预付金时候需要用到该参数 /// public int realTradeId { get; set; } /// /// 默认false,是否已经获取了奇异期权要素信息 /// 这个属性应该是为了避免重复获取奇异期权要素信息提高性能 /// public bool hasOptionInfo { get; set; } /// /// 是否用于计算相反方向的预付金,默认:false /// public bool forOtherSide { get; set; } /// /// 波动率类型(默认:交易) /// public string volType { get; set; } = "交易"; public SettlementTypeEnum settlementType { get; set; } = SettlementTypeEnum.ClosePrice; public CalcMarginTypeEnum CalcMarginType { get; set; } = CalcMarginTypeEnum.None; /// /// 计算预付金时用到的价格提供接口实现 /// public IPriceProvider PriceProvider { get; set; } public CalcScenarioEnum GetCalcScenario() { if (CalcMarginType == CalcMarginTypeEnum.EodMargin) { return CalcScenarioEnum.EodSettlement; } return CalcScenarioEnum.InitialMargin; } public RunMarginCalculationReq Clone() { return (RunMarginCalculationReq)MemberwiseClone(); } public RunMarginCalculationReq Clone(List tradeList) { var clone = (RunMarginCalculationReq)MemberwiseClone(); clone.tradeList = tradeList; return clone; } public RunMarginCalculationReq Clone(bool forOtherSide) { var clone = (RunMarginCalculationReq)MemberwiseClone(); clone.forOtherSide = forOtherSide; return clone; } } public class GetTradeMarginReq : IPriceProvider { public trade trade; //关于交易id的多义性: 1.组合交易需要真实的交易id;2.考虑到波动率不能获取持仓波动率,将id赋值为0;3.定价页面结构化交易子交易id会赋值-1和-2 //所以添加了这个字段 public int realTradeId; public double price; public CalcMarginTypeEnum calcMarginType = CalcMarginTypeEnum.None; public SettlementTypeEnum settlementType = SettlementTypeEnum.ClosePrice; public bool hasOptionInfo = false; public RunMarginCalculationReq GetRunMarginCalculationReq() { return new RunMarginCalculationReq(OptUserInfo.SystemUser) { realTradeId = realTradeId, tradeList = new List { trade }, settleDate = calcMarginType == CalcMarginTypeEnum.InitialMargin ? (trade.TradeDate ?? valuedateBLL.ValueDate) : valuedateBLL.ValueDate, hasOptionInfo = hasOptionInfo, forOtherSide = false, PriceProvider = this, volType = "交易", settlementType = settlementType, CalcMarginType = calcMarginType }; } public double GetPrice(string instrumentCode) { return (trade.UnderlyingCode ?? string.Empty).Equals(instrumentCode, StringComparison.OrdinalIgnoreCase) ? price : 0; } public bool TryGetPrice(string instrumentCode, out double price) { if ((trade.UnderlyingCode ?? string.Empty).Equals(instrumentCode, StringComparison.OrdinalIgnoreCase)) { price = this.price; return true; } price = 0; return false; } } public class CalcClientMarginReq { public CalcClientMarginReq(OptUserInfo user) { UserInfo = user ?? throw new ArgumentNullException(nameof(user)); } public OptUserInfo UserInfo { get; private set; } /// /// 操作人ID /// public int userId => UserInfo.UserId; /// /// 操作人名称 /// public string userName => UserInfo.UserName; /// /// 结算日 /// public DateTime settleDate { get; set; } public List tradeSpans { get; set; } public List tradeSpansOtherSide { get; set; } public int SpanType { get; set; } public List RefreshClientIds { get; set; } public Dictionary clientAdditionalMarginDic { get; set; } public bool OnlyBuyer { get; set; } = true; /// /// 分客户收盘客户id /// public IEnumerable ClientIds { get; set; } } }