public static object GetHistoricData(HistoricRate rate, string deviceId, string connString) { var temperatures = new List <PlotDataPoint>(); var thermocoupleStatuses = new List <PlotDataPoint>(); MySqlConnection conn = null; int minsFrom = 5; switch (rate) { case HistoricRate.Back5Minutes: minsFrom = 5; break; case HistoricRate.Back30Minutes: minsFrom = 30; break; case HistoricRate.Back2Hours: minsFrom = 120; break; case HistoricRate.Back1Day: minsFrom = 1440; break; case HistoricRate.Back1Week: minsFrom = 10080; break; } conn = OpenConnection(connString); var query = $"CALL GetDataSamples({minsFrom}, '{deviceId}');"; MySqlCommand cmd = new MySqlCommand(query, conn); var reader = cmd.ExecuteReader(); while (reader.Read()) { var item = new ThermostatRequest { DeviceStatus = (string)reader[2], Measurement = Convert.ToSingle(reader[3]), Timestamp = (DateTime)reader[5] }; temperatures.Add(new PlotDataPoint(item.Measurement, item.Timestamp.ToUniversalTime())); thermocoupleStatuses.Add(new PlotDataPoint(item.DeviceStatus == "ON" ? 1 : 0, item.Timestamp.ToUniversalTime())); } reader.Close(); if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); } return(new { Temperatures = temperatures, Statuses = thermocoupleStatuses }); }
public static List <HistoricRate> ToHistoricRateList(this ArrayList[] arrayLists) { List <HistoricRate> historicRates = new List <HistoricRate>(); if (arrayLists == null) { return(historicRates); } foreach (ArrayList array in arrayLists) { DateTime unix = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); HistoricRate historicRate = new HistoricRate { DateAndTime = unix.AddSeconds(((JsonElement)array[0]).GetInt64()), Low = ((JsonElement)array[1]).GetDecimal(), High = ((JsonElement)array[2]).GetDecimal(), Open = ((JsonElement)array[3]).GetDecimal(), Close = ((JsonElement)array[4]).GetDecimal(), Volume = ((JsonElement)array[5]).GetDecimal() }; historicRates.Add(historicRate); } return(historicRates); }
public object GetHistory(HistoricRate rate, string deviceId) { try { var data = DbService.GetHistoricData(rate, deviceId, _connString); return(data); } catch (Exception e) { _logger.LogError("GetHistoricData() THROWS AN ERROR", e); throw; } }
public static List <HistoricRate> ToHistoricCandleList(this ArrayList[] arrayLists) { List <HistoricRate> historicRates = new List <HistoricRate>(); if (arrayLists == null) { return(historicRates); } DateTime start = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); foreach (ArrayList array in arrayLists) { HistoricRate historicRate = new HistoricRate(); switch (array.Count) { case 12: historicRate = new HistoricRate { //1499040000000, // Open time //"0.01634790", // Open //"0.80000000", // High //"0.01575800", // Low //"0.01577100", // Close //"148976.11427815", // Volume //1499644799999, // Close time //"2434.19055334", // Quote asset volume //308, // Number of trades //"1756.87402397", // Taker buy base asset volume //"17928899.62484339" // Ignore. DateAndTime = start.AddMilliseconds(((JsonElement)array[0]).GetInt64()).ToLocalTime(), Open = decimal.Parse(((JsonElement)array[1]).GetString()), High = decimal.Parse(((JsonElement)array[2]).GetString()), Low = decimal.Parse(((JsonElement)array[3]).GetString()), Close = decimal.Parse(((JsonElement)array[4]).GetString()), Volume = decimal.Parse(((JsonElement)array[5]).GetString()) }; break; } historicRates.Add(historicRate); } return(historicRates); }
private async void ProcessHistoryQuarterlyChartDownload() { await _processHistorySemaphoreSlim.WaitAsync(); try { string fileName = FileName + $"_{RelativeStrengthIndexSettings.Product.ID.ToLower()}_15M.csv"; string data = "DateTime,High,Open,Close,Low,Volume,MA7,RSI14\n"; //Validate file if (!File.Exists(fileName)) { if (!Directory.Exists(Path.GetDirectoryName(fileName))) { Directory.CreateDirectory(Path.GetDirectoryName(fileName)); } File.Create(fileName).Close(); SaveAnalyticData(fileName, data); } //Initialise fields const int period = 14; const int maPeriod = 7; const int granularity = 900; DateTime startingDateTime; HistoricRate previousHistoricRate = null; decimal increases = 0; decimal decreases = 0; Queue <HistoricRate> maQueue = new Queue <HistoricRate>(); //Check if we have an empty file or not if (string.IsNullOrWhiteSpace(RelativeStrengthIndexSettings .HistoricChartPreviousHistoricDateTimeQuarterly)) { startingDateTime = new DateTime(2015, 4, 23).Date; RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly = 0; RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly = 0; RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly = 0; RelativeStrengthIndexSettings.RelativeIndexQuarterly = -1; } else { startingDateTime = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricDateTimeQuarterly .ToDateTime().AddMinutes(15); previousHistoricRate = new HistoricRate { Close = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateCloseQuarterly, Open = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateOpenQuarterly, Low = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateLowQuarterly, High = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateHighQuarterly, Volume = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateVolumeQuarterly, DateAndTime = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricDateTimeQuarterly .ToDateTime() }; } //Begin data parsing DateTime now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0); while (startingDateTime < now) { DateTime endingDateTime = startingDateTime.AddDays(2); //Get the latest historic data HistoricCandlesSearch historicCandlesSearch = new HistoricCandlesSearch { Symbol = RelativeStrengthIndexSettings.Product.ID, StartingDateTime = startingDateTime, EndingDateTime = endingDateTime, Granularity = (Granularity)granularity }; //Prevent overloaded calls by delaying for 1 second before call await Task.Delay(1000); //Get the latest historic data List <HistoricRate> result = await UpdateProductHistoricCandles(historicCandlesSearch); if (!result.Any()) { //in the case that no data is available but current search date is not current date startingDateTime = new DateTime(startingDateTime.Year, startingDateTime.Month, 1, 0, 0, 0) .AddMonths(1); continue; } //Iterate though the historic data foreach (HistoricRate rate in result) { if (rate.DateAndTime >= now) { break; } if (previousHistoricRate != null && previousHistoricRate.DateAndTime.ToString("dd/MM/yyyy HH:mm") == rate.DateAndTime.ToString("dd/MM/yyyy HH:mm")) { continue; } //Moving Average 7 days if (maQueue.Count == maPeriod) { maQueue.Dequeue(); } maQueue.Enqueue(rate); //Calculate RSI 14 days if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly > 0) { decimal change = rate.Close - previousHistoricRate.Close; if (change > 0) { increases += change; if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly > period) { RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly = (RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly * (period - 1) + change) / period; RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly = RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly * (period - 1) / period; } } else if (change < 0) { decreases += change * -1; if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly > period) { RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly = RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly * (period - 1) / period; RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly = (RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly * (period - 1) + change * -1) / period; } } if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly >= period) { if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly == period) { RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly = increases / period; RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly = decreases / period; } if (RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly >= period) { RelativeStrengthIndexSettings.RelativeIndexQuarterly = RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly == 0 ? 100 : Math.Round( 100 - 100 / (1 + RelativeStrengthIndexSettings.HistoricChartAverageGainQuarterly / RelativeStrengthIndexSettings.HistoricChartAverageLossQuarterly), 2); } //Generate data data = $"{rate.DateAndTime}," + $"{rate.High}," + $"{rate.Open}," + $"{rate.Close}," + $"{rate.Low}," + $"{rate.Volume}," + $"{maQueue.Average(x => x.Close)}," + $"{RelativeStrengthIndexSettings.RelativeIndexQuarterly}" + "\n"; SaveAnalyticData(fileName, data); } } previousHistoricRate = rate; RelativeStrengthIndexSettings.HistoricChartCurrentPeriodCountQuarterly++; } startingDateTime = previousHistoricRate.DateAndTime.AddMinutes(15); if (previousHistoricRate != null) { RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateCloseQuarterly = previousHistoricRate.Close; RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateOpenQuarterly = previousHistoricRate.Open; RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateLowQuarterly = previousHistoricRate.Low; RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateHighQuarterly = previousHistoricRate.High; RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateVolumeQuarterly = previousHistoricRate.Volume; RelativeStrengthIndexSettings.HistoricChartPreviousHistoricDateTimeQuarterly = previousHistoricRate.DateAndTime.ToString(); Dictionary <string, string> indicatorInformation = new Dictionary <string, string> { ["RSI-15MIN"] = RelativeStrengthIndexSettings.RelativeIndexQuarterly.ToString(CultureInfo .InvariantCulture), ["RSI-1HOUR"] = RelativeStrengthIndexSettings.RelativeIndexHourly .ToString(CultureInfo.InvariantCulture), ["RSI-1DAY"] = RelativeStrengthIndexSettings.RelativeIndexDaily.ToString(CultureInfo.InvariantCulture), ["OPEN-15MIN"] = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateOpenQuarterly.ToString( CultureInfo.InvariantCulture), ["OPEN-1HOUR"] = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateOpenHourly.ToString( CultureInfo.InvariantCulture), ["OPEN-1DAY"] = RelativeStrengthIndexSettings.HistoricChartPreviousHistoricRateOpen.ToString(CultureInfo .InvariantCulture) }; TechnicalIndicatorInformationBroadcast?.Invoke(indicatorInformation); Save(); } } } catch (Exception ex) { ProcessLogBroadcast?.Invoke(MessageType.Error, $"Method: ProcessHistoryHourlyChartDownload\r\nException Stack Trace: {ex.StackTrace}"); } finally { _processHistorySemaphoreSlim.Release(); } }
private async void ProcessHistoryQuarterlyChartDownload() { string fileName = DatabaseDirectory + "\\coinbase_btc_eur_historic_data_quarterly.csv"; string data = "DateTime,High,Open,Close,Low,Volume,MA7,RSI14\n"; //Validate file if (!File.Exists(fileName)) { File.Create(fileName).Close(); SaveAnalyticData(fileName, data); } //Initialise fields const int period = 14; const int maPeriod = 7; const int granularity = 900; DateTime startingDateTime; HistoricRate previousHistoricRate = new HistoricRate() { Close = 0, Open = 0, Low = 0, High = 0, Volume = 0 }; decimal increases = 0; decimal decreases = 0; Queue <HistoricRate> maQueue = new Queue <HistoricRate>(); //Check if we have an empty file or not if (string.IsNullOrWhiteSpace(HistoricChartLastDateTime)) { startingDateTime = new DateTime(2015, 4, 23).Date.ToUniversalTime(); HistoricChartAverageGainQuarterly = 0; HistoricChartAverageLossQuarterly = 0; HistoricChartCurrentPeriodCountQuarterly = 0; } else { startingDateTime = DateTime.Parse(HistoricChartLastDateTimeQuarterly); previousHistoricRate = new HistoricRate() { Close = HistoricChartPreviousHistoricRateCloseQuarterly, Open = HistoricChartPreviousHistoricRateOpenQuarterly, Low = HistoricChartPreviousHistoricRateLowQuarterly, High = HistoricChartPreviousHistoricRateHighQuarterly, Volume = HistoricChartPreviousHistoricRateVolumeQuarterly }; } //Begin data parsing DateTime now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); while (startingDateTime < now) { DateTime endingDateTime = startingDateTime.AddDays(3).ToUniversalTime(); //Get the latest historic data List <HistoricRate> result = await _exchangeService.UpdateProductHistoricCandlesAsync(Product, startingDateTime, endingDateTime, granularity); if (!result.Any() && startingDateTime == new DateTime(2015, 4, 23).Date.ToUniversalTime()) { HistoricChartLastDateTimeQuarterly = DateTime.Now.AddHours(-2).Date.ToUniversalTime().ToString(CultureInfo.InvariantCulture); Save(); } if (!result.Any()) { break; } result.Reverse(); //Iterate though the historic data foreach (HistoricRate rate in result) { if (rate.DateAndTime >= now) { break; } //Moving Average 7 days if (maQueue.Count == maPeriod) { maQueue.Dequeue(); } maQueue.Enqueue(rate); //Calculate RSI 14 days if (HistoricChartCurrentPeriodCountQuarterly > 0) { decimal change = rate.Close - previousHistoricRate.Close; if (change > 0) { increases += change; if (HistoricChartCurrentPeriodCountQuarterly > period) { HistoricChartAverageGainQuarterly = ((HistoricChartAverageGainQuarterly * (period - 1)) + change) / period; HistoricChartAverageLossQuarterly = (HistoricChartAverageLossQuarterly * (period - 1)) / period; } } else if (change < 0) { decreases += (change * -1); if (HistoricChartCurrentPeriodCountQuarterly > period) { HistoricChartAverageGainQuarterly = (HistoricChartAverageGainQuarterly * (period - 1)) / period; HistoricChartAverageLossQuarterly = ((HistoricChartAverageLossQuarterly * (period - 1)) + (change * -1)) / period; } } if (HistoricChartCurrentPeriodCountQuarterly >= period) { if (HistoricChartCurrentPeriodCountQuarterly == period) { HistoricChartAverageGainQuarterly = increases / period; HistoricChartAverageLossQuarterly = decreases / period; } if (HistoricChartCurrentPeriodCountQuarterly >= period) { RelativeIndexQuarterly = HistoricChartAverageLossQuarterly == 0 ? 100 : Math.Round(100 - (100 / (1 + (HistoricChartAverageGainQuarterly / HistoricChartAverageLossQuarterly))), 2); } //Generate data data = $"{rate.DateAndTime}," + $"{rate.High}," + $"{rate.Open}," + $"{rate.Close}," + $"{rate.Low}," + $"{rate.Volume}," + $"{maQueue.Average(x => x.Close)}," + $"{RelativeIndexQuarterly}" + $"\n"; SaveAnalyticData(fileName, data); } } previousHistoricRate = rate; HistoricChartCurrentPeriodCountQuarterly++; } startingDateTime = endingDateTime > now ? now : endingDateTime.AddHours(1); } HistoricChartPreviousHistoricRateCloseQuarterly = previousHistoricRate.Close; HistoricChartPreviousHistoricRateOpenQuarterly = previousHistoricRate.Open; HistoricChartPreviousHistoricRateLowQuarterly = previousHistoricRate.Low; HistoricChartPreviousHistoricRateHighQuarterly = previousHistoricRate.High; HistoricChartPreviousHistoricRateVolumeQuarterly = previousHistoricRate.Volume; Save(); }