using YLErp.BLL; namespace YLErp.Modules.VolatilityModule { /// /// 交易对冲波动率服务 /// public class TradeHedgeVolService { /// /// 批量保存对冲波动率 /// public void SaveTradeHedgeVols(Dictionary tradeIdHedgeVolDic, int userId, string userName, DateTime? valueDate = null) { if (tradeIdHedgeVolDic == null) { throw new ArgumentNullException(nameof(tradeIdHedgeVolDic)); } if (!valueDate.HasValue) { valueDate = valuedateBLL.ValueDate; } var tradeIds = tradeIdHedgeVolDic.Keys.ToList(); using (var con = DbContextFactory.GetYLDbContext()) { var tradeHedgeVols = con.trade_hedge_vol.Where(v => tradeIds.Contains(v.TradeId) && v.ValueDate == valueDate).ToDictionary(v => v.TradeId, v => v); foreach (var tradeIdHedgeVol in tradeIdHedgeVolDic) { trade_hedge_vol hedgeTradeVol; if (tradeHedgeVols.ContainsKey(tradeIdHedgeVol.Key)) { hedgeTradeVol = tradeHedgeVols[tradeIdHedgeVol.Key]; } else { hedgeTradeVol = new trade_hedge_vol { TradeId = tradeIdHedgeVol.Key, ValueDate = valueDate, }; con.trade_hedge_vol.Add(hedgeTradeVol); } hedgeTradeVol.OptId = userId; hedgeTradeVol.OptName = userName; hedgeTradeVol.OptDate = DateTime.Now; hedgeTradeVol.TradeSavedVol = tradeIdHedgeVol.Value; } con.SaveChanges(); } } /// /// 获取对冲波动率 /// public static double GetTradeHedgeVol(OtcTrade trade, DateTime valueDate) { if (trade is null) { throw new ArgumentNullException(nameof(trade)); } return GetTradeHedgeVol(trade.id, valueDate, trade.TradeSavedVol ?? ConsGlobal.DefaultVol); } /// /// 获取对冲波动率 /// /// 交易ID /// 取值日期 /// 交易表数据中tradeSavedVol值 public static double GetTradeHedgeVol(int tradeId, DateTime valueDate, double? tradeSavedVol = null) { if (tradeId <= 0) { throw new ServiceException($"{nameof(tradeId)}应该大于0"); } using (var db = DbContextFactory.GetYLDbContext()) { var tradeHedgeVol = db.trade_hedge_vol.Where(v => v.TradeId == tradeId && v.ValueDate <= valueDate) .OrderByDescending(v => v.ValueDate).Select(n => (double?)n.TradeSavedVol).FirstOrDefault(); if (tradeHedgeVol.HasValue) { return tradeHedgeVol.Value; } if (tradeSavedVol.HasValue) { return tradeSavedVol.Value; } var trade = db.trade.Where(t => t.id == tradeId && t.ValidState != "InValid") .Select(n => new { n.TradeSavedVol }).FirstOrDefault(); if (trade == null) { throw new ServiceException("系统中不存在相关交易"); } return trade.TradeSavedVol ?? ConsGlobal.DefaultVol; } } } }