Exemple #1
0
        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");
        }
Exemple #2
0
        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");
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        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;
            }
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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");
        }
Exemple #9
0
        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));
            }
        }
Exemple #10
0
        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);
        }