public static decimal GetValue(NonNegativeAmountSchedule schedule, DateTime dateTime) { // override of above if (null == schedule.step || 0 == schedule.step.Length) { return(schedule.initialValue); } DateTime dateOfFirstStep = schedule.step[0].stepDate; if (dateTime < dateOfFirstStep) { return(schedule.initialValue); } decimal returnValue = schedule.step[0].stepValue; foreach (var step in schedule.step) { if (dateTime >= step.stepDate) { returnValue = step.stepValue; } } return(returnValue); }
public static Decimal GetNotionalValue(Notional notional, DateTime dateTime) { if (null == notional.notionalStepSchedule.step) { return(notional.notionalStepSchedule.initialValue); } // I assume that the dates in a step schedule are in the ascensing order. // NonNegativeAmountSchedule notionalStepSchedule = notional.notionalStepSchedule; var listOfStepDates = new ArrayList(); var listOfStepValues = new ArrayList(); foreach (var step in notionalStepSchedule.step) { listOfStepDates.Add(step.stepDate); listOfStepValues.Add(step.stepValue); } int foundAtIndex = listOfStepDates.BinarySearch(dateTime); if (foundAtIndex < 0) { int indexOfLargeDate = ~foundAtIndex; if (0 == indexOfLargeDate) { return(notional.notionalStepSchedule.initialValue); } var val = (decimal)listOfStepValues[indexOfLargeDate - 1]; return(val); } return((decimal)listOfStepValues[foundAtIndex]); }
/// <summary> /// /// </summary> /// <param name="capFloorLeg"></param> /// <param name="fixingCalendar"></param> /// <param name="paymentCalendar"></param> /// <param name="spreadSchedule"></param> /// <param name="capOrFloorSchedule"></param> /// <param name="notionalSchedule"></param> /// <returns></returns> public static CapFloor GenerateDefinitionCashflows(IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, CapFloorLegParametersRange_Old capFloorLeg, Schedule spreadSchedule, Schedule capOrFloorSchedule, NonNegativeAmountSchedule notionalSchedule) { CapFloor capFloor = GenerateDefiniton(capFloorLeg, spreadSchedule, capOrFloorSchedule, notionalSchedule); if (null != spreadSchedule) { InterestRateStreamParametricDefinitionGenerator.SetSpreadSchedule(capFloor.capFloorStream, spreadSchedule); } if (null != notionalSchedule) { InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(capFloor.capFloorStream, notionalSchedule); } if (null != capOrFloorSchedule) { if (capFloorLeg.CapOrFloor == CapFloorType.Cap) { InterestRateStreamParametricDefinitionGenerator.SetCapRateSchedule(capFloor.capFloorStream, capOrFloorSchedule, true); } else { InterestRateStreamParametricDefinitionGenerator.SetFloorRateSchedule(capFloor.capFloorStream, capOrFloorSchedule, true); } } capFloor.capFloorStream.cashflows = FixedAndFloatingRateStreamCashflowGenerator.GetCashflows(capFloor.capFloorStream, fixingCalendar, paymentCalendar); return(capFloor); }
public static Notional Create(NonNegativeAmountSchedule schedule) { var result = new Notional { notionalStepSchedule = schedule }; return(result); }
public static NonNegativeAmountSchedule Create(Currency value) { var amountSchedule = new NonNegativeAmountSchedule { currency = value }; return(amountSchedule); }
//public static void SetNotionalSchedule(InterestRateStream stream, AmountSchedule amountSchedule) //{ // Calculation calculation = XsdClassesFieldResolver.CalculationPeriodAmount_GetCalculation(stream.calculationPeriodAmount); // var notional = new Notional { notionalStepSchedule = amountSchedule }; // XsdClassesFieldResolver.Calculation_SetNotionalSchedule(calculation, notional); //} public static void SetNotionalSchedule(InterestRateStream stream, NonNegativeAmountSchedule amountSchedule) { Calculation calculation = XsdClassesFieldResolver.CalculationPeriodAmountGetCalculation(stream.calculationPeriodAmount); var notional = new Notional { notionalStepSchedule = amountSchedule }; XsdClassesFieldResolver.CalculationSetNotionalSchedule(calculation, notional); }
public static List <DateTime> GetStepDates(NonNegativeAmountSchedule schedule) { var result = new List <DateTime>(); foreach (var step in schedule.step) { result.Add(step.stepDate); } return(result); }
/// <summary> /// /// </summary> /// <param name="notionalStepSchedule"></param> /// <param name="dates"></param> /// <returns></returns> protected static decimal[] CreateWeightingsFromNonNegativeNotionalSchedule(NonNegativeAmountSchedule notionalStepSchedule, IList <DateTime> dates) { var result = new List <Decimal>(); var initalNotional = notionalStepSchedule.initialValue; if (null != notionalStepSchedule.step)//there should be steps - otherwise NO interm. exchanges. { result.AddRange(dates.Select(date => ScheduleHelper.GetValue(notionalStepSchedule, date)).Select(stepAmount => stepAmount / initalNotional)); } return(result.ToArray()); }
public static NonNegativeAmountSchedule Create(NonNegativeSchedule schedule, Currency currency) { var result = new NonNegativeAmountSchedule { currency = currency, initialValue = schedule.initialValue, step = schedule.step }; return(result); }
/// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="cache"></param> /// <param name="nameSpace"></param> /// <param name="fixingCalendar"></param> /// <param name="paymentCalendar"></param> /// <param name="capFloorLeg"></param> /// <param name="spreadSchedule"></param> /// <param name="capOrFloorSchedule"></param> /// <param name="notionalSchedule"></param> /// <returns></returns> public static CapFloor GenerateDefinitionCashflowsAmounts(ILogger logger, ICoreCache cache, String nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, CapFloorLegParametersRange capFloorLeg, Schedule spreadSchedule, Schedule capOrFloorSchedule, NonNegativeAmountSchedule notionalSchedule) { var capFloor = GenerateDefinitionCashflows(logger, cache, nameSpace, fixingCalendar, paymentCalendar, capFloorLeg, spreadSchedule, capOrFloorSchedule, notionalSchedule); return(capFloor); }
/// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="cache"></param> /// <param name="nameSpace"></param> /// <param name="leg1Parameters"></param> /// <param name="leg1Calendars"></param> /// <param name="leg2Parameters"></param> /// <param name="leg2Calendars"></param> /// <param name="fixedRateSchedule"></param> /// <param name="spreadSchedule"></param> /// <param name="notionalSchedule"></param> /// <returns></returns> public static Swap GenerateDefinitionCashflowsAmounts(ILogger logger, ICoreCache cache, string nameSpace, SwapLegParametersRange leg1Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg1Calendars, SwapLegParametersRange leg2Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg2Calendars, Schedule fixedRateSchedule, Schedule spreadSchedule, NonNegativeAmountSchedule notionalSchedule) { var swap = GenerateDefinitionCashflows(logger, cache, nameSpace, leg1Parameters, leg1Calendars, leg2Parameters, leg2Calendars, fixedRateSchedule, spreadSchedule, notionalSchedule); return(swap); }
private static InterestRateStream GetCashflowsScheduleWithNotionalSchedule( IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, SwapLegParametersRange_Old legParametersRange, NonNegativeAmountSchedule notionalSchedule) { InterestRateStream stream = InterestRateStreamParametricDefinitionGenerator.GenerateStreamDefinition(legParametersRange); InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(stream, notionalSchedule); Cashflows cashflows = FixedAndFloatingRateStreamCashflowGenerator.GetCashflows(stream, fixingCalendar, paymentCalendar); stream.cashflows = cashflows; return(stream); }
/// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="cache"></param> /// <param name="capFloorLeg"></param> /// <param name="nameSpace"></param> /// <param name="fixingCalendar"></param> /// <param name="paymentCalendar"></param> /// <param name="spreadSchedule"></param> /// <param name="capOrFloorSchedule"></param> /// <param name="notionalSchedule"></param> /// <returns></returns> public static CapFloor GenerateDefinitionCashflows(ILogger logger, ICoreCache cache, string nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, CapFloorLegParametersRange capFloorLeg, Schedule spreadSchedule, Schedule capOrFloorSchedule, NonNegativeAmountSchedule notionalSchedule) { if (paymentCalendar == null) { if (!string.IsNullOrEmpty(capFloorLeg.PaymentCalendar)) { var payCalendar = BusinessCentersHelper.Parse(capFloorLeg.PaymentCalendar); paymentCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, payCalendar, nameSpace); } } if (fixingCalendar == null) { if (!string.IsNullOrEmpty(capFloorLeg.FixingCalendar)) { var fixCalendar = BusinessCentersHelper.Parse(capFloorLeg.FixingCalendar); fixingCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, fixCalendar, nameSpace); } } CapFloor capFloor = GenerateDefiniton(capFloorLeg, spreadSchedule, capOrFloorSchedule, notionalSchedule); if (null != spreadSchedule) { InterestRateStreamParametricDefinitionGenerator.SetSpreadSchedule(capFloor.capFloorStream, spreadSchedule); } if (null != notionalSchedule) { InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(capFloor.capFloorStream, notionalSchedule); } if (null != capOrFloorSchedule) { if (capFloorLeg.CapOrFloor == CapFloorType.Cap) { InterestRateStreamParametricDefinitionGenerator.SetCapRateSchedule(capFloor.capFloorStream, capOrFloorSchedule, true); } else { InterestRateStreamParametricDefinitionGenerator.SetFloorRateSchedule(capFloor.capFloorStream, capOrFloorSchedule, true); } } capFloor.capFloorStream.cashflows = FixedAndFloatingRateStreamCashflowGenerator.GetCashflows(capFloor.capFloorStream, fixingCalendar, paymentCalendar); return(capFloor); }
/// <summary> /// /// </summary> /// <param name="fixingCalendar"></param> /// <param name="paymentCalendar"></param> /// <param name="capFloorLeg"></param> /// <param name="spreadSchedule"></param> /// <param name="capOrFloorSchedule"></param> /// <param name="notionalSchedule"></param> /// <param name="marketEnvironment"></param> /// <param name="valuationDate"></param> /// <returns></returns> public static CapFloor GenerateDefinitionCashflowsAmounts(IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, CapFloorLegParametersRange_Old capFloorLeg, Schedule spreadSchedule, Schedule capOrFloorSchedule, NonNegativeAmountSchedule notionalSchedule, ISwapLegEnvironment marketEnvironment, DateTime valuationDate) { CapFloor capFloor = GenerateDefinitionCashflows(fixingCalendar, paymentCalendar, capFloorLeg, spreadSchedule, capOrFloorSchedule, notionalSchedule); IRateCurve payStreamDiscountingCurve = marketEnvironment.GetDiscountRateCurve(); IRateCurve payStreamForecastCurve = marketEnvironment.GetForecastRateCurve(); FixedAndFloatingRateStreamCashflowGenerator.UpdateCashflowsAmounts(capFloor.capFloorStream, payStreamForecastCurve, payStreamDiscountingCurve, valuationDate); return(capFloor); }
public List <DetailedCashflowRangeItem> GetDetailedCashflowsWithNotionalSchedule( ILogger logger, ICoreCache cache, String nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, SwapLegParametersRange_Old legParametersRange, List <DateTimeDoubleRangeItem> notionalValueItems, ValuationRange valuationRange) { var tempList = notionalValueItems.Select(item => new Pair <DateTime, decimal>(item.DateTime, Convert.ToDecimal(item.Value))).ToList(); NonNegativeSchedule notionalScheduleFpML = NonNegativeScheduleHelper.Create(tempList); Currency currency = CurrencyHelper.Parse(legParametersRange.Currency); NonNegativeAmountSchedule amountSchedule = NonNegativeAmountScheduleHelper.Create(notionalScheduleFpML, currency); InterestRateStream interestRateStream = GetCashflowsScheduleWithNotionalSchedule(fixingCalendar, paymentCalendar, legParametersRange, amountSchedule); UpdateCashflowsWithAmounts(logger, cache, nameSpace, interestRateStream, legParametersRange, valuationRange); var list = new List <DetailedCashflowRangeItem>(); //int periodNumber = 1; foreach (PaymentCalculationPeriod paymentCalculationPeriod in interestRateStream.cashflows.paymentCalculationPeriod) { var detailedCashflowRangeItem = new DetailedCashflowRangeItem(); list.Add(detailedCashflowRangeItem); detailedCashflowRangeItem.PaymentDate = paymentCalculationPeriod.adjustedPaymentDate; detailedCashflowRangeItem.StartDate = PaymentCalculationPeriodHelper.GetCalculationPeriodStartDate(paymentCalculationPeriod); detailedCashflowRangeItem.EndDate = PaymentCalculationPeriodHelper.GetCalculationPeriodEndDate(paymentCalculationPeriod); //detailedCashflowRangeItem.NumberOfDays = PaymentCalculationPeriodHelper.GetNumberOfDays(paymentCalculationPeriod); //detailedCashflowRangeItem.FutureValue = MoneyHelper.ToDouble(paymentCalculationPeriod.forecastPaymentAmount); //detailedCashflowRangeItem.PresentValue = MoneyHelper.ToDouble(paymentCalculationPeriod.presentValueAmount); //detailedCashflowRangeItem.DiscountFactor = (double)paymentCalculationPeriod.discountFactor; detailedCashflowRangeItem.NotionalAmount = (double)PaymentCalculationPeriodHelper.GetNotionalAmount(paymentCalculationPeriod); detailedCashflowRangeItem.CouponType = GetCouponType(paymentCalculationPeriod); detailedCashflowRangeItem.Rate = (double)PaymentCalculationPeriodHelper.GetRate(paymentCalculationPeriod); // If floating rate - retrieve the spread. // if (legParametersRange.IsFloatingLegType()) { detailedCashflowRangeItem.Spread = (double)PaymentCalculationPeriodHelper.GetSpread(paymentCalculationPeriod); } } return(list); }
public static Calculation CreateFixed(decimal fixedRate, NonNegativeAmountSchedule notionalSchedule, DayCountFraction dayCountFraction, DiscountingTypeEnum?discountingType) { var discounting = discountingType != null ? DiscountingHelper.Create(fixedRate, dayCountFraction, (DiscountingTypeEnum)discountingType) : null; var calculation = new Calculation { Item = NotionalFactory.Create(notionalSchedule), compoundingMethod = CompoundingMethodEnum.None, compoundingMethodSpecified = true, dayCountFraction = dayCountFraction, discounting = discounting, Items = new object[] { FixedRateScheduleHelper.Create(fixedRate) } }; return(calculation); }
/// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="cache"></param> /// <param name="nameSpace"></param> /// <param name="leg1Parameters"></param> /// <param name="leg1Calendars"></param> /// <param name="leg2Parameters"></param> /// <param name="leg2Calendars"></param> /// <param name="fixedRateSchedule"></param> /// <param name="spreadSchedule"></param> /// <param name="notionalSchedule"></param> /// <param name="marketEnvironment"></param> /// <param name="valuationDate"></param> /// <returns></returns> public static Swap GenerateDefinitionCashflowsAmounts(ILogger logger, ICoreCache cache, string nameSpace, SwapLegParametersRange_Old leg1Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg1Calendars, SwapLegParametersRange_Old leg2Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg2Calendars, Schedule fixedRateSchedule, Schedule spreadSchedule, NonNegativeAmountSchedule notionalSchedule, ISwapLegEnvironment marketEnvironment, DateTime valuationDate) { var swap = GenerateDefinitionCashflows(logger, cache, nameSpace, leg1Parameters, leg1Calendars, leg2Parameters, leg2Calendars, fixedRateSchedule, spreadSchedule, notionalSchedule); InterestRateStream stream1 = swap.swapStream[0]; InterestRateStream stream2 = swap.swapStream[1]; UpdateStreamCashflowsAmounts(leg1Parameters, stream1, marketEnvironment, valuationDate); UpdateStreamCashflowsAmounts(leg2Parameters, stream2, marketEnvironment, valuationDate); return(swap); }
/// <summary> /// /// </summary> /// <param name="leg1Parameters"></param> /// <param name="leg1PaymentCalendar"> </param> /// <param name="capStrikeSchedule"></param> /// <param name="floorStrikeSchedule"> </param> /// <param name="spreadSchedule"></param> /// <param name="notionalSchedule"></param> /// <param name="leg1FixingCalendar"> </param> /// <returns></returns> public static Trade CreateTrade(CapFloorLegParametersRange leg1Parameters, IBusinessCalendar leg1FixingCalendar, IBusinessCalendar leg1PaymentCalendar, Schedule capStrikeSchedule, Schedule floorStrikeSchedule, Schedule spreadSchedule, NonNegativeAmountSchedule notionalSchedule) { var stream1 = GetCashflowsSchedule(leg1FixingCalendar, leg1PaymentCalendar, leg1Parameters); if (null != capStrikeSchedule && null != floorStrikeSchedule) { InterestRateStreamParametricDefinitionGenerator.SetCapRateSchedule(stream1, capStrikeSchedule, true); InterestRateStreamParametricDefinitionGenerator.SetFloorRateSchedule(stream1, floorStrikeSchedule, false); } if (null != capStrikeSchedule && null == floorStrikeSchedule) { InterestRateStreamParametricDefinitionGenerator.SetCapRateSchedule(stream1, capStrikeSchedule, true); } if (null == capStrikeSchedule && null != floorStrikeSchedule) { InterestRateStreamParametricDefinitionGenerator.SetFloorRateSchedule(stream1, floorStrikeSchedule, true); } if (null != spreadSchedule) //for float legs only { InterestRateStreamParametricDefinitionGenerator.SetSpreadSchedule(stream1, spreadSchedule); } if (null != notionalSchedule) { // Set notional schedule // InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(stream1, notionalSchedule); } var capFloor = CapFloorFactory.Create(stream1); var trade = new Trade(); XsdClassesFieldResolver.TradeSetCapFloor(trade, capFloor); return(trade); }
public List <PrincipalExchangeCashflowRangeItem> GetPrincipalExchanges( ILogger logger, ICoreCache cache, String nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, SwapLegParametersRange_Old legParametersRange, List <DateTimeDoubleRangeItem> notionalValueItems, ValuationRange valuationRange) { InterestRateStream interestRateStream; if (notionalValueItems.Count > 0) { var tempList = notionalValueItems.Select(item => new Pair <DateTime, decimal>(item.DateTime, Convert.ToDecimal(item.Value))).ToList(); NonNegativeSchedule notionalScheduleFpML = NonNegativeScheduleHelper.Create(tempList); Currency currency = CurrencyHelper.Parse(legParametersRange.Currency); NonNegativeAmountSchedule amountSchedule = NonNegativeAmountScheduleHelper.Create(notionalScheduleFpML, currency); interestRateStream = GetCashflowsScheduleWithNotionalSchedule(fixingCalendar, paymentCalendar, legParametersRange, amountSchedule); } else { interestRateStream = GetCashflowsSchedule(fixingCalendar, paymentCalendar, legParametersRange); } UpdateCashflowsWithAmounts(logger, cache, nameSpace, interestRateStream, legParametersRange, valuationRange); var list = new List <PrincipalExchangeCashflowRangeItem>(); //int periodNumber = 0; foreach (PrincipalExchange principleExchange in interestRateStream.cashflows.principalExchange) { var principalExchangeCashflowRangeItem = new PrincipalExchangeCashflowRangeItem(); list.Add(principalExchangeCashflowRangeItem); principalExchangeCashflowRangeItem.PaymentDate = principleExchange.adjustedPrincipalExchangeDate; principalExchangeCashflowRangeItem.Amount = (double)principleExchange.principalExchangeAmount; //principalExchangeCashflowRangeItem.PresentValueAmount = MoneyHelper.ToDouble(principleExchange.presentValuePrincipalExchangeAmount); //principalExchangeCashflowRangeItem.DiscountFactor = (double)principleExchange.discountFactor; } return(list); }
public static List <DateTime> GetStepDates(NonNegativeAmountSchedule schedule) { return(schedule.step.Select(step => step.stepDate).ToList()); }
/// <summary> /// /// </summary> /// <param name="logger"></param> /// <param name="cache"></param> /// <param name="nameSpace"></param> /// <param name="leg1Parameters"></param> /// <param name="leg1Calendars"></param> /// <param name="leg2Parameters"></param> /// <param name="leg2Calendars"></param> /// <param name="fixedRateSchedule"></param> /// <param name="spreadSchedule"></param> /// <param name="notionalSchedule"></param> /// <returns></returns> public static Swap GenerateDefinitionCashflows(ILogger logger, ICoreCache cache, string nameSpace, SwapLegParametersRange leg1Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg1Calendars, SwapLegParametersRange leg2Parameters, Pair <IBusinessCalendar, IBusinessCalendar> leg2Calendars, Schedule fixedRateSchedule, Schedule spreadSchedule, NonNegativeAmountSchedule notionalSchedule) { IBusinessCalendar leg1PaymentCalendar = null; IBusinessCalendar leg2PaymentCalendar = null; IBusinessCalendar leg1FixingCalendar = null; IBusinessCalendar leg2FixingCalendar = null; if (leg1Calendars != null) { leg1FixingCalendar = leg1Calendars.First; leg1PaymentCalendar = leg1Calendars.Second; } else { if (!string.IsNullOrEmpty(leg1Parameters.PaymentCalendar)) { var payCalendar = BusinessCentersHelper.Parse(leg1Parameters.PaymentCalendar); leg1PaymentCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, payCalendar, nameSpace); leg1FixingCalendar = leg1PaymentCalendar; } if (!string.IsNullOrEmpty(leg1Parameters.FixingCalendar)) { var fixingCalendar = BusinessCentersHelper.Parse(leg1Parameters.FixingCalendar); leg1FixingCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, fixingCalendar, nameSpace); } } if (leg2Calendars != null) { leg2FixingCalendar = leg2Calendars.First; leg2PaymentCalendar = leg2Calendars.Second; } else { if (!string.IsNullOrEmpty(leg2Parameters.PaymentCalendar)) { var payCalendar = BusinessCentersHelper.Parse(leg2Parameters.PaymentCalendar); leg2PaymentCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, payCalendar, nameSpace); leg2FixingCalendar = leg2PaymentCalendar; } if (!string.IsNullOrEmpty(leg2Parameters.FixingCalendar)) { var fixingCalendar = BusinessCentersHelper.Parse(leg2Parameters.FixingCalendar); leg2FixingCalendar = BusinessCenterHelper.ToBusinessCalendar(cache, fixingCalendar, nameSpace); } } var swap = GenerateDefiniton(leg1Parameters, leg2Parameters); InterestRateStream stream1 = swap.swapStream[0]; InterestRateStream stream2 = swap.swapStream[1]; if (null != fixedRateSchedule) { // Set FixedRateSchedule (if this is a fixed leg) // if (leg1Parameters.IsFixedLegType()) { InterestRateStreamParametricDefinitionGenerator.SetFixedRateSchedule(stream1, fixedRateSchedule); } // Set FixedRateSchedule (if this is a fixed leg) // if (leg2Parameters.IsFixedLegType()) { InterestRateStreamParametricDefinitionGenerator.SetFixedRateSchedule(stream2, fixedRateSchedule); } } if (null != spreadSchedule) //for float legs only { if (leg1Parameters.IsFloatingLegType()) { InterestRateStreamParametricDefinitionGenerator.SetSpreadSchedule(stream1, spreadSchedule); } if (leg2Parameters.IsFloatingLegType()) { InterestRateStreamParametricDefinitionGenerator.SetSpreadSchedule(stream2, spreadSchedule); } } if (null != notionalSchedule) { // Set notional schedule // InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(stream1, notionalSchedule); InterestRateStreamParametricDefinitionGenerator.SetNotionalSchedule(stream2, notionalSchedule); } stream1.cashflows = FixedAndFloatingRateStreamCashflowGenerator.GetCashflows(stream1, leg1FixingCalendar, leg1PaymentCalendar); stream2.cashflows = FixedAndFloatingRateStreamCashflowGenerator.GetCashflows(stream2, leg2FixingCalendar, leg2PaymentCalendar); return(swap); }
public List <DetailedCashflowRangeItem> GetDetailedCashflowsWithNotionalSchedule( ILogger logger, ICoreCache cache, String nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, CapFloorLegParametersRange_Old legParametersRange, List <DateTimeDoubleRangeItem> notionalValueItems, ValuationRange valuationRange) { //Check if the calendars are null. If not build them! var list1 = notionalValueItems.Select(item => new Pair <DateTime, decimal>(item.DateTime, Convert.ToDecimal(item.Value))).ToList(); NonNegativeSchedule notionalScheduleFpML = NonNegativeScheduleHelper.Create(list1); Currency currency = CurrencyHelper.Parse(legParametersRange.Currency); NonNegativeAmountSchedule amountSchedule = NonNegativeAmountScheduleHelper.Create(notionalScheduleFpML, currency); InterestRateStream interestRateStream = GetCashflowsScheduleWithNotionalSchedule(fixingCalendar, paymentCalendar, legParametersRange, amountSchedule); //Add the principal exchanges to the cashflows. var principalExchangeList = list1.Select(cashflow => new PrincipalExchange { adjustedPrincipalExchangeDate = cashflow.First, adjustedPrincipalExchangeDateSpecified = true, principalExchangeAmount = cashflow.Second, principalExchangeAmountSpecified = true }).ToArray(); interestRateStream.cashflows.principalExchange = principalExchangeList; UpdateCashflowsWithAmounts(logger, cache, nameSpace, interestRateStream, legParametersRange, valuationRange); var list = new List <DetailedCashflowRangeItem>(); foreach (PaymentCalculationPeriod paymentCalculationPeriod in interestRateStream.cashflows.paymentCalculationPeriod) { var detailedCashflowRangeItem = new DetailedCashflowRangeItem(); detailedCashflowRangeItem.PaymentDate = paymentCalculationPeriod.adjustedPaymentDate; detailedCashflowRangeItem.StartDate = PaymentCalculationPeriodHelper.GetCalculationPeriodStartDate(paymentCalculationPeriod); detailedCashflowRangeItem.EndDate = PaymentCalculationPeriodHelper.GetCalculationPeriodEndDate(paymentCalculationPeriod); detailedCashflowRangeItem.NumberOfDays = PaymentCalculationPeriodHelper.GetNumberOfDays(paymentCalculationPeriod); detailedCashflowRangeItem.FutureValue = MoneyHelper.ToDouble(paymentCalculationPeriod.forecastPaymentAmount); detailedCashflowRangeItem.PresentValue = MoneyHelper.ToDouble(paymentCalculationPeriod.presentValueAmount); detailedCashflowRangeItem.DiscountFactor = (double)paymentCalculationPeriod.discountFactor; detailedCashflowRangeItem.NotionalAmount = (double)PaymentCalculationPeriodHelper.GetNotionalAmount(paymentCalculationPeriod); detailedCashflowRangeItem.CouponType = GetCouponType(paymentCalculationPeriod); detailedCashflowRangeItem.Rate = (double)PaymentCalculationPeriodHelper.GetRate(paymentCalculationPeriod); CalculationPeriod calculationPeriod = PaymentCalculationPeriodHelper.GetCalculationPeriods(paymentCalculationPeriod)[0]; FloatingRateDefinition floatingRateDefinition = XsdClassesFieldResolver.CalculationPeriodGetFloatingRateDefinition(calculationPeriod); switch (detailedCashflowRangeItem.CouponType.ToLower()) { case "cap": { Strike strike = floatingRateDefinition.capRate[0]; detailedCashflowRangeItem.StrikeRate = (double)strike.strikeRate; break; } case "floor": { Strike strike = floatingRateDefinition.floorRate[0]; detailedCashflowRangeItem.StrikeRate = (double)strike.strikeRate; break; } default: { string message = String.Format("Specified coupon type : '{0}' is not supported. Please use one of these: 'cap, floor'", detailedCashflowRangeItem.CouponType.ToLower()); throw new NotSupportedException(message); } } // If floating rate - retrieve the spread. // detailedCashflowRangeItem.Spread = (double)PaymentCalculationPeriodHelper.GetSpread(paymentCalculationPeriod); var fixingDate = new DateTime(); var tempDate = PaymentCalculationPeriodHelper.GetFirstFloatingFixingDate(paymentCalculationPeriod); if (tempDate != null) { fixingDate = (DateTime)tempDate; } detailedCashflowRangeItem.FixingDate = fixingDate; detailedCashflowRangeItem.Currency = "Not Specified"; if (currency != null) { detailedCashflowRangeItem.Currency = currency.Value; } list.Add(detailedCashflowRangeItem); } return(list); }