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)); }
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); }
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)); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }