Files
zszq-trs/YLErpDAL/Modules/VolatilityModule/TradeHedgeVolService.cs
2024-05-09 14:06:26 +08:00

110 lines
3.8 KiB
C#

using YLErp.BLL;
namespace YLErp.Modules.VolatilityModule
{
/// <summary>
/// 交易对冲波动率服务
/// </summary>
public class TradeHedgeVolService
{
/// <summary>
/// 批量保存对冲波动率
/// </summary>
public void SaveTradeHedgeVols(Dictionary<int, double> 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();
}
}
/// <summary>
/// 获取对冲波动率
/// </summary>
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);
}
/// <summary>
/// 获取对冲波动率
/// </summary>
/// <param name="tradeId">交易ID</param>
/// <param name="valueDate">取值日期</param>
/// <param name="tradeSavedVol">交易表数据中tradeSavedVol值</param>
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;
}
}
}
}