using YLErp.Modules.CalculationModule; using YLErp.Modules.TradeRiskCalcModule.TaskRunner; namespace YLErp.Modules.TradeRiskCalcModule { public class DongZhengDeltaT1Service { public void ReCalcDeltaT1(TradingRiskResult curResult, DateTime valueTime) { var tradeSource = TradeRiskCalcTaskRunner.TradeDataSource.GetOtcTrades(); foreach (var item in curResult.TradeRiskList) { if (item.viewList == null) { continue; } item.DeltaT1 = 0; item.DeltaT1Lots = 0; foreach (var item2 in item.viewList) { trade td = new trade(); if (item2.TradeType == "场内期权") { var tempUm = DataCacheProvider.GetUnderlyingDataSource().GetData(item2.UnderlyingCode); var exchangeOption = DataCacheProvider.GetExchangeListOptionDataSource().GetData(item2.ExchangeOptionCode); td = new trade { TradeType = item2.TradeType, UnderlyingCode = item2.UnderlyingCode, UnderlyingId = item2.UnderlyingId ?? 0, TradeDate = valueTime.Date, BuySell = item2.BuySell, StartDate = valueTime.Date, ExerciseDate = item2.ExerciseDate, MaturityDate = tempUm.MaturityDate, TradePrice = Math.Abs(item2.Cost), TradeStatus = "确认成交", ExerciseMode = exchangeOption.ExerciseMode, OptionType = exchangeOption.OptionType, Strike = item2.Strike, Notional = item2.Notional, UnderlyingInstrumentType = tempUm.UnderlyingInstrumentType, ExchangeOptionCode = item2.ExchangeOptionCode, AssetId = item2.BookId, id = 0, UnderlyingAssetClass = tempUm.UnderlyingType, NoRiskRate = BLL.valuedateBLL.SysRiskFreeRate(), DividendRate = tempUm.DividendRate ?? BLL.valuedateBLL.SysRiskFreeRate(), }; } else { td = tradeSource.FirstOrDefault(n => n.id == item2.TradeId); } if (td != null) { var un = DataCacheProvider.GetUnderlyingDataSource().GetData(item2.UnderlyingCode); if (new List() { "远期", "商品期货", "股票", "自定义交易", "收益互换" }.Contains(td.TradeType)) { item2.DeltaT1 = item2.Delta; } else { var req = new OptionValueCalcRequest(item2.NoRiskRate ?? BLL.valuedateBLL.SysRiskFreeRate()) { calcScenario = Enums.CalcScenarioEnum.RealtimeRisk, pricingRequest = Qdp.Pricing.Base.Implementations.PricingRequest.Delta, spotPrices = new[] { item2.SpotPrice ?? 0 }, vols = new[] { item2.Vol }, timeToMaturityDays = TradeCalcHelper.CalculateTTMDays(valueTime.Date, td.ExerciseDate.Value, un?.UnderlyingTypeId ?? 0, false, serverDateTime: valueTime) }; if (td.TradeType == "亚式期权") { req.fixings = AsiaOptionProvider.Default.GetFixingString(valueTime.Date, td, td.trade_asian_option); } try { if (valueTime > td.ExerciseDate) { item2.DeltaT1 = 0; } else { var result = OptionCalculatorV2.GetOptionValueResult(valueTime.Date, td, req, out _); item2.DeltaT1 = result.Delta; } } catch { } } item2.DeltaT1Lots = un == null || un.ContractSize < 1 ? item2.DeltaT1 : item2.DeltaT1 / un.ContractSize; } item.DeltaT1 += (item2.DeltaT1 ?? 0); item.DeltaT1Lots += (item2.DeltaT1Lots ?? 0); } } } } }