/// <summary> /// Returns the known reset rate if necessary, either via user-specified known rate or rate fixings file. Returns null if either reset rate is not necessary or not found. /// </summary> private static double?GetKnownResetRate(TDate baseDate, TDate resetDate, TDate paymentDate, YesNo useKnownRate, double knownRate, string rateFixing, RateFixingsProvider rateFixingsProvider, Deal deal) { double?knownResetRate = null; if (paymentDate >= baseDate && resetDate <= baseDate) { if (useKnownRate == YesNo.Yes) { knownResetRate = knownRate; } else if (!string.IsNullOrWhiteSpace(rateFixing) && rateFixingsProvider != null) { // Try get realized reset rate from Rate fixing file. DateTime[] missingDates = { DateTime.FromOADate(resetDate) }; var fixings = CashflowsFixingsHelper.GetRateFixings(rateFixing, missingDates, rateFixingsProvider, baseDate, deal); if (fixings != null && fixings.Length != 0 && !double.IsNaN(fixings[0])) { knownResetRate = fixings[0]; } } } return(knownResetRate); }
/// <summary> /// Calculate the dates and years fractions not specified on the deal and get any known rates. /// </summary> public void Prepare(double baseDate, RateFixingsProvider rateFixings) { // Calculates various date properties of the deal and cache them. var deal = (FloatingInterestCashflowInterpolatedDeal)Deal; var accrualCalendars = deal.GetAccrualHolidayCalendars(); var rateCalendars = deal.GetRateHolidayCalendars(); fPaymentDate = deal.Payment_Date; if (deal.Accrual_Year_Fraction > 0.0) { fAccrualYearFraction = deal.Accrual_Year_Fraction; } else { fAccrualYearFraction = CalcUtils.DayCountFraction(deal.Accrual_Start_Date, deal.Accrual_End_Date, deal.Accrual_Day_Count, accrualCalendars); } fKnownResetRate1 = null; fKnownResetRate2 = null; if (deal.HasRate1()) { if (deal.Rate_1_End_Date > 0.0) { fRate1EndDate = deal.Rate_1_End_Date; } else { fRate1EndDate = DateAdjuster.Add(deal.Rate_Start_Date, deal.Rate_1_Tenor, 1, rateCalendars, true, deal.Rate_Adjustment_Method, deal.Rate_Sticky_Month_End == YesNo.Yes).ToOADate(); } if (deal.Rate_1_Year_Fraction > 0.0) { fRate1YearFraction = deal.Rate_1_Year_Fraction; } else { fRate1YearFraction = CalcUtils.DayCountFraction(deal.Rate_Start_Date, fRate1EndDate, deal.Rate_Day_Count, rateCalendars, deal.Rate_1_Tenor); } fKnownResetRate1 = GetKnownResetRate(baseDate, deal.Reset_Date, fPaymentDate, deal.Use_Known_Rate_1, deal.Known_Rate_1, deal.Rate_1_Fixing, rateFixings, deal); } if (deal.HasRate2()) { if (deal.Rate_2_End_Date > 0.0) { fRate2EndDate = deal.Rate_2_End_Date; } else { fRate2EndDate = DateAdjuster.Add(deal.Rate_Start_Date, deal.Rate_2_Tenor, 1, rateCalendars, true, deal.Rate_Adjustment_Method, deal.Rate_Sticky_Month_End == YesNo.Yes).ToOADate(); } if (deal.Rate_2_Year_Fraction > 0.0) { fRate2YearFraction = deal.Rate_2_Year_Fraction; } else { fRate2YearFraction = CalcUtils.DayCountFraction(deal.Rate_Start_Date, fRate2EndDate, deal.Rate_Day_Count, rateCalendars, deal.Rate_2_Tenor); } fKnownResetRate2 = GetKnownResetRate(baseDate, deal.Reset_Date, fPaymentDate, deal.Use_Known_Rate_2, deal.Known_Rate_2, deal.Rate_2_Fixing, rateFixings, deal); } }