public RatesCalculationResult CalculateResult(Currency baseCurrency, Currency[] currencies, decimal amount, List<Rate> rates)
 {
     var bestResult = new RatesCalculationResult {Currency = baseCurrency, MaxAmount = amount};
     foreach (var currency in currencies)
     {
         var currentResult = CalculateResultByCurrency(rates, currency, amount);
         if (currentResult.MaxAmount > bestResult.MaxAmount)
         {
             bestResult = currentResult;
         }
     }
     return bestResult;
 }
        public RatesCalculationResult CalculateResultByCurrency(List<Rate> rates, Currency currency, decimal amount)
        {
            var bestResult = new RatesCalculationResult { Currency = currency, MaxAmount = 0 };
            for (var startDateIndex = 0; startDateIndex < rates.Count - 1; startDateIndex++)
            {
                var startDateRate = rates[startDateIndex].Rates[currency];
                for (var endDateIndex = startDateIndex + 1; endDateIndex < rates.Count; endDateIndex++)
                {
                    var endDateRate = rates[endDateIndex].Rates[currency];
                    var currentAmount = amount*startDateRate/endDateRate -
                                        rates[endDateIndex].Date.Subtract(rates[startDateIndex].Date).Days;

                    if (currentAmount > bestResult.MaxAmount)
                    {
                        bestResult.MaxAmount = currentAmount;
                        bestResult.StartDate = rates[startDateIndex].Date;
                        bestResult.EndDate = rates[endDateIndex].Date;
                    }
                }
            }
            return bestResult;
        }