Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #4
0
        public static Notional Create(NonNegativeAmountSchedule schedule)
        {
            var result = new Notional {
                notionalStepSchedule = schedule
            };

            return(result);
        }
Example #5
0
        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);
        }
Example #7
0
        public static List <DateTime> GetStepDates(NonNegativeAmountSchedule schedule)
        {
            var result = new List <DateTime>();

            foreach (var step in schedule.step)
            {
                result.Add(step.stepDate);
            }
            return(result);
        }
Example #8
0
        /// <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());
        }
Example #9
0
        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);
        }
Example #11
0
        /// <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);
        }
Example #12
0
        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);
        }
Example #15
0
        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);
        }
Example #17
0
        /// <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);
        }
Example #18
0
        /// <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);
        }
Example #19
0
        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);
        }
Example #20
0
 public static List <DateTime> GetStepDates(NonNegativeAmountSchedule schedule)
 {
     return(schedule.step.Select(step => step.stepDate).ToList());
 }
Example #21
0
        /// <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);
        }
Example #22
0
        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);
        }