コード例 #1
0
        public override CompileResult Execute(IEnumerable <FunctionArgument> arguments, ParsingContext context)
        {
            ValidateArguments(arguments, 6);
            var settlementDate = System.DateTime.FromOADate(ArgToInt(arguments, 0));
            var maturityDate   = System.DateTime.FromOADate(ArgToInt(arguments, 1));
            var rate           = ArgToDecimal(arguments, 2);
            var yield          = ArgToDecimal(arguments, 3);
            var redemption     = ArgToDecimal(arguments, 4);
            var frequency      = ArgToInt(arguments, 5);
            var basis          = 0;

            if (arguments.Count() >= 7)
            {
                basis = ArgToInt(arguments, 6);
            }
            // validate input
            if ((settlementDate > maturityDate) || rate < 0 || yield < 0 || redemption <= 0 || (frequency != 1 && frequency != 2 && frequency != 4) || (basis < 0 || basis > 4))
            {
                return(CreateResult(eErrorType.Num));
            }

            var result = PriceImpl.GetPrice(FinancialDayFactory.Create(settlementDate, (DayCountBasis)basis), FinancialDayFactory.Create(maturityDate, (DayCountBasis)basis), rate, yield, redemption, frequency, (DayCountBasis)basis);

            if (result.HasError)
            {
                return(CreateResult(result.ExcelErrorType));
            }
            return(CreateResult(result.Result, DataType.Decimal));
        }
コード例 #2
0
        public void Couppcd_ShouldReturnCorrectDate_ActualActual()
        {
            // No need for tests per DayCountBasis here.
            var settlement = new DateTime(2017, 05, 30);
            var maturity   = new DateTime(2020, 05, 31);

            var func = new CouppcdImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                4,
                DayCountBasis.Actual_Actual
                );
            var result = func.GetCouppcd();

            Assert.AreEqual(new System.DateTime(2017, 2, 28), result.Result);

            settlement = new DateTime(2016, 02, 01);
            maturity   = new DateTime(2019, 5, 31);

            func = new CouppcdImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                4,
                DayCountBasis.Actual_Actual
                );
            result = func.GetCouppcd();
            Assert.AreEqual(new System.DateTime(2015, 11, 30), result.Result);
        }
コード例 #3
0
        public override CompileResult Execute(IEnumerable <FunctionArgument> arguments, ParsingContext context)
        {
            ValidateArguments(arguments, 3);
            var settlementDate = System.DateTime.FromOADate(ArgToInt(arguments, 0));
            var maturityDate   = System.DateTime.FromOADate(ArgToInt(arguments, 1));
            var frequency      = ArgToInt(arguments, 2);
            var basis          = 0;

            if (arguments.Count() >= 4)
            {
                basis = ArgToInt(arguments, 3);
            }
            // validate input
            if ((settlementDate > maturityDate) || (frequency != 1 && frequency != 2 && frequency != 4) || (basis < 0 || basis > 4))
            {
                return(CreateResult(eErrorType.Num));
            }

            var result = ExecuteFunction(FinancialDayFactory.Create(settlementDate, (DayCountBasis)basis), FinancialDayFactory.Create(maturityDate, (DayCountBasis)basis), frequency, (DayCountBasis)basis);

            if (result.HasError)
            {
                return(CreateResult(result.ExcelErrorType));
            }
            if (typeof(T) == typeof(System.DateTime))
            {
                return(CreateResult(Convert.ToDateTime(result.Result).ToOADate(), DataType.Date));
            }
            return(CreateResult(result.Result, result.DataType));
        }
コード例 #4
0
        public void Coupdaybs_ShouldReturnCorrectResult_Actual_360()
        {
            var settlement = new DateTime(2018, 12, 01);
            var maturity   = new DateTime(2019, 3, 15);

            var func = new CoupdaybsImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_360),
                4,
                DayCountBasis.Actual_360
                );
            var result = func.Coupdaybs();

            Assert.AreEqual(77, result.Result);

            settlement = new DateTime(2016, 02, 01);
            maturity   = new DateTime(2019, 05, 31);

            func = new CoupdaybsImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_360),
                2,
                DayCountBasis.Actual_360
                );
            result = func.Coupdaybs();
            Assert.AreEqual(63, result.Result);
        }
コード例 #5
0
        public void Coupnum_ShouldReturnNumberOfDays_ActualActual()
        {
            // No need for tests per DayCountBasis here.
            var settlement = new DateTime(2016, 02, 01);
            var maturity   = new DateTime(2019, 3, 15);

            var func = new CoupnumImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                4,
                DayCountBasis.Actual_Actual
                );
            var result = func.GetCoupnum();

            Assert.AreEqual(13d, result.Result);

            settlement = new DateTime(2018, 12, 01);
            maturity   = new DateTime(2019, 5, 31);

            func = new CoupnumImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                2,
                DayCountBasis.Actual_Actual
                );
            result = func.GetCoupnum();
            Assert.AreEqual(1d, result.Result);
        }
コード例 #6
0
        public void CoupdaysNc_ShouldReturnNumberOfDays_ActualActual()
        {
            var settlement = new DateTime(2016, 02, 01);
            var maturity   = new DateTime(2019, 5, 31);

            var func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                4,
                DayCountBasis.Actual_Actual
                );
            var result = func.Coupdaysnc();

            Assert.AreEqual(28d, result.Result);

            settlement = new DateTime(2016, 05, 30);
            maturity   = new DateTime(2019, 5, 31);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.Actual_Actual),
                FinancialDayFactory.Create(maturity, DayCountBasis.Actual_Actual),
                4,
                DayCountBasis.Actual_Actual
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(1d, result.Result);
        }
コード例 #7
0
        public void Coupdays_ShouldReturnNumberOfDays_European_Actual_360()
        {
            var settlement = new DateTime(2012, 2, 29);
            var maturity   = new DateTime(2019, 3, 15);

            var func = new CoupdaysImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.European_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.European_30_360),
                4,
                DayCountBasis.European_30_360
                );
            var result = func.GetCoupdays();

            Assert.AreEqual(90d, result.Result);


            settlement = new DateTime(2017, 2, 1);
            maturity   = new DateTime(2019, 5, 31);

            func = new CoupdaysImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.European_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.European_30_360),
                4,
                DayCountBasis.European_30_360
                );
            result = func.GetCoupdays();
            Assert.AreEqual(90d, result.Result);
        }
コード例 #8
0
 public double GetPrice(System.DateTime settlement, System.DateTime maturity, double rate, double yield, double redemption, int frequency, DayCountBasis basis = DayCountBasis.US_30_360)
 {
     return(PriceImpl.GetPrice(
                FinancialDayFactory.Create(settlement, basis),
                FinancialDayFactory.Create(maturity, basis),
                rate,
                yield,
                redemption,
                frequency,
                basis).Result);
 }
コード例 #9
0
        public void CoupdaysNc_ShouldReturnNumberOfDays_Us_30_360()
        {
            var settlement = new DateTime(2016, 02, 01);
            var maturity   = new DateTime(2019, 5, 31);

            var func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.US_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.US_30_360),
                4,
                DayCountBasis.US_30_360
                );
            var result = func.Coupdaysnc();

            Assert.AreEqual(29d, result.Result);

            settlement = new DateTime(2016, 05, 30);
            maturity   = new DateTime(2019, 5, 31);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.US_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.US_30_360),
                4,
                DayCountBasis.US_30_360
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(0d, result.Result);

            settlement = new DateTime(2018, 08, 01);
            maturity   = new DateTime(2019, 03, 15);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.US_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.US_30_360),
                4,
                DayCountBasis.US_30_360
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(44d, result.Result);

            // NB! Excel returns 29 on this one. Google sheets returns 28. As far as we can see it should be
            // 28, so that's how we have implemented it in EPPlus
            settlement = new DateTime(2018, 08, 01);
            maturity   = new DateTime(2020, 02, 29);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.US_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.US_30_360),
                4,
                DayCountBasis.US_30_360
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(28d, result.Result);
        }
コード例 #10
0
        public void CoupdaysNc_ShouldReturnNumberOfDays_European_30_360()
        {
            var settlement = new DateTime(2016, 02, 01);
            var maturity   = new DateTime(2019, 5, 31);

            var func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.European_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.European_30_360),
                4,
                DayCountBasis.European_30_360
                );
            var result = func.Coupdaysnc();

            Assert.AreEqual(28d, result.Result);

            settlement = new DateTime(2016, 05, 30);
            maturity   = new DateTime(2019, 5, 31);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.European_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.European_30_360),
                4,
                DayCountBasis.European_30_360
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(0d, result.Result);

            settlement = new DateTime(2018, 08, 01);
            maturity   = new DateTime(2019, 03, 15);

            func = new CoupdaysncImpl(
                FinancialDayFactory.Create(settlement, DayCountBasis.European_30_360),
                FinancialDayFactory.Create(maturity, DayCountBasis.European_30_360),
                4,
                DayCountBasis.European_30_360
                );
            result = func.Coupdaysnc();
            Assert.AreEqual(44d, result.Result);
        }
コード例 #11
0
ファイル: CouponProvider.cs プロジェクト: yosmanyhs/EPPlus-1
        public double GetCoupdaybs(System.DateTime settlement, System.DateTime maturity, int frequency, DayCountBasis basis)
        {
            var func = new CoupdaybsImpl(FinancialDayFactory.Create(settlement, basis), FinancialDayFactory.Create(maturity, basis), frequency, basis);

            return(func.Coupdaybs().Result);
        }