110 lines
3.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|