// ensures that the volatilities are correct
 private BlackFxOptionVolatilities checkTrinomialTreeVolatilities(FxOptionVolatilities volatilities)
 {
     if (volatilities is BlackFxOptionVolatilities)
     {
         return((BlackFxOptionVolatilities)volatilities);
     }
     throw new System.ArgumentException("FX single barrier option Trinomial Tree pricing requires BlackFxOptionVolatilities");
 }
 // ensures that the volatilities are correct
 private BlackFxOptionSmileVolatilities checkVannaVolgaVolatilities(FxOptionVolatilities volatilities)
 {
     if (volatilities is BlackFxOptionSmileVolatilities)
     {
         return((BlackFxOptionSmileVolatilities)volatilities);
     }
     throw new System.ArgumentException("FX vanilla option Vanna Volga pricing requires BlackFxOptionSmileVolatilities");
 }
        // point sensitivity
        private CurrencyParameterSensitivities pointSensitivity(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
        {
            PointSensitivities pointSens;

            if (method == FxVanillaOptionMethod.VANNA_VOLGA)
            {
                pointSens = vannaVolgaPricer.presentValueSensitivityRatesStickyStrike(trade, ratesProvider, checkVannaVolgaVolatilities(volatilities));
            }
            else
            {
                pointSens = blackPricer.presentValueSensitivityRatesStickyStrike(trade, ratesProvider, checkBlackVolatilities(volatilities));
            }
            return(ratesProvider.parameterSensitivity(pointSens));
        }
        // market quote bucketed PV01 for one scenario
        internal CurrencyParameterSensitivities pv01RatesMarketQuoteBucketed(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
        {
            CurrencyParameterSensitivities paramSens = pointSensitivity(trade, ratesProvider, volatilities, method);

            return(MARKET_QUOTE_SENS.sensitivity(paramSens, ratesProvider).multipliedBy(ONE_BASIS_POINT));
        }
 /// <summary>
 /// Calculates present value for a single set of market data.
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the present value </returns>
 public virtual MultiCurrencyAmount presentValue(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
 {
     return(calc.presentValue(trade, ratesProvider, volatilities, method));
 }
 /// <summary>
 /// Calculates current cash for a single set of market data.
 /// <para>
 /// The sum of all cash flows paid on the valuation date.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the current cash </returns>
 public virtual CurrencyAmount currentCash(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
 {
     return(calc.currentCash(trade, ratesProvider.ValuationDate, method));
 }
 /// <summary>
 /// Calculates present value sensitivity for a single set of market data.
 /// <para>
 /// This is the sensitivity of present value to a one basis point shift in
 /// the market quotes used to calibrate the curves.
 /// The result is provided for each affected curve and currency, bucketed by curve node.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the present value sensitivity </returns>
 public virtual CurrencyParameterSensitivities pv01RatesMarketQuoteBucketed(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
 {
     return(calc.pv01RatesMarketQuoteBucketed(trade, ratesProvider, volatilities, method));
 }
 /// <summary>
 /// Calculates present value sensitivity for a single set of market data.
 /// <para>
 /// This is the sensitivity of present value to a one basis point shift in the calibrated curves.
 /// The result is provided for each affected curve and currency, bucketed by curve node.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the present value sensitivity </returns>
 public virtual CurrencyParameterSensitivities pv01RatesCalibratedBucketed(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
 {
     return(calc.pv01RatesCalibratedBucketed(trade, ratesProvider, volatilities, method));
 }
 // present value for one scenario
 internal MultiCurrencyAmount presentValue(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
 {
     if (method == FxSingleBarrierOptionMethod.TRINOMIAL_TREE)
     {
         return(trinomialTreePricer.presentValue(trade, ratesProvider, checkTrinomialTreeVolatilities(volatilities)));
     }
     else
     {
         return(blackPricer.presentValue(trade, ratesProvider, checkBlackVolatilities(volatilities)));
     }
 }
 // point sensitivity
 private CurrencyParameterSensitivities parameterSensitivities(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
 {
     if (method == FxSingleBarrierOptionMethod.TRINOMIAL_TREE)
     {
         return(trinomialTreePricer.presentValueSensitivityRates(trade, ratesProvider, checkTrinomialTreeVolatilities(volatilities)));
     }
     else
     {
         PointSensitivities pointSens = blackPricer.presentValueSensitivityRatesStickyStrike(trade, ratesProvider, checkBlackVolatilities(volatilities));
         return(ratesProvider.parameterSensitivity(pointSens));
     }
 }
        // market quote sum PV01 for one scenario
        internal MultiCurrencyAmount pv01RatesMarketQuoteSum(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
        {
            CurrencyParameterSensitivities paramSens = parameterSensitivities(trade, ratesProvider, volatilities, method);

            return(MARKET_QUOTE_SENS.sensitivity(paramSens, ratesProvider).total().multipliedBy(ONE_BASIS_POINT));
        }
        // calibrated bucketed PV01 for one scenario
        internal CurrencyParameterSensitivities pv01RatesCalibratedBucketed(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
        {
            CurrencyParameterSensitivities paramSens = parameterSensitivities(trade, ratesProvider, volatilities, method);

            return(paramSens.multipliedBy(ONE_BASIS_POINT));
        }
 /// <summary>
 /// Calculates currency exposure for a single set of market data.
 /// <para>
 /// The currency risk, expressed as the equivalent amount in each currency.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the currency exposure </returns>
 public virtual MultiCurrencyAmount currencyExposure(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
 {
     return(calc.currencyExposure(trade, ratesProvider, volatilities, method));
 }
 // present value for one scenario
 internal MultiCurrencyAmount presentValue(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
 {
     if (method == FxVanillaOptionMethod.VANNA_VOLGA)
     {
         return(vannaVolgaPricer.presentValue(trade, ratesProvider, checkVannaVolgaVolatilities(volatilities)));
     }
     else
     {
         return(blackPricer.presentValue(trade, ratesProvider, checkBlackVolatilities(volatilities)));
     }
 }
 /// <summary>
 /// Calculates present value sensitivity for a single set of market data.
 /// <para>
 /// This is the sensitivity of present value to a one basis point shift in
 /// the market quotes used to calibrate the curves.
 /// The result is the sum of the sensitivities of all affected curves.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the present value sensitivity </returns>
 public virtual MultiCurrencyAmount pv01RatesMarketQuoteSum(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
 {
     return(calc.pv01RatesMarketQuoteSum(trade, ratesProvider, volatilities, method));
 }
        // calibrated sum PV01 for one scenario
        internal MultiCurrencyAmount pv01RatesCalibratedSum(ResolvedFxVanillaOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxVanillaOptionMethod method)
        {
            CurrencyParameterSensitivities paramSens = pointSensitivity(trade, ratesProvider, volatilities, method);

            return(paramSens.total().multipliedBy(ONE_BASIS_POINT));
        }
 /// <summary>
 /// Calculates present value sensitivity for a single set of market data.
 /// <para>
 /// This is the sensitivity of present value to a one basis point shift in the calibrated curves.
 /// The result is the sum of the sensitivities of all affected curves.
 ///
 /// </para>
 /// </summary>
 /// <param name="trade">  the trade </param>
 /// <param name="ratesProvider">  the market data </param>
 /// <param name="volatilities">  the option volatilities </param>
 /// <param name="method">  the pricing method </param>
 /// <returns> the present value sensitivity </returns>
 public virtual MultiCurrencyAmount pv01RatesCalibratedSum(ResolvedFxSingleBarrierOptionTrade trade, RatesProvider ratesProvider, FxOptionVolatilities volatilities, FxSingleBarrierOptionMethod method)
 {
     return(calc.pv01RatesCalibratedSum(trade, ratesProvider, volatilities, method));
 }