/// <summary>
        /// Calculates the delta of the Ibor future option product
        /// based on the price of the underlying future.
        /// <para>
        /// The delta of the product is the sensitivity of the option price to the future price.
        /// The volatility is unchanged for a fixed strike in the sensitivity computation, hence the "StickyStrike" name.
        ///
        /// </para>
        /// </summary>
        /// <param name="futureOption">  the option product </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="volatilities">  the volatilities </param>
        /// <param name="futurePrice">  the price of the underlying future, in decimal form </param>
        /// <returns> the price curve sensitivity of the product </returns>
        public virtual double deltaStickyStrike(ResolvedIborFutureOption futureOption, RatesProvider ratesProvider, NormalIborFutureOptionVolatilities volatilities, double futurePrice)
        {
            ArgChecker.isTrue(futureOption.PremiumStyle.Equals(FutureOptionPremiumStyle.DAILY_MARGIN), "Premium style should be DAILY_MARGIN");

            double             timeToExpiry = volatilities.relativeTime(futureOption.Expiry);
            double             strike       = futureOption.StrikePrice;
            ResolvedIborFuture future       = futureOption.UnderlyingFuture;
            double             volatility   = volatilities.volatility(timeToExpiry, future.LastTradeDate, strike, futurePrice);

            return(NormalFormulaRepository.delta(futurePrice, strike, timeToExpiry, volatility, futureOption.PutCall));
        }
        /// <summary>
        /// Calculates the price sensitivity to the normal volatility used for the pricing of the Ibor future option
        /// based on the price of the underlying future.
        /// <para>
        /// This sensitivity is also called the <i>price normal vega</i>.
        ///
        /// </para>
        /// </summary>
        /// <param name="futureOption">  the option product </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="volatilities">  the volatilities </param>
        /// <param name="futurePrice">  the underlying future price, in decimal form </param>
        /// <returns> the sensitivity </returns>
        public virtual IborFutureOptionSensitivity priceSensitivityModelParamsVolatility(ResolvedIborFutureOption futureOption, RatesProvider ratesProvider, NormalIborFutureOptionVolatilities volatilities, double futurePrice)
        {
            ArgChecker.isTrue(futureOption.PremiumStyle.Equals(FutureOptionPremiumStyle.DAILY_MARGIN), "Premium style should be DAILY_MARGIN");

            double             timeToExpiry = volatilities.relativeTime(futureOption.Expiry);
            double             strike       = futureOption.StrikePrice;
            ResolvedIborFuture future       = futureOption.UnderlyingFuture;
            double             volatility   = volatilities.volatility(timeToExpiry, future.LastTradeDate, strike, futurePrice);

            double vega = NormalFormulaRepository.vega(futurePrice, strike, timeToExpiry, volatility, futureOption.PutCall);

            return(IborFutureOptionSensitivity.of(volatilities.Name, timeToExpiry, future.LastTradeDate, strike, futurePrice, future.Currency, vega));
        }