/// <summary> /// Retrieves candles. We first look in a local transactions file, then we get the missing candles from bitcoincharts or bitcoinwisdom /// </summary> /// <param name="pair"></param> /// <param name="fromDateTime"></param> /// <param name="candleDurationsInMinutes"></param> /// <param name="toDateTime"></param> /// <returns></returns> public static IList <OHLC> LoadCandles(CurrencyPair pair, DateTime fromDateTime, int candleDurationsInMinutes, DateTime?toDateTime = null) { //Try to get candles from local transactions var candles = _csvRepository.GetCandlesFromCSVTransactions(fromDateTime, toDateTime, candleDurationsInMinutes, pair); var lastCandle = candles.LastOrDefault(); if (toDateTime == null) { toDateTime = DateTime.UtcNow; } if (lastCandle != null) { candles.Remove(lastCandle); } var newLast = candles.LastOrDefault(); DateTime minTime = newLast != null?newLast.Date.AddSeconds(1) : fromDateTime; //Then we try to get more candles from websites providing historic data if (minTime.AddHours(1) < toDateTime)//If older than 1 H, we need to get data from bitcoincharts/bitcoinwisdom { if (pair.Item1 == CurrencyCodes.BTC && !string.IsNullOrEmpty(pair.Exchange.BitcoinChartsCode)) { var newestCandles = GetCandlesFromBitcoincharts(minTime, candleDurationsInMinutes, pair.Exchange.BitcoinChartsCode, pair.Item2); candles = candles.Union(newestCandles).ToList(); if (candles.Count == 0) { newestCandles = GetCandlesFromBitcoinWisdom(pair, fromDateTime, candleDurationsInMinutes); candles = candles.Union(newestCandles).ToList(); } } else { var newestCandles = GetCandlesFromBitcoinWisdom(pair, fromDateTime, candleDurationsInMinutes); candles = candles.Union(newestCandles).ToList(); } } var recentCandles = GetRecentCandlesFromTransactions(fromDateTime, candleDurationsInMinutes, pair); foreach (OHLC newCandle in recentCandles) { var existingCandle = candles.FirstOrDefault(e => e.Date == newCandle.Date); if (existingCandle != null) { existingCandle.High = newCandle.High > existingCandle.High ? newCandle.High : existingCandle.High; existingCandle.Low = newCandle.Low < existingCandle.Low ? newCandle.Low : existingCandle.Low; existingCandle.Close = newCandle.Close; } else { candles.Add(newCandle); } } return(candles); }
/// <summary> /// Calculates candles from a file containing transactions /// </summary> /// <param name="pair"></param> /// <param name="candlesDurationInMin"></param> /// <param name="fromDateTime"></param> /// <param name="toDateTime"></param> /// <returns></returns> public static IList <OHLC> ReadCandlesFromCSVTransactions(CurrencyPair pair, int candlesDurationInMin, DateTime fromDateTime, DateTime?toDateTime = null) { var rep = new CSVCandleRepository(); string market = pair != null ? pair.Exchange.BitcoinChartsCode : string.Empty; string currency = pair != null ? pair.Item2 : string.Empty; return(rep.GetCandlesFromCSVTransactions(fromDateTime, toDateTime, candlesDurationInMin, pair)); }