Exemplo n.º 1
0
        private CurrencyAmount presentValueFromProductPresentValue(ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider, CurrencyAmount productPresentValue)
        {
            CurrencyAmount pvProduct = productPresentValue.multipliedBy(trade.Quantity);
            CurrencyAmount pvPayment = presentValueSettlement(trade, ratesProvider, discountingProvider);

            return(pvProduct.plus(pvPayment));
        }
Exemplo n.º 2
0
        private CurrencyAmount presentValueFromProductPresentValue(ResolvedFixedCouponBondTrade trade, LegalEntityDiscountingProvider provider, CurrencyAmount productPresentValue)
        {
            CurrencyAmount pvProduct = productPresentValue.multipliedBy(trade.Quantity);
            CurrencyAmount pvPayment = presentValuePayment(trade, provider);

            return(pvProduct.plus(pvPayment));
        }
Exemplo n.º 3
0
        //-------------------------------------------------------------------------
        private CurrencyAmount presentValueSettlement(ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider)
        {
            if (!trade.Settlement.Present)
            {
                // position has no settlement, thus it has no value
                return(CurrencyAmount.zero(trade.Product.Currency));
            }
            BondPaymentPeriod          settlePeriod = trade.Settlement.get().Payment;
            ResolvedCapitalIndexedBond product      = trade.Product;
            CurrencyAmount             netAmount    = this.netAmount(trade, ratesProvider);
            RepoCurveDiscountFactors   repoDf       = DiscountingCapitalIndexedBondProductPricer.repoCurveDf(product, discountingProvider);

            return(netAmount.multipliedBy(repoDf.discountFactor(settlePeriod.PaymentDate)));
        }
        /// <summary>
        /// Calculates the current cash of the NDF product.
        /// </summary>
        /// <param name="ndf">  the product </param>
        /// <param name="provider">  the rates provider </param>
        /// <returns> the current cash of the product in the settlement currency </returns>
        public virtual CurrencyAmount currentCash(ResolvedFxNdf ndf, RatesProvider provider)
        {
            Currency ccySettle = ndf.SettlementCurrency;

            if (provider.ValuationDate.isEqual(ndf.PaymentDate))
            {
                Currency       ccyOther       = ndf.NonDeliverableCurrency;
                CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional;
                double         agreedRate     = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther);
                double         rate           = provider.fxIndexRates(ndf.Index).rate(ndf.Observation, ccySettle);
                return(notionalSettle.multipliedBy(1d - agreedRate / rate));
            }
            return(CurrencyAmount.zero(ccySettle));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the currency exposure by discounting each payment in its own currency.
        /// </summary>
        /// <param name="ndf">  the product </param>
        /// <param name="provider">  the rates provider </param>
        /// <returns> the currency exposure </returns>
        public virtual MultiCurrencyAmount currencyExposure(ResolvedFxNdf ndf, RatesProvider provider)
        {
            if (provider.ValuationDate.isAfter(ndf.PaymentDate))
            {
                return(MultiCurrencyAmount.empty());
            }
            Currency       ccySettle      = ndf.SettlementCurrency;
            CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional;
            double         dfSettle       = provider.discountFactor(ccySettle, ndf.PaymentDate);
            Currency       ccyOther       = ndf.NonDeliverableCurrency;
            double         agreedRate     = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther);
            double         dfOther        = provider.discountFactor(ccyOther, ndf.PaymentDate);

            return(MultiCurrencyAmount.of(notionalSettle.multipliedBy(dfSettle)).plus(CurrencyAmount.of(ccyOther, -notionalSettle.Amount * agreedRate * dfOther)));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the present value of the NDF product.
        /// <para>
        /// The present value of the product is the value on the valuation date.
        /// The present value is returned in the settlement currency.
        ///
        /// </para>
        /// </summary>
        /// <param name="ndf">  the product </param>
        /// <param name="provider">  the rates provider </param>
        /// <returns> the present value of the product in the settlement currency </returns>
        public virtual CurrencyAmount presentValue(ResolvedFxNdf ndf, RatesProvider provider)
        {
            Currency ccySettle = ndf.SettlementCurrency;

            if (provider.ValuationDate.isAfter(ndf.PaymentDate))
            {
                return(CurrencyAmount.zero(ccySettle));
            }
            Currency       ccyOther       = ndf.NonDeliverableCurrency;
            CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional;
            double         agreedRate     = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther);
            double         forwardRate    = provider.fxIndexRates(ndf.Index).rate(ndf.Observation, ccySettle);
            double         dfSettle       = provider.discountFactor(ccySettle, ndf.PaymentDate);

            return(notionalSettle.multipliedBy(dfSettle * (1d - agreedRate / forwardRate)));
        }