public void ParseChart(ChartDefinition chart)
        {
            if (chart.Series.Count == 0)
            {
                return;
            }

            // Put all series into table dataholders containing all the points
            Series = chart.Series.Values.Select(s =>
            {
                var holder = new GridSerie {
                    Name = s.Name
                };
                holder.AddRange(s.Values.Select(p => new GridPoint
                {
                    // Use the actual timestamp as the X value
                    X = p.X.ToString(),
                    Y = p.Y
                }));
                return(holder);
            }).ToList();

            SelectedSeries = Series.First();

            // Modify our tab titel to include the Grid tab
            ChartName = chart.Name;
        }
Beispiel #2
0
 private static Chart MapToChart(this ChartDefinition sourceChart)
 {
     return(new Chart
     {
         Name = sourceChart.Name,
         Series = sourceChart.Series.MapToSeriesDictionary()
     });
 }
Beispiel #3
0
 public static ChartDefinitionDto FromModel(ChartDefinition chartDefinition)
 {
     return(new ChartDefinitionDto
     {
         Identifier = chartDefinition.Identifier,
         Title = chartDefinition.Title,
         AnalysisDataPaths = chartDefinition.AnalysisDataPaths,
         ChartType = chartDefinition.ChartType.ToString(),
         IsXDateTime = chartDefinition.IsXPostDatetime
     });
 }
Beispiel #4
0
        public async Task <ChartDefinition> CreateJobChart(Guid jobId, string title, ChartType chartType, List <AnalysisDataPath> analysisDataPaths, bool isXPostDateTime)
        {
            var newChartDefinition = new ChartDefinition
            {
                Identifier        = Guid.NewGuid(),
                Title             = title,
                ChartType         = chartType,
                AnalysisDataPaths = analysisDataPaths,
                IsXPostDatetime   = isXPostDateTime
            };

            var jobView = await _storageService.GetJobView(jobId);

            EnsureCorrectViewConfiguration(jobView);
            jobView.ViewConfiguration.ChartDefinitions.Add(newChartDefinition);

            await _storageService.UpdateJobView(jobId, jobView);

            return(newChartDefinition);
        }
        public void ParseChart(ChartDefinition sourceChart)
        {
            // Update the title
            Name = sourceChart.Name;

            // Validate the chart
            if (sourceChart.Series.Count == 0)
            {
                return;
            }

            // Group series by their Index.
            // This index is the index of a chart they need to be drawn upon.
            foreach (var sourceSeriesGroup in sourceChart.Series
                     .OrderByDescending(s => s.Value.Index)
                     .GroupBy(s => s.Value.Index))
            {
                // Get the model representing this index
                var childModel = Charts.FirstOrDefault(g => g.Index == sourceSeriesGroup.Key);
                if (childModel == null)
                {
                    // Build a new model
                    childModel = new ChartViewModel(sourceSeriesGroup.Key, this);
                    Charts.Add(childModel);
                    childModel.Index = sourceSeriesGroup.Key;

                    // Create Y axis for the series
                    childModel.YAxesCollection.Add(new Axis
                    {
                        // Title is with combined series
                        Title    = string.Join(", ", sourceSeriesGroup.Select(s => s.Value.Name).ToArray()),
                        Position = AxisPosition.RightTop,
                        Sections = new SectionsCollection
                        {
                            // Horizontal 0 value line
                            new AxisSection
                            {
                                Value           = 0,
                                Stroke          = Brushes.Gray,
                                StrokeThickness = 1
                            }
                        }
                    });
                }

                // Update the series
                foreach (var quantSeries in sourceSeriesGroup
                         .Select(sg => sg.Value)
                         .Where(v => v.Values.Count > 0))
                {
                    //var series = childModel.SeriesCollection[seriesIndex];
                    var series = childModel.SeriesCollection.FirstOrDefault(x => x.Title == quantSeries.Name);

                    if (series == null)
                    {
                        series = _chartParser.BuildSeries(quantSeries);
                        childModel.SeriesCollection.Add(series);
                    }

                    if (!childModel.LastUpdates.ContainsKey(series.Title))
                    {
                        childModel.LastUpdates[series.Title] = Instant.MinValue;
                    }

                    var updates = quantSeries.Since(childModel.LastUpdates[series.Title]);
                    _chartParser.UpdateSeries(series, updates);

                    if (updates.Values.Any())
                    {
                        childModel.LastUpdates[series.Title] = updates.Values.Last().X;
                    }
                    if (updates.Values.Any() && series.Values.Count == _seriesMaximum)
                    {
                        // This series is probably truncated by the LEAN engine. Add warning visual elemeent
                        var lastValue = updates.Values.Last();
                        childModel.CreateTruncatedVisuaLElement(0, lastValue.X, lastValue.Y);
                        _messenger.Send(new LogEntryReceivedMessage(DateTime.Now, $"Series { Name}.{series.Title} is possibly truncated by the LEAN engine", LogItemType.Monitor));
                    }
                }
            }

            var sourceScrollSeries = sourceChart.Series
                                     .Select(s => s.Value)
                                     .OrderByDescending(s => s.SeriesType == SeriesType.Line)
                                     .ThenByDescending(s => s.SeriesType == SeriesType.Candle)
                                     .First(s => s.Index == 0);

            var scrollSeries = (Series)ScrollSeriesCollection.FirstOrDefault();

            if (scrollSeries == null && sourceScrollSeries.Values.Any())
            {
                Zoom.StartPoint = sourceScrollSeries.Values[0].X;
                scrollSeries    = _chartParser.BuildSeries(sourceScrollSeries);
                ScrollSeriesCollection.Add(scrollSeries);
            }

            if (!LastUpdates.ContainsKey("Scroll"))
            {
                LastUpdates["Scroll"] = Instant.MinValue;
            }
            var scrollSeriesUpdates = sourceScrollSeries.Since(LastUpdates["Scroll"]);

            if (scrollSeries != null)
            {
                _chartParser.UpdateSeries(scrollSeries, scrollSeriesUpdates);
                if (scrollSeriesUpdates.Values.Any())
                {
                    LastUpdates["Scroll"] = scrollSeriesUpdates.Values.Last().X;
                }
            }

            Zoom.AutoZoom();
        }