Ejemplo n.º 1
0
        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 += "]";
            }
        }
Ejemplo n.º 2
0
        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);
        }