private void BuildMarketTrendChartData() { if (MarketTrends.Count > 0) { TrendChartDataJSON = "["; int mtIndex = 0; foreach (MarketTrend mt in MarketTrends) { if (mt.DisplayGraph) { string lineColor = ""; if (mtIndex < Constants.ChartLineColors.Length) { lineColor = Constants.ChartLineColors[mtIndex]; } else { lineColor = Constants.ChartLineColors[mtIndex - 20]; } if (Summary.MarketTrendChanges.ContainsKey(mt.Name)) { List <MarketTrendChange> marketTrendChangeSummaries = Summary.MarketTrendChanges[mt.Name]; if (marketTrendChangeSummaries.Count > 0) { if (!TrendChartDataJSON.Equals("[")) { TrendChartDataJSON += ","; } TrendChartDataJSON += "{"; TrendChartDataJSON += "key: '" + SystemHelper.SplitCamelCase(mt.Name) + "',"; TrendChartDataJSON += "color: '" + lineColor + "',"; TrendChartDataJSON += "values: ["; // Get trend ticks for chart DateTime currentDateTime = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, DateTime.UtcNow.Hour, 0, 0); DateTime startDateTime = currentDateTime.AddHours(-PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours); DateTime endDateTime = currentDateTime; int trendChartTicks = 0; for (DateTime tickTime = startDateTime; tickTime <= endDateTime; tickTime = tickTime.AddMinutes(PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes)) { List <MarketTrendChange> tickRange = marketTrendChangeSummaries.FindAll(m => m.TrendDateTime >= tickTime).OrderBy(m => m.TrendDateTime).ToList(); if (tickRange.Count > 0) { MarketTrendChange mtc = tickRange.First(); if (tickTime != startDateTime) { TrendChartDataJSON += ",\n"; } if (Double.IsInfinity(mtc.TrendChange)) { mtc.TrendChange = 0; } TrendChartDataJSON += "{ x: new Date('" + tickTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; trendChartTicks++; } } // Add most recent tick List <MarketTrendChange> latestTickRange = marketTrendChangeSummaries.OrderByDescending(m => m.TrendDateTime).ToList(); if (latestTickRange.Count > 0) { MarketTrendChange mtc = latestTickRange.First(); if (trendChartTicks > 0) { TrendChartDataJSON += ",\n"; } if (Double.IsInfinity(mtc.TrendChange)) { mtc.TrendChange = 0; } TrendChartDataJSON += "{ x: new Date('" + mtc.TrendDateTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; } TrendChartDataJSON += "]"; TrendChartDataJSON += "}"; mtIndex++; } } } } TrendChartDataJSON += "]"; } }
public static List <MarketTrendChange> GetMarketTrendChanges(string platform, string mainMarket, MarketTrend marketTrend, List <string> marketList, Dictionary <string, Market> recentMarkets, Dictionary <string, Market> trendMarkets, string sortBy, bool isGlobal, PTMagicConfiguration systemConfiguration, LogHelper log) { List <MarketTrendChange> result = new List <MarketTrendChange>(); var sortedMarkets = new SortedDictionary <string, Market>(recentMarkets).OrderBy(m => m.Value.Position); if (sortBy.Equals("Volume")) { sortedMarkets = new SortedDictionary <string, Market>(recentMarkets).OrderByDescending(m => m.Value.Volume24h); } int marketCount = 1; foreach (KeyValuePair <string, Market> recentMarketPair in sortedMarkets) { if (marketList.Count == 0 || marketList.Contains(recentMarketPair.Key)) { bool excludeMainCurrency = systemConfiguration.AnalyzerSettings.MarketAnalyzer.ExcludeMainCurrency; if (!marketTrend.ExcludeMainCurrency) { excludeMainCurrency = marketTrend.ExcludeMainCurrency; } if (platform.Equals("CoinMarketCap", StringComparison.InvariantCulture) && excludeMainCurrency) { // Check if this is the main currency (only for CoinMarketCap) if (recentMarketPair.Value.Symbol.Equals(mainMarket, StringComparison.InvariantCultureIgnoreCase)) { // If the current market is the main currency, skip it continue; } } Market recentMarket = recentMarkets[recentMarketPair.Key]; if (trendMarkets.ContainsKey(recentMarketPair.Key)) { List <string> ignoredMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.IgnoredMarkets, ","); if (ignoredMarkets.Contains(recentMarketPair.Value.Symbol)) { log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is ignored in this trend."); continue; } List <string> allowedMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.AllowedMarkets, ","); if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(recentMarketPair.Value.Symbol)) { log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is not allowed in this trend."); continue; } Market trendMarket = trendMarkets[recentMarketPair.Key]; if (trendMarket != null) { double recentMarketPrice = recentMarket.Price; double trendMarketPrice = trendMarket.Price; if (!platform.Equals("CoinMarketCap", StringComparison.InvariantCulture) && marketTrend.TrendCurrency.Equals("Fiat", StringComparison.InvariantCultureIgnoreCase)) { if (recentMarket.MainCurrencyPriceUSD > 0 && trendMarket.MainCurrencyPriceUSD > 0) { recentMarketPrice = recentMarketPrice * recentMarket.MainCurrencyPriceUSD; trendMarketPrice = trendMarketPrice * trendMarket.MainCurrencyPriceUSD; } } double trendMarketChange = (recentMarketPrice - trendMarketPrice) / trendMarketPrice * 100; MarketTrendChange mtc = new MarketTrendChange(); mtc.MarketTrendName = marketTrend.Name; mtc.TrendMinutes = marketTrend.TrendMinutes; mtc.TrendChange = trendMarketChange; mtc.Market = recentMarket.Name; mtc.LastPrice = recentMarket.Price; mtc.Volume24h = recentMarket.Volume24h; mtc.TrendDateTime = DateTime.Now; result.Add(mtc); log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' (Vol. " + recentMarket.Volume24h.ToString("#,#0.00") + ") is " + trendMarketChange.ToString("#,#0.00") + "% in " + SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60).ToLower() + "."); marketCount++; } } } } if (marketTrend.MaxMarkets > 0 && isGlobal) { int maxMarkets = (marketTrend.MaxMarkets <= result.Count) ? marketTrend.MaxMarkets : result.Count; result = result.GetRange(0, maxMarkets); } return(result); }