public static object DupireSsviLookbackOptionPriceMC(
     [ExcelArgument(Description = "the current risky asset price")] double S0,
     [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate,
     [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double alpha,
     [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double beta,
     [ExcelArgument(Description = "SSVI parameter")] double gamma,
     [ExcelArgument(Description = "SSVI parameter")] double eta,
     [ExcelArgument(Description = "SSVI parameter")] double rho,
     [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity,
     [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps,
     [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials)
 {
     if (ExcelDnaUtil.IsInFunctionWizard())
     {
         return(null);
     }
     try
     {
         double[] ssviParams = new double[] { alpha, beta, gamma, eta, rho };
         MonteCarloPricingLocalVol McPricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams);
         return(McPricer.CalculateLookbackOptionPrice(S0, maturity));
     }
     catch (Exception e)
     {
         XLInterfaceBase.AddErrorMessage("DupireSsviLookbackOptionPriceMC error: " + e.Message);
     }
     return(null);
 }
        public static object DupireSsviBarrierPriceWithMC([ExcelArgument(Description = "the current risky asset price")] double S0,
                                                          [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate,
                                                          [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double alpha,
                                                          [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double beta,
                                                          [ExcelArgument(Description = "SSVI parameter")] double gamma,
                                                          [ExcelArgument(Description = "SSVI parameter")] double eta,
                                                          [ExcelArgument(Description = "SSVI parameter")] double rho,
                                                          [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity,
                                                          [ExcelArgument(Description = "option strike")] double strike,
                                                          [ExcelArgument(Description = "option barrier")] double barrier,
                                                          [ExcelArgument(Description = "option type, 'C' for call 'P' for put")] string CallOrPut,
                                                          [ExcelArgument(Description = "option type, 'U' for up 'D' for down")] string UpOrDown,
                                                          [ExcelArgument(Description = "option type, 'I' for in 'O' for out")] string InOrOut,
                                                          [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps,
                                                          [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials)
        {
            if (ExcelDnaUtil.IsInFunctionWizard())
            {
                return(null);
            }

            try
            {
                double[] ssviParams = new double[] { alpha, beta, gamma, eta, rho };
                MonteCarloPricingLocalVol pricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams);
                if (CallOrPut == "C")
                {
                    return(pricer.CalculateCallBarrierOptionPrice(S0, strike, maturity, UpOrDown, InOrOut, barrier));
                }
                else if (CallOrPut == "P")
                {
                    return(pricer.CalculatePutBarrierOptionPrice(S0, strike, maturity, UpOrDown, InOrOut, barrier));
                }
                else
                {
                    throw new ArgumentException("Input must be either C or P.");
                }
            }
            catch (Exception e)
            {
                XLInterfaceBase.AddErrorMessage("DupireSsviEuropeanPriceWithMC error: " + e.Message);
            }
            return(null);
        }
        public static object DupireSsviAsianOptionPriceMC(
            [ExcelArgument(Description = "the current risky asset price")] double S0,
            [ExcelArgument(Description = "constant continuously compounded rate of return")] double riskFreeRate,
            [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double alpha,
            [ExcelArgument(Description = "parameter in theta(t) := alpha^2(e^(beta^2 t)  - 1)")] double beta,
            [ExcelArgument(Description = "SSVI parameter")] double gamma,
            [ExcelArgument(Description = "SSVI parameter")] double eta,
            [ExcelArgument(Description = "SSVI parameter")] double rho,
            [ExcelArgument(Description = "option maturity (time to expiry)")] double maturity,
            [ExcelArgument(Description = "option strike")] double strike,
            [ExcelArgument(Description = "an Nx1 XL range of values over which the average is taken")] object monitoringTimes,
            [ExcelArgument(Description = "option type, 'C' for call 'P' for put")] string type,
            [ExcelArgument(Description = "number of time steps e.g. 252")] int numSteps,
            [ExcelArgument(Description = "number of trials e.g. 10 000")] int numTrials)

        {
            try
            {
                double[] monitoringT = XLInterfaceBase.ConvertToVector <double>(monitoringTimes);
                double[] ssviParams  = new double[] { alpha, beta, gamma, eta, rho };
                MonteCarloPricingLocalVol McPricer = new MonteCarloPricingLocalVol(riskFreeRate, numTrials, numSteps, ssviParams);
                if (type == "Call" || type == "call" || type == "C" || type == "c")
                {
                    return(McPricer.CalculateAsianCallOptionPrice(S0, strike, monitoringT, maturity));
                }
                else if (type == "Put" || type == "put" || type == "P" || type == "p")
                {
                    return(McPricer.CalculateAsianPutOptionPrice(S0, strike, monitoringT, maturity));
                }
                else
                {
                    throw new ArgumentException("Input must be either Call, call, C, c, Put, put, P or p.");
                }
            }
            catch (Exception e)
            {
                XLInterfaceBase.AddErrorMessage("DupireSsviAsianOptionPriceMC error: " + e.Message);
            }
            return(null);
        }