public void TestMultipleLoanCalculation() { MarketRate rate = new MarketRate { AmountAvailable = 1000, Lender = "Alice", Rate = (float)0.07 }; MarketRate rate1 = new MarketRate { AmountAvailable = 1000, Lender = "Bob", Rate = (float)0.07 }; MarketRate rate2 = new MarketRate { AmountAvailable = 1000, Lender = "Charlie", Rate = (float)0.07 }; List <MarketRate> rates = new List <MarketRate>(); rates.Add(rate); rates.Add(rate1); rates.Add(rate2); LoanAggregator agg = new LoanAggregator(); agg.FindLoans(rates, 3000, 36); Assert.AreEqual(true, agg.IsLoanPossible); Assert.AreEqual(3000, agg.LoanAmount, "LoanAmount check failed"); Assert.AreEqual("92.63", agg.Monthly, "MonthlyPayments check failed"); Assert.AreEqual("3,334.70", agg.Total, "TotalRepayment check failed"); Assert.AreEqual((float)0.07, agg.Rate, "Rate check failed"); }
public void TestParse() { List <MarketRate> rates; MarketRateCsvParser parser = new MarketRateCsvParser(); MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.WriteLine("Lender,Rate,Available"); writer.WriteLine("Alice,0.05,1000"); writer.WriteLine("Bob,0.01,500"); writer.Flush(); stream.Position = 0; rates = parser.Parse(new StreamReader(stream)); Assert.AreEqual(rates.Count, 2); MarketRate rate = rates[0]; Assert.AreEqual("Alice", rate.Lender, "Lender check failed"); Assert.AreEqual((float)0.05, rate.Rate, "Rate check failed"); Assert.AreEqual(1000, rate.AmountAvailable, "Amount check failed"); rate = rates[1]; Assert.AreEqual("Bob", rate.Lender, "Lender check failed"); Assert.AreEqual((float)0.01, rate.Rate, "Rate check failed"); Assert.AreEqual(500, rate.AmountAvailable, "Amount check failed"); }
public void TestMixedRateChosen() { MarketRate rate = new MarketRate { AmountAvailable = 100, Lender = "Bob", Rate = (float)0.07 }; List <MarketRate> rates = new List <MarketRate>(); rates.Add(rate); LoanAggregator agg = new LoanAggregator(); agg.FindLoans(rates, 50, 36); Assert.AreEqual(true, agg.IsLoanPossible); }
public void TestInsufficientLoans() { MarketRate rate = new MarketRate { AmountAvailable = 100, Lender = "Bob", Rate = (float)0.07 }; List <MarketRate> rates = new List <MarketRate>(); rates.Add(rate); LoanAggregator agg = new LoanAggregator(); agg.FindLoans(rates, 1000, 36); Assert.AreEqual(false, agg.IsLoanPossible); }
public static async System.Threading.Tasks.Task <MarketRate> GetHistoryRateAsync(DateTime thisDate) { string apiUrl = " http://data.fixer.io/api/" + thisDate.ToString("yyyy-MM-dd") + "?access_key=" + ApiController.Key + "&base=EUR"; using (var client = new HttpClient()) { var uri = new Uri(apiUrl); var response = client.GetAsync(uri).Result; string textResult = await response.Content.ReadAsStringAsync(); JavaScriptSerializer j = new JavaScriptSerializer(); MarketRate marketRate = (MarketRate)j.Deserialize(textResult, typeof(MarketRate)); return(marketRate); } }
public static async System.Threading.Tasks.Task SetRates() { string apiUrl = "http://data.fixer.io/api/latest?access_key=" + Key + "&base=eur"; using (var client = new HttpClient()) { var uri = new Uri(apiUrl); var response = await client.GetAsync(uri); string textResult = await response.Content.ReadAsStringAsync(); JavaScriptSerializer j = new JavaScriptSerializer(); MarketRate a = (MarketRate)j.Deserialize(textResult, typeof(MarketRate)); rates = a.rates; } }
public void TestMultipleLoadsPossible() { MarketRate rate1 = new MarketRate { AmountAvailable = 100, Lender = "Bob", Rate = (float)0.07 }; MarketRate rate2 = new MarketRate { AmountAvailable = 100, Lender = "Alice", Rate = (float)0.06 }; List <MarketRate> rates = new List <MarketRate>(); rates.Add(rate1); rates.Add(rate2); LoanAggregator agg = new LoanAggregator(); agg.FindLoans(rates, 50, 36); Assert.AreEqual(true, agg.IsLoanPossible); }
public void TestSingleLoanCalculation() { MarketRate rate = new MarketRate { AmountAvailable = 1000, Lender = "Alice", Rate = (float)0.07 }; List <MarketRate> rates = new List <MarketRate>(); rates.Add(rate); LoanAggregator agg = new LoanAggregator(); agg.FindLoans(rates, 1000, 36); Assert.AreEqual(true, agg.IsLoanPossible); Assert.AreEqual(1000, agg.LoanAmount, "LoanAmount check failed"); Assert.AreEqual("30.88", agg.Monthly, "MonthlyPayments check failed"); Assert.AreEqual("1,111.57", agg.Total, "TotalRepayment check failed"); }
public async System.Threading.Tasks.Task <ActionResult> Index() { string apiUrl = "http://data.fixer.io/api/latest?access_key=e4e42612bf86976d190d8d29b20fcc32&base=eur"; using (var client = new HttpClient()) { var uri = new Uri(apiUrl); var response = await client.GetAsync(uri); string textResult = await response.Content.ReadAsStringAsync(); JavaScriptSerializer j = new JavaScriptSerializer(); MarketRate a = (MarketRate)j.Deserialize(textResult, typeof(MarketRate)); rates = a.rates; var currencies = a.rates.Keys.ToList(); return(View(currencies)); } }
public static async System.Threading.Tasks.Task <Graph> GetGraph(string ExchangeFrom, string ExchangeTo) { Graph historicalRates = new Graph(); if (ExchangeFrom != ExchangeTo) { int numOfDays = 30; historicalRates.Title = ExchangeFrom + " To " + ExchangeTo; historicalRates.ShortDate = new List <string>(); historicalRates.Amount = new List <double>(); historicalRates.RegressionY = new List <double>(); DateTime dateNow = DateTime.Now.AddDays(-1); DateTime historicalDate = dateNow.AddDays(-numOfDays); IQueryable <HistoricalRate> storedHistoricalRates; using (cz2006anythingEntities model = new cz2006anythingEntities()) { model.HistoricalRates.RemoveRange(model.HistoricalRates.Where(z => z.Date < historicalDate)); var exchangeFromCurrId = model.Currencies.Where(x => x.Name == ExchangeFrom).FirstOrDefault().Id; var exchangeToCurrId = model.Currencies.Where(x => x.Name == ExchangeTo).FirstOrDefault().Id; storedHistoricalRates = model.HistoricalRates.Where(z => z.ExchangeFromId == exchangeFromCurrId && z.ExchangeToId == exchangeToCurrId); DateTime latestStoredHistoricalRateDate = new DateTime(); if (storedHistoricalRates != null && storedHistoricalRates.FirstOrDefault() != null) { latestStoredHistoricalRateDate = storedHistoricalRates.OrderByDescending(z => z.Date).FirstOrDefault().Date; } if (!(storedHistoricalRates.FirstOrDefault() == null || latestStoredHistoricalRateDate < dateNow.AddDays(-numOfDays))) { TimeSpan dateDiff = dateNow.Subtract(latestStoredHistoricalRateDate); numOfDays = dateDiff.Days; historicalDate = dateNow.AddDays(-numOfDays); } for (int i = 1; i <= numOfDays; i++) { DateTime thisDate = historicalDate.AddDays(i); MarketRate marketRate = await ApiController.GetHistoryRateAsync(thisDate); if (marketRate.success == true) { double exchangeFrom = marketRate.rates.Where(z => z.Key == ExchangeFrom).FirstOrDefault().Value; double exchangeTo = marketRate.rates.Where(z => z.Key == ExchangeTo).FirstOrDefault().Value; HistoricalRate newHistoricalRate = new HistoricalRate(); newHistoricalRate.ExchangeFromId = exchangeFromCurrId; newHistoricalRate.ExchangeToId = exchangeToCurrId; newHistoricalRate.Rate = CalculationController.ConvertCurrency(1, exchangeFrom, exchangeTo); newHistoricalRate.Date = thisDate; model.HistoricalRates.Add(newHistoricalRate); } } model.SaveChanges(); float exchangeFromToday = ApiController.rates.Where(z => z.Key == ExchangeFrom).FirstOrDefault().Value; float exchangeToToday = ApiController.rates.Where(z => z.Key == ExchangeTo).FirstOrDefault().Value; double baseRate = CalculationController.ConvertCurrency(1, exchangeFromToday, exchangeToToday); List <int> RegressionX = new List <int>(); int n = storedHistoricalRates.Count() + 1; for (int i = 0; i < n; i++) { RegressionX.Add(i); } int sumX = RegressionX.Sum(); double sumY = 0; List <double> xY = new List <double>(); List <double> squareX = new List <double>(); for (int i = 0; i < n - 1; i++) { squareX.Add(RegressionX[i] * RegressionX[i]); double y = storedHistoricalRates.OrderByDescending(z => z.Date).Skip(n - i - 2).FirstOrDefault().Rate; sumY += y; xY.Add(RegressionX[i] * y); } squareX.Add(RegressionX[n - 1] * RegressionX[n - 1]); sumY += baseRate; xY.Add(RegressionX[n - 1] * baseRate); double b = (n * xY.Sum() - sumX * sumY) / (n * squareX.Sum() - sumX * sumX); double a = (sumY / n) - b * (sumX / n); int counter = 0; foreach (var x in storedHistoricalRates) { historicalRates.ShortDate.Add(x.Date.ToString("dd MMM")); historicalRates.Amount.Add(x.Rate); historicalRates.RegressionY.Add(a + b * (counter)); counter++; } historicalRates.ShortDate.Add(DateTime.Now.ToString("dd MMM")); historicalRates.Amount.Add(baseRate); historicalRates.RegressionY.Add(a + b * (counter)); } } return(historicalRates); }