public override bool InitIndicatorsAsync() { string directoryName = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location); string env = TestMode ? "test" : "live"; string coinbaseRSIFile = Path.Combine(directoryName, $"data\\coinbase_{env}"); Product product = Products.FirstOrDefault(x => x.BaseCurrency == "BTC" && x.QuoteCurrency == "EUR"); RelativeStrengthIndex relativeStrengthIndex = new RelativeStrengthIndex(coinbaseRSIFile, product); if (product != null) { relativeStrengthIndex.TechnicalIndicatorInformationBroadcast += delegate(Dictionary <string, string> input) { TechnicalIndicatorInformationBroadcast?.Invoke(ApplicationName, input); }; relativeStrengthIndex.ProcessLogBroadcast += delegate(MessageType messageType, string message) { ProcessLogBroadcast?.Invoke(ApplicationName, messageType, message); }; relativeStrengthIndex.UpdateProductHistoricCandles += UpdateProductHistoricCandlesAsync; relativeStrengthIndex.EnableRelativeStrengthIndexUpdater(); return(true); } return(false); }
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(); } }