using Qdp.Foundation.Implementations; using YLErp.BLL.Calculation; using YLErp.QdpModule; namespace YLErp.BLL { public delegate void ValueDateChangedEventHandler(object sender, EventArgs e); public static class valuedateBLL { public static string VanillaAmericanOptionName { get { var engineName = ""; switch (SystemDate.ConfigInfoData.ValueVanillaOptionMode) { case "BAW": engineName = "AnalyticalVanillaAmericanOptionBAWEngine"; break; case "二叉树": engineName = "BinomialTreeAmericanEngine"; break; default: break; } return engineName; } } /// /// 系统当前运行时间 /// public static valuedate SystemDate => InnerValueDate.Instance; /// /// 系统设置的二元期权的计算方法 /// public static string BinaryCalculation => SystemDate.BinaryCalculation; /// /// 二元期权的ReplicationStrategy /// public static string BinaryReplicationStrategy => (BinaryCalculation == "Replication") ? BinaryCalculation : "None"; /// /// 系统设置的无风险利率 /// public static double RiskFreeRate => SystemDate.RiskFreeRate ?? 0.0; /// /// 系统设置的无风险利率(除以100) /// public static double SysRiskFreeRate() { return RiskFreeRate / 100; } /// /// 系统设置的扩展无风险利率 /// public static double RiskFreeRateExtend => SystemDate.RiskFreeRateExtend ?? 0.0; public static string RiskFreeCurveData => SystemDate.RiskFreeCurveData; /// /// 是否在手机报价端开启客户自助定价计算 /// public static bool EnableClientCalculation => SystemDate.EnableClientCalculation == 1; /// /// 是否开启手机端实时报价 /// public static bool EnableMobileQuotation => SystemDate.EnableMobileQuotation == 1; /// /// 手机端报价是否展示波动率报价 /// public static bool EnableMobileVolQuote => SystemDate.EnableMobileVolQuote == 1; public static string TradeDayCount => SystemDate.TradeDayCount; public static DateTime ValueDate { get { //自动更新时间 if (SystemDate.Type != "false" && SystemDate.ValueDate < DateTime.Today) { InnerValueDate.UpdateSystemDate(); } return SystemDate.ValueDate; } } public static DateTime? TwoSideMarginValueDate => SystemDate.TwoSideMarginValueDate; /// /// 获取系统时间 /// public static valuedate ResetValueDate() { return InnerValueDate.ResetValueDate(); } public static event ValueDateChangedEventHandler ValueDateChanged; /// /// 从利率曲线上获取无风险利率(无风险利率百分比数值) /// public static double GetRiskFreeRateFromCurve(DateTime? startDate, DateTime? endDate) { //为了与System.RiskFreeRate统一,所以乘以100 return GetRiskFreeRateFromCurveV2(startDate, endDate) * 100; } /// /// 从利率曲线上获取无风险利率(无风险利率真实值) /// public static double GetRiskFreeRateFromCurveV2(DateTime? startDate, DateTime? endDate) { var curveData = RiskFreeCurveData; if (string.IsNullOrWhiteSpace(curveData) || startDate == null || endDate == null) { return SysRiskFreeRate(); } var curvePoints = JsonHelper.Deserialize>(curveData); if (curvePoints == null || curvePoints.Count < 2) { return SysRiskFreeRate(); } var curve = CalculatorHelper.BuildIRCurve("RiskFreeCurve", startDate.Value, curvePoints); if (curve == null) { return SysRiskFreeRate(); } var qdpEnd = new Date(endDate.Value); return curve.GetSpotRate(qdpEnd); } /// /// 获取date(包括)之前的第一个非假日 /// public static DateTime GetNonHolidayDefore(DateTime date) { if (PS.Config.ErpElement.SupportMultiCalendar) { switch (date.DayOfWeek) { case DayOfWeek.Saturday: return date.AddDays(-1); case DayOfWeek.Sunday: return date.AddDays(-2); default: return date; } } else { return QdpCalendarHelper.GetNonHolidayDefore(date); } } /// /// 获取date(包括)之后的第一个非假日 /// public static DateTime GetNonHoliday(DateTime date) { if (PS.Config.ErpElement.SupportMultiCalendar) { switch (date.DayOfWeek) { case DayOfWeek.Saturday: return date.AddDays(2); case DayOfWeek.Sunday: return date.AddDays(1); default: return date; } } else { return QdpCalendarHelper.GetNonHoliday(date); } } /// /// /// public static bool IsHoliday(DateTime date) { if (PS.Config.ErpElement.SupportMultiCalendar) { switch (date.DayOfWeek) { case DayOfWeek.Saturday: case DayOfWeek.Sunday: return true; default: return false; } } else { return QdpCalendarHelper.IsHoliday(date); } } static class InnerValueDate { static DateTime _cacheUpdateTime; static valuedate _systemDate = null; /// /// 系统当前运行时间 /// public static valuedate Instance { get { if (_systemDate == null) { ResetValueDate(); } else { //自动更新系统时间为当前时间 UpdateSystemDate(); } return _systemDate; } } public static valuedate ResetValueDate() { lock (typeof(valuedate)) { using (var ylcon = new YLContext()) { _systemDate = ylcon.valuedate.FirstOrDefault(v => v.State == valuedate.当前使用); } } return _systemDate; } public static void UpdateSystemDate() { if (_cacheUpdateTime.AddSeconds(10) > DateTime.Now) { return; } _cacheUpdateTime = DateTime.Now; var tradingDay = GetEstimatedTradingDay(); if (_systemDate != null && _systemDate.ValueDate >= tradingDay) { return; } //更新为当天 using (var ylcon = Modules.DbContextFactory.GetYLDbContext()) { var curDate = ylcon.valuedate.FirstOrDefault(v => v.State == valuedate.当前使用); if (curDate == null) { var vd = new valuedate() { ValueDate = tradingDay, State = valuedate.当前使用, CreateTime = DateTime.Now }; ylcon.valuedate.Add(vd); _systemDate = vd; ylcon.SaveChanges(); } else { if (curDate.Type != "false" && curDate.ValueDate < tradingDay) //自动更新时间 { //如果当前时间是假日向后延 curDate.ValueDate = QdpCalendarHelper.GetNonHoliday(tradingDay); ylcon.SaveChanges(); } _systemDate = curDate; } } Task.Run(() => { ValueDateChanged?.Invoke(_systemDate, EventArgs.Empty); }); } /// /// 获取预估的交易日 /// private static DateTime GetEstimatedTradingDay() { var now = DateTime.Now; var tradingDay = now.Date; if (now.TimeOfDay > new TimeSpan(23, 59, 00)) { tradingDay = tradingDay.AddDays(1); } return GetNonHoliday(tradingDay); } } } }