public MainViewModel()
        {
            var ds0 = new XyDataSeries<double, double>();
            var someData = new RandomWalkGenerator().GetRandomWalkSeries(200); // RandomWalkGenerator is found in the examples source code

            ds0.Append(someData.XData, someData.YData);

            // With SeriesSource API you do not need a DataSet. This is created automatically to match
            // the type of DataSeries<Tx,Ty>. All DataSeries must be the same type however

            // Create a list of ChartSeriesViewModel which unify dataseries and render series
            // This way you can add/remove your series and change the render series type easily
            // without worrying about DataSeriesIndex as per SciChart v1.3
            _chartSeries = new ObservableCollection<IChartSeriesViewModel>();
            _chartSeries.Add(new ChartSeriesViewModel(ds0, new FastLineRenderableSeries()));

            // Now create the labels
            _chartLabels = new[]
                               {
                                   new LabelViewModel(5, -2.5, "Label0", "Label0 Tooltip!"),
                                   new LabelViewModel(20, -2, "Label1", "Label1 Tooltip!"),
                                   new LabelViewModel(35, 3, "Label2", "Label2 Tooltip!"),
                                   new LabelViewModel(50, 1.5, "Label3", "Label3 Tooltip!"),
                                   new LabelViewModel(65, -0.5, "Label4", "Label4 Tooltip!"),
                               };
        }
 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
     var depthAndCurves = value as ObservableCollection<DepthCurveInfo>;
     var lstToBeUsed = depthAndCurves.Except(depthAndCurves.Where(u => u.Curve <= -999 && u.Curve >= (decimal)-999.99)).ToList();
     var dataSeries = new XyDataSeries<double, double>();
     dataSeries.AcceptsUnsortedData = true;
     lstToBeUsed.ForEach(u => dataSeries.Append((double)u.Curve, (double)u.Depth));
     return lstToBeUsed;
 }
Esempio n. 3
0
        public void AddLithologiesToTrack(TrackToShow track)
        {
            var renderableSeries = track.CurveRenderableSeries.Where(u => u.GetType() == typeof(FastLineRenderableSeries)).Select(v => v as FastLineRenderableSeries);

            FastLineRenderableSeries actualLithologySeries = null;
            actualLithologySeries = renderableSeries.SingleOrDefault(u => u.Name == "Lithology" && u.XAxisId == "Lithology");

            if (actualLithologySeries == null)
            {
                LithologyManager.Instance.AddLithologyAxisInChart(track);
                actualLithologySeries = renderableSeries.SingleOrDefault(u => u.Name == "Lithology" && u.XAxisId == "Lithology");
            }
            var lst = track.TrackObject.Lithologies;

            actualLithologySeries.IsVisible = true;
            var grouped = lst.GroupBy(u => u.LithologyName).ToList();
            var seriesCollection = new ObservableCollection<FastLineRenderableSeries>();

            var trackObject = track.TrackObject;
            var curveToShowObject = track.Curves.SingleOrDefault(u => u.RefChart == trackObject.RefChart && u.RefTrack == trackObject.ID && u.RefDataset == "Lithology");

            foreach (var obj in grouped)
            {
                var dataSeries = new XyDataSeries<double, double>();
                var fullDataSeries = new XyDataSeries<double, double>();

                string imageName = obj.Key;

                FastLineRenderableSeries normalLithologySeries = GetNormalLithologySeries(dataSeries, imageName);
                FastLineRenderableSeries fullLithologySeries = GetFullLithologySeries(fullDataSeries, imageName, track);
                ApplyBindingToNormalLithology(actualLithologySeries, normalLithologySeries);
                ApplyBindingToFullLithology(actualLithologySeries, fullLithologySeries);

                seriesCollection.Add(normalLithologySeries);
                seriesCollection.Add(fullLithologySeries);

                foreach (var item in obj)
                {
                    decimal initialDepth = item.InitialDepth;
                    decimal finalDepth = item.FinalDepth;
                    for (decimal i = initialDepth; i <= finalDepth; i++)
                    {
                        dataSeries.Append(9.5, double.Parse(i.ToString()));
                        fullDataSeries.Append(5, double.Parse(i.ToString()));
                    }
                }
                if (curveToShowObject != null)
                    actualLithologySeries.IsVisible = curveToShowObject.IsSeriesVisible;
            }
            foreach (var series in seriesCollection)
                track.CurveRenderableSeries.Add(series);
        }
Esempio n. 4
0
        // Business logic
        /// <summary>
        /// Add data for a symbol to the chart
        /// </summary>
        /// <param name="quoteList">Retrieved quotes</param>
        /// <param name="seriesName">Name for the series (symbol + moving average length)</param>
        private void AddSeries(SortedList<DateTime, double> quoteList, string seriesName)
        {
            // Create a new data series
            var series = new XyDataSeries<DateTime, double>();
            series.Append(quoteList.Keys, quoteList.Values);
            series.SeriesName = seriesName;
            stockChart.DataSet.Add(series);

            // Display the data via RenderableSeries
            var renderSeries = new FastMountainRenderableSeries();
            stockChart.RenderableSeries.Add(renderSeries);

            stockChart.DataSet.InvalidateParentSurface(RangeMode.ZoomToFit);
            stockChart.ZoomExtents();
        }
        protected override void InitExampleInternal()
        {
            Surface = new SCIChartSurface(_exampleViewLayout.SciChartSurfaceView);
            StyleHelper.SetSurfaceDefaultStyle(Surface);

            var dampedSinewave = DataManager.Instance.GetDampedSinewave(1.0, 0.02, 150, 5);

            var dataSeries = new XyDataSeries <double, double>();

            dataSeries.Append(dampedSinewave.XData, dampedSinewave.YData);

            var axisStyle = StyleHelper.GetDefaultAxisStyle();
            var xAxis     = new SCINumericAxis {
                IsXAxis = true, GrowBy = new SCIDoubleRange(0.1, 0.1), Style = axisStyle
            };
            var yAxis = new SCINumericAxis {
                GrowBy = new SCIDoubleRange(0.1, 0.1), Style = axisStyle
            };

            var renderSeries = new SCIXyScatterRenderableSeries
            {
                DataSeries = dataSeries,
                Style      =
                {
                    PointMarker   = new SCIEllipsePointMarker
                    {
                        FillBrush = new SCIBrushSolid(UIColor.FromRGB(70, 130, 180)),
                        BorderPen = new SCIPenSolid(UIColor.FromRGB(176,  196,  222),2f),
                        Width     =                                   15,
                        Height    = 15
                    }
                }
            };

            Surface.AttachAxis(xAxis, true);
            Surface.AttachAxis(yAxis, false);
            Surface.AttachRenderableSeries(renderSeries);

            Surface.ChartModifier = new SCIModifierGroup(new ISCIChartModifierProtocol[]
            {
                new SCIZoomPanModifier(),
                new SCIPinchZoomModifier(),
                new SCIZoomExtentsModifier()
            });

            Surface.InvalidateElement();
        }
        public StackedBarChartExampleView()
        {
            InitializeComponent();

            sciChart.Rendered += (o, args) =>
            {
                if (!_firstTimeRendered)
                {
                    _firstTimeRendered = true;
                    sciChart.ZoomExtents();
                }
            };

            var yValues1 = new[] { 0.0, 0.1, 0.2, 0.4, 0.8, 1.1, 1.5, 2.4, 4.6, 8.1, 11.7, 14.4, 16.0, 13.7, 10.1, 6.4, 3.5, 2.5, 5.4, 6.4, 7.1, 8.0, 9.0 };
            var yValues2 = new[] { 2.0, 10.1, 10.2, 10.4, 10.8, 1.1, 11.5, 3.4, 4.6, 0.1, 1.7, 14.4, 16.0, 13.7, 10.1, 6.4, 3.5, 2.5, 1.4, 0.4, 10.1, 0.0, 0.0 };
            var yValues3 = new[] { 20.0, 4.1, 4.2, 10.4, 10.8, 1.1, 11.5, 3.4, 4.6, 5.1, 5.7, 14.4, 16.0, 13.7, 10.1, 6.4, 3.5, 2.5, 1.4, 10.4, 8.1, 10.0, 15.0 };

            var dataSeries1 = new XyDataSeries <double, double> {
                SeriesName = "data1"
            };
            var dataSeries2 = new XyDataSeries <double, double> {
                SeriesName = "data2"
            };
            var dataSeries3 = new XyDataSeries <double, double> {
                SeriesName = "data3"
            };

            for (int i = 0; i < yValues1.Length; i++)
            {
                dataSeries1.Append(i, yValues1[i]);
            }
            for (int i = 0; i < yValues2.Length; i++)
            {
                dataSeries2.Append(i, yValues2[i]);
            }
            for (int i = 0; i < yValues3.Length; i++)
            {
                dataSeries3.Append(i, yValues3[i]);
            }

            using (sciChart.SuspendUpdates())
            {
                columnSeries1.DataSeries = dataSeries1;
                columnSeries2.DataSeries = dataSeries2;
                columnSeries3.DataSeries = dataSeries3;
            }
        }
        protected override void InitExample()
        {
            var xAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };
            var yAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };

            var ds1Points  = DataManager.Instance.GetDampedSinewave(1.0, 0.05, 50, 5);
            var dataSeries = new XyDataSeries <double, double>();

            dataSeries.Append(ds1Points.XData, ds1Points.YData);

            var rSeries = new FastImpulseRenderableSeries
            {
                DataSeries  = dataSeries,
                StrokeStyle = new SolidPenStyle(0xFF0066FF, 2f.ToDip(Activity)),
                PointMarker = new EllipsePointMarker
                {
                    Width       = 10.ToDip(Activity),
                    Height      = 10.ToDip(Activity),
                    StrokeStyle = new SolidPenStyle(0xFF0066FF, 2f.ToDip(Activity)),
                    FillStyle   = new SolidBrushStyle(0xFF0066FF)
                }
            };

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(rSeries);
                Surface.ChartModifiers = new ChartModifierCollection
                {
                    new ZoomPanModifier(),
                    new PinchZoomModifier(),
                    new ZoomExtentsModifier()
                };

                new WaveAnimatorBuilder(rSeries)
                {
                    Interpolator = new DecelerateInterpolator(), Duration = 3000, StartDelay = 350
                }.Start();
            }
        }
Esempio n. 8
0
        public ManipulateSeriesMvvmViewModel()
        {
            _renderableSeriesViewModels = new ObservableCollection <IRenderableSeriesViewModel>();

            _addCommand = new ActionCommand(() =>
            {
                RenderableSeriesViewModels.Add(ViewModelsFactory.New(SelectedSeriesType.Type, 0));
                ZoomExtents();
                ClearCommand.RaiseCanExecuteChanged();
            }, () => SelectedSeriesType != null);

            _removeCommand = new ActionCommand(() =>
            {
                RenderableSeriesViewModels.RemoveWhere(s => s.IsSelected);
                ClearCommand.RaiseCanExecuteChanged();
            }, () => RenderableSeriesViewModels.Any(s => s.IsSelected));

            _clearCommand = new ActionCommand(() =>
            {
                RenderableSeriesViewModels.Clear();
                ClearCommand.RaiseCanExecuteChanged();
            }, () => RenderableSeriesViewModels.Count > 0);

            _selectionChangedCommand = new ActionCommand(() =>
            {
                var rSeriesVm = RenderableSeriesViewModels.FirstOrDefault(s => s.IsSelected);
                if (rSeriesVm != null)
                {
                    SelectedSeriesType = SeriesTypes.FirstOrDefault(x => x.Type == rSeriesVm.GetType());
                }
                RemoveCommand.RaiseCanExecuteChanged();
            });

            var data = DataManager.Instance.GetSinewave(1.0, 0.5, 100, 5);

            var lineDataSeries = new XyDataSeries <double, double>();

            lineDataSeries.Append(data.XData.Select(d => d * 5), data.YData);

            FillSeriesTypes();
            SelectedSeriesType = SeriesTypes[3];

            _addCommand.Execute(null);

            AddCommand.RaiseCanExecuteChanged();
            RemoveCommand.RaiseCanExecuteChanged();
        }
Esempio n. 9
0
        private void StackedColumnChartExampleView_OnLoaded(object sender, RoutedEventArgs e)
        {
            var porkData     = new double[] { 10, 13, 7, 16, 4, 6, 20, 14, 16, 10, 24, 11 };
            var vealData     = new double[] { 12, 17, 21, 15, 19, 18, 13, 21, 22, 20, 5, 10 };
            var tomatoesData = new double[] { 7, 30, 27, 24, 21, 15, 17, 26, 22, 28, 21, 22 };
            var cucumberData = new double[] { 16, 10, 9, 8, 22, 14, 12, 27, 25, 23, 17, 17 };
            var pepperData   = new double[] { 7, 24, 21, 11, 19, 17, 14, 27, 26, 22, 28, 16 };

            var dataSeries1 = new XyDataSeries <double, double> {
                SeriesName = "Pork"
            };
            var dataSeries2 = new XyDataSeries <double, double> {
                SeriesName = "Veal"
            };
            var dataSeries3 = new XyDataSeries <double, double> {
                SeriesName = "Tomato"
            };
            var dataSeries4 = new XyDataSeries <double, double> {
                SeriesName = "Cucumber"
            };
            var dataSeries5 = new XyDataSeries <double, double> {
                SeriesName = "Pepper"
            };

            const int data = 1992;

            for (int i = 0; i < porkData.Length; i++)
            {
                dataSeries1.Append(data + i, porkData[i]);
                dataSeries2.Append(data + i, vealData[i]);
                dataSeries3.Append(data + i, tomatoesData[i]);
                dataSeries4.Append(data + i, cucumberData[i]);
                dataSeries5.Append(data + i, pepperData[i]);
            }

            using (SciChart.SuspendUpdates())
            {
                SciChart.RenderableSeries[0].DataSeries = dataSeries1;
                SciChart.RenderableSeries[1].DataSeries = dataSeries2;
                SciChart.RenderableSeries[2].DataSeries = dataSeries3;
                SciChart.RenderableSeries[3].DataSeries = dataSeries4;
                SciChart.RenderableSeries[4].DataSeries = dataSeries5;
            }

            SciChart.ZoomExtents();
        }
Esempio n. 10
0
        private void AddNewCandle(Candle candle, double?indicatorValue)
        {
            using (ohlcSeries.SuspendUpdates())
                using (sarSeries.SuspendUpdates())
                {
                    ohlcSeries.Append(candle.Time, (double)candle.Open, (double)candle.High, (double)candle.Low, (double)candle.Close);

                    if (indicatorValue != null)
                    {
                        sarSeries.Append(candle.Time, indicatorValue.Value);
                    }

                    candlesCount++;

                    StockChart.XAxis.VisibleRange = new IndexRange(candlesCount - 50, candlesCount);
                }
        }
Esempio n. 11
0
        private void PointMarkersSelectionExampleView_OnLoaded(object sender, RoutedEventArgs e)
        {
            // Create a DataSeries of type X=double, Y=double
            var dataSeries1 = new XyDataSeries <double, double> {
                SeriesName = "Green"
            };
            var dataSeries2 = new XyDataSeries <double, double> {
                SeriesName = "Blue"
            };
            var dataSeries3 = new XyDataSeries <double, double> {
                SeriesName = "Yellow"
            };

            // Attach DataSeries to RenderableSeries
            lineRenderSeries1.DataSeries = dataSeries1;
            lineRenderSeries2.DataSeries = dataSeries2;
            lineRenderSeries3.DataSeries = dataSeries3;

            // Generate data
            var count = 200;
            var data1 = DataManager.Instance.GetSinewave(100, 55, count);
            var data3 = DataManager.Instance.GetSinewave(50, 20, count);

            // Append data to series
            using (sciChart.SuspendUpdates())
            {
                dataSeries1.Append(data1.XData, data1.YData,
                                   data1.XData.Select((d) => new MyMetadata {
                    IsSelected = false
                }));
                dataSeries3.Append(data3.XData, data3.YData,
                                   data3.XData.Select((d) => new MyMetadata {
                    IsSelected = false
                }));

                for (int i = 0; i < count; i += 4)
                {
                    dataSeries2.Append(data1.XData[i], i++, new MyMetadata {
                        IsSelected = false
                    });
                }
            }

            // Zoom out to the extents of data
            sciChart.ZoomExtents();
        }
Esempio n. 12
0
        // Business logic

        /// <summary>
        /// Add data for a symbol to the chart
        /// </summary>
        /// <param name="quoteList">Retrieved quotes</param>
        /// <param name="seriesName">Name for the series (symbol + moving average length)</param>
        private void AddSeries(SortedList <DateTime, double> quoteList, string seriesName)
        {
            // Create a new data series
            var series = new XyDataSeries <DateTime, double>();

            series.Append(quoteList.Keys, quoteList.Values);
            series.SeriesName = seriesName;
            stockChart.DataSet.Add(series);

            // Display the data via RenderableSeries
            var renderSeries = new FastMountainRenderableSeries();

            stockChart.RenderableSeries.Add(renderSeries);

            stockChart.DataSet.InvalidateParentSurface(RangeMode.ZoomToFit);
            stockChart.ZoomExtents();
        }
Esempio n. 13
0
        private void ShiftedAxes_OnLoaded(object sender, RoutedEventArgs e)
        {
            using (sciChart.SuspendUpdates())
            {
                var dataSeries = new XyDataSeries <double, double> {
                    AcceptsUnsortedData = true
                };
                lineRenderSeries.DataSeries = dataSeries;

                var data = DataManager.Instance.GetButterflyCurve(20000);
                dataSeries.Append(data.XData, data.YData);
            }

            // To provide correct appearance of chart in Silverlight
            // we use Dispatcher to delay ZoomExtents call on chart
            Dispatcher.BeginInvoke(new Action(() => sciChart.ZoomExtents()));
        }
Esempio n. 14
0
        public XyDataSeries <double, double> GetRobotLidarPoints()
        {
            var dataSeries = new XyDataSeries <double, double>();

            if (lidarMap == null)
            {
                return(dataSeries);
            }

            var listX = lidarMap.Select(e => e.X);
            var listY = lidarMap.Select(e => e.Y);

            //dataSeries.Clear();
            dataSeries.AcceptsUnsortedData = true;
            dataSeries.Append(listX, listY);
            return(dataSeries);
        }
Esempio n. 15
0
        public RsiPaneViewModel(CreateMultiPaneStockChartsViewModel parentViewModel, PriceSeries prices)
            : base(parentViewModel)
        {
            var rsiSeries = new XyDataSeries <DateTime, double>()
            {
                SeriesName = "RSI"
            };

            rsiSeries.Append(prices.TimeData, prices.Rsi(14));
            ChartSeriesViewModels.Add(new LineRenderableSeriesViewModel {
                DataSeries = rsiSeries
            });

            YAxisTextFormatting = "0.0";

            Height = 100;
        }
        protected override void InitExampleInternal()
        {
            Surface = new SCIChartSurface(_exampleViewLayout.SciChartSurfaceView);
            StyleHelper.SetSurfaceDefaultStyle(Surface);

            var priceData = DataManager.Instance.GetPriceDataIndu();

            var dataSeries = new XyDataSeries <DateTime, double>();

            dataSeries.DataDistributionCalculator = new SCIUserDefinedDistributionCalculator();
            dataSeries.Append(priceData.TimeData, priceData.CloseData);

            var axisStyle = StyleHelper.GetDefaultAxisStyle();
            var xAxis     = new SCIDateTimeAxis {
                IsXAxis = true, GrowBy = new SCIDoubleRange(0.1, 0.1), Style = axisStyle, AxisId = "xAxis"
            };
            var yAxis = new SCINumericAxis {
                GrowBy = new SCIDoubleRange(0.1, 0.1), Style = axisStyle, AxisId = "yAxis"
            };

            var renderSeries = new SCIFastMountainRenderableSeries
            {
                DataSeries = dataSeries,
                XAxisId    = xAxis.AxisId,
                YAxisId    = yAxis.AxisId,
                Style      =
                {
                    AreaBrush = new SCIBrushLinearGradient(0xAAFF8D42, 0x88090E11, SCILinearGradientDirection.Vertical),
                    BorderPen = new SCIPenSolid(0xaaffc9a8, 0.7f)
                }
            };

            Surface.AttachAxis(xAxis, true);
            Surface.AttachAxis(yAxis, false);
            Surface.AttachRenderableSeries(renderSeries);

            Surface.ChartModifier = new SCIModifierGroup(new ISCIChartModifierProtocol[]
            {
                new SCIZoomPanModifier(),
                new SCIPinchZoomModifier(),
                new SCIZoomExtentsModifier()
            });

            Surface.InvalidateElement();
        }
        protected override void InitExample()
        {
            var xAxis = new SCINumericAxis {
                GrowBy = new SCIDoubleRange(0.1, 0.1)
            };
            var yAxis = new SCINumericAxis {
                GrowBy = new SCIDoubleRange(0.1, 0.1)
            };

            var ds1Points  = DataManager.Instance.GetDampedSinewave(1.0, 0.05, 50, 5);
            var dataSeries = new XyDataSeries <double, double>();

            dataSeries.Append(ds1Points.XData, ds1Points.YData);

            var renderableSeries = new SCIFastImpulseRenderableSeries
            {
                DataSeries  = dataSeries,
                StrokeStyle = new SCISolidPenStyle(0xFF0066FF, 2f),
                PointMarker = new SCIEllipsePointMarker
                {
                    Width       = 7,
                    Height      = 7,
                    StrokeStyle = new SCISolidPenStyle(0xFF0066FF, 2f),
                    FillStyle   = new SCISolidBrushStyle(0xFF0066FF),
                }
            };

            var animation = new SCIWaveRenderableSeriesAnimation(3, SCIAnimationCurve.EaseOut);

            animation.StartAfterDelay(0.3f);
            renderableSeries.AddAnimation(animation);

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(renderableSeries);
                Surface.ChartModifiers = new SCIChartModifierCollection
                {
                    new SCIZoomPanModifier(),
                    new SCIPinchZoomModifier(),
                    new SCIZoomExtentsModifier()
                };
            }
        }
Esempio n. 18
0
        protected override void InitExample()
        {
            var xAxis = new NumericAxis(Activity);
            var yAxis = new NumericAxis(Activity);

            var yValues1 = new[] { 4.0, 7, 5.2, 9.4, 3.8, 5.1, 7.5, 12.4, 14.6, 8.1, 11.7, 14.4, 16.0, 3.7, 5.1, 6.4, 3.5, 2.5, 12.4, 16.4, 7.1, 8.0, 9.0 };
            var yValues2 = new[] { 15.0, 10.1, 10.2, 10.4, 10.8, 1.1, 11.5, 3.4, 4.6, 0.1, 1.7, 14.4, 6.0, 13.7, 10.1, 8.4, 8.5, 12.5, 1.4, 0.4, 10.1, 5.0, 1.0 };

            var ds1 = new XyDataSeries <double, double> {
                SeriesName = "data 1"
            };
            var ds2 = new XyDataSeries <double, double> {
                SeriesName = "data 2"
            };

            for (var i = 0; i < yValues1.Length; i++)
            {
                ds1.Append(i, yValues1[i]);
            }
            for (var i = 0; i < yValues2.Length; i++)
            {
                ds2.Append(i, yValues2[i]);
            }

            var series1 = GetRenderableSeries(ds1, Color.Argb(0xDD, 0xDB, 0xE0, 0xE1), Color.Argb(0x88, 0xB6, 0xC1, 0xC3));
            var series2 = GetRenderableSeries(ds2, Color.Argb(0xDD, 0xDA, 0xCB, 0xCCA), Color.Argb(0x88, 0x43, 0x9A, 0xAF));

            var seriesCollection = new VerticallyStackedMountainsCollection();

            seriesCollection.Add(series1);
            seriesCollection.Add(series2);

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(seriesCollection);

                Surface.ChartModifiers = new ChartModifierCollection
                {
                    new CursorModifier(),
                    new ZoomExtentsModifier(),
                };
            }
        }
        private void UpdateFFTDataSeries(XYDataSeries <int, int> dataSeries)
        {
            var xArray = new int[dataSeries.YValues.Length];

            for (int i = 0; i < dataSeries.YValues.Length; i++)
            {
                xArray[i] = i;
            }

            if (fftDataSeries.Count == 0)
            {
                fftDataSeries.Append(xArray, dataSeries.YValues);
            }
            else
            {
                fftDataSeries.UpdateRangeYAt(0, dataSeries.YValues);
            }
        }
Esempio n. 20
0
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            var scatterData = new XyDataSeries <double, double>();
            var lineData    = new XyDataSeries <double, double>();

            // NEW CODE HERE
            // Ensure that DataSeries are named for the legend
            scatterData.SeriesName = "Cos(x)";
            lineData.SeriesName    = "Sin(x)";
            // END NEW CODE
            for (int i = 0; i < 1000; i++)
            {
                lineData.Append(i, Math.Sin(i * 0.1));
                scatterData.Append(i, Math.Cos(i * 0.1));
            }
            LineSeries.DataSeries    = lineData;
            ScatterSeries.DataSeries = scatterData;
        }
Esempio n. 21
0
            public RsiPaneModel(Context context, PriceSeries prices) : base(context, RSI, "0.0", false)
            {
                var rsiSeries = new XyDataSeries <DateTime, double> {
                    SeriesName = "RSI"
                };
                var xData = prices.TimeData;
                var yData = prices.Rsi(14);

                rsiSeries.Append(xData, yData);
                AddRenderableSeries(new FastLineRenderableSeries  {
                    DataSeries = rsiSeries, YAxisId = RSI
                });

                Annotations.Add(new AxisMarkerAnnotation(context)
                {
                    Y1 = (Java.Lang.IComparable)rsiSeries.YValues.Get(rsiSeries.Count - 1), YAxisId = RSI
                });
            }
Esempio n. 22
0
        protected override void InitExample()
        {
            var xAxis = new SCINumericAxis();
            var yAxis = new SCINumericAxis();

            var yValues1 = new[] { 4.0, 7, 5.2, 9.4, 3.8, 5.1, 7.5, 12.4, 14.6, 8.1, 11.7, 14.4, 16.0, 3.7, 5.1, 6.4, 3.5, 2.5, 12.4, 16.4, 7.1, 8.0, 9.0 };
            var yValues2 = new[] { 15.0, 10.1, 10.2, 10.4, 10.8, 1.1, 11.5, 3.4, 4.6, 0.1, 1.7, 14.4, 6.0, 13.7, 10.1, 8.4, 8.5, 12.5, 1.4, 0.4, 10.1, 5.0, 1.0 };

            var ds1 = new XyDataSeries <double, double> {
                SeriesName = "data 1"
            };
            var ds2 = new XyDataSeries <double, double> {
                SeriesName = "data 2"
            };

            for (var i = 0; i < yValues1.Length; i++)
            {
                ds1.Append(i, yValues1[i]);
            }
            for (var i = 0; i < yValues2.Length; i++)
            {
                ds2.Append(i, yValues2[i]);
            }

            var series1 = GetRenderableSeries(ds1, 0xDDDBE0E1, 0x88B6C1C3);
            var series2 = GetRenderableSeries(ds2, 0xDDACBCCA, 0x88439AAF);

            var seriesCollection = new SCIVerticallyStackedMountainsCollection();

            seriesCollection.Add(series1);
            seriesCollection.Add(series2);

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(seriesCollection);
                Surface.ChartModifiers = new SCIChartModifierCollection
                {
                    new SCICursorModifier(),
                    new SCIZoomExtentsModifier()
                };
            }
        }
        protected override void InitExample()
        {
            var ds1Points = DataManager.Instance.GetDampedSinewave(1.0, 0.05, 50, 5);

            var dataSeries = new XyDataSeries <double, double>();

            dataSeries.Append(ds1Points.XData, ds1Points.YData);

            var xAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };
            var yAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };

            var renderableSeries = new FastImpulseRenderableSeries
            {
                DataSeries  = dataSeries,
                StrokeStyle = new PenStyle.Builder(Activity).WithColor(Color.Rgb(0x00, 0x66, 0xFF)).WithThickness(1f, ComplexUnitType.Dip).Build(),
                PointMarker = new EllipsePointMarker
                {
                    Width       = 10,
                    Height      = 10,
                    StrokeStyle = new PenStyle.Builder(Activity).WithColor(Color.Rgb(0x00, 0x66, 0xFF)).WithThickness(0.7f, ComplexUnitType.Dip).Build(),
                    FillStyle   = new SolidBrushStyle(Color.Rgb(0x00, 0x66, 0xFF))
                }
            };

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(renderableSeries);

                Surface.ChartModifiers = new ChartModifierCollection
                {
                    new ZoomPanModifier(),
                    new PinchZoomModifier(),
                    new ZoomExtentsModifier()
                };
            }
        }
Esempio n. 24
0
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            Task.Factory.StartNew(() =>
            {
                // Creates 8 dataseries with data on a background thread
                var dataSeries = new List <IDataSeries>();
                for (int i = 0; i < 8; i++)
                {
                    var ds = new XyDataSeries <double, double>();
                    dataSeries.Add(ds);
                    var someData = DataManager.Instance.GetAcousticChannel(i);

                    ds.Append(someData.XData, someData.YData);
                }

                // Creates 8 renderable series on the UI thread
                Dispatcher.BeginInvoke(new Action(() => CreateRenderableSeries(dataSeries)));
            });
        }
Esempio n. 25
0
        public EEGChannelViewModel(int size, Color color)
        {
            _size  = size;
            Stroke = color;

            // Add an empty First In First Out series. When the data reaches capacity (int size) then old samples
            // will be pushed out of the series and new appended to the end. This gives the appearance of
            // a scrolling chart window
            ChannelDataSeries = new XyDataSeries <double, double>()
            {
                FifoCapacity = _size
            };

            // Pre-fill with NaN up to size. This stops the stretching effect when Fifo series are filled with AutoRange
            for (int i = 0; i < _size; i++)
            {
                ChannelDataSeries.Append(i, double.NaN);
            }
        }
Esempio n. 26
0
        private void OnTick(object sender, ElapsedEventArgs e)
        {
            lock (_timer)
            {
                var y1 = 3.0 * Math.Sin(2 * Math.PI * 1.4 * _t) + _random.NextDouble() * 0.5;
                var y2 = 2.0 * Math.Cos(2 * Math.PI * 0.8 * _t) + _random.NextDouble() * 0.5;
                var y3 = 1.0 * Math.Sin(2 * Math.PI * 2.2 * _t) + _random.NextDouble() * 0.5;

                _ds1.Append(_t, y1);
                _ds2.Append(_t, y2);
                _ds3.Append(_t, y3);

                _t += OneOverTimeInteval;
                if (_t > VisibleRangeMax)
                {
                    _xVisibleRange.SetMinMax(_xVisibleRange.Min + OneOverTimeInteval, _xVisibleRange.Max + OneOverTimeInteval);
                }
            }
        }
Esempio n. 27
0
            public RsiPaneModel(PriceSeries prices) : base(RSI, "%.1f", false)
            {
                var rsiSeries = new XyDataSeries <DateTime, double> {
                    SeriesName = "RSI"
                };
                var xData = prices.TimeData;
                var yData = prices.Rsi(14);

                rsiSeries.Append(xData, yData);
                AddRenderableSeries(new SCIFastLineRenderableSeries {
                    DataSeries = rsiSeries, YAxisId = RSI, StrokeStyle = new SCISolidPenStyle(0xFFC6E6FF, 1f)
                });

                Annotations.Add(new SCIAxisMarkerAnnotation
                {
                    Position = rsiSeries.YValues.ValueAt(rsiSeries.Count - 1).ToComparable(),
                    YAxisId  = RSI
                });
            }
Esempio n. 28
0
        public XyDataSeries <double, double> GetRobotLidarProcessedPoints()
        {
            var dataSeries = new XyDataSeries <double, double>();

            if (lidarMap == null)
            {
                return(dataSeries);
            }

            var listX = lidarProcessedMap.Select(e => e.X);
            var listY = lidarProcessedMap.Select(e => e.Y);

            if (listX.Count() == listY.Count())
            {
                dataSeries.AcceptsUnsortedData = true;
                dataSeries.Append(listX, listY);
            }
            return(dataSeries);
        }
Esempio n. 29
0
        /// <summary>
        /// Every X milliseconds we create a new DataSeries and append new data to it.
        /// Then, DataSeries are re-assigned to RenderableSeries.
        /// </summary>
        private void TimerOnElapsed(object sender, EventArgs e)
        {
            var newDataSeries = new XyDataSeries <double, double>();

            // Create a noisy sinewave and cache
            // All this code is about the generation of data to create a nice randomized sinewave with
            // varying phase and amplitude
            var          randomAmplitude = Constrain(_lastAmplitude + ((_random.NextDouble()) - 0.50) / 2, -2.0, 2.0);
            const double phase           = 0.0;
            var          noisySinewave   = DataManager.Instance.GetNoisySinewave(randomAmplitude, phase, 1000, 0.25);

            _lastAmplitude = randomAmplitude;

            // Append to a new dataseries
            newDataSeries.Append(noisySinewave.XData, noisySinewave.YData);


            lineSeries.DataSeries = newDataSeries;
        }
        private void InitializeRenderableSeries()
        {
            var renderableSeries = new  LineRenderableSeriesViewModel
            {
                Stroke          = Colors.Blue,
                StrokeThickness = 2,
                PointMarker     = new EllipsePointMarker()
            };

            var dataSeries = new XyDataSeries <double>();

            for (int i = 0; i < 11; ++i)
            {
                dataSeries.Append(i, i - 3);
            }
            renderableSeries.DataSeries = dataSeries;

            RenderableSeries.Add(renderableSeries);
        }
Esempio n. 31
0
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);

            if (_timer == null)
            {
                _timer = NSTimer.CreateRepeatingScheduledTimer(0.01, (timer) =>
                {
                    _i++;

                    _lineDataSeries.Append(_i, Math.Sin(_i * 0.1 + _phase));
                    _scatterDataSeries.Append(_i, Math.Cos(_i * 0.1 + _phase));

                    _phase += 0.01;

                    _surface.ZoomExtents();
                });
            }
        }
Esempio n. 32
0
        private static ChartSeriesViewModel GenerateSeries(DateTime startDateTime, double koeff, string seriesName)
        {
            var dataSeries = new XyDataSeries <DateTime, double> {
                SeriesName = seriesName
            };
            var dt2 = startDateTime;

            for (int i = 0; i < 10000; i++)
            {
                dataSeries.Append(dt2, Math.Sin(2 * Math.PI * i / 1000 + koeff));
                dt2 += TimeSpan.FromMilliseconds(20);
            }

            var series = new FastLineRenderableSeries {
                DataSeries = dataSeries
            };

            return(new Abt.Controls.SciChart.ChartSeriesViewModel(dataSeries, series));
        }
        protected override void InitExample()
        {
            using (Surface.SuspendUpdates())
            {
                var dampedSinewave = DataManager.Instance.GetDampedSinewave(1.0, 0.02, 150, 5);

                var dataSeries = new XyDataSeries <double, double>();
                dataSeries.Append(dampedSinewave.XData, dampedSinewave.YData);

                var xAxis = new NumericAxis(Activity)
                {
                    GrowBy = new DoubleRange(0.1, 0.1)
                };
                var yAxis = new NumericAxis(Activity)
                {
                    GrowBy = new DoubleRange(0.1, 0.1)
                };

                var renderableSeries = new XyScatterRenderableSeries
                {
                    DataSeries  = dataSeries,
                    PointMarker = new EllipsePointMarker
                    {
                        StrokeStyle = new PenStyle.Builder(Activity).WithColor(Color.Argb(255, 176, 196, 222)).WithThickness(2, ComplexUnitType.Dip).Build(),
                        FillStyle   = new SolidBrushStyle(Color.Argb(255, 70, 130, 180)),
                        Width       = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 15, Activity.Resources.DisplayMetrics),
                        Height      = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 15, Activity.Resources.DisplayMetrics)
                    }
                };

                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yAxis);
                Surface.RenderableSeries.Add(renderableSeries);

                Surface.ChartModifiers = new ChartModifierCollection()
                {
                    new ZoomPanModifier(),
                    new PinchZoomModifier(),
                    new ZoomExtentsModifier(),
                };
            }
        }
        public SeriesBindingViewModel()
        {
            var data = DataManager.Instance.GetSinewave(1.0, 0.5, PointsCount * 10, 5);

            var lineDataSeries = new XyDataSeries <double, double>();

            lineDataSeries.Append(data.XData.Select(d => d * 5), data.YData);

            IEnumerable <BoxPoint> boxData = GetBoxPlotData().ToArray();

            var boxDataSeries = new BoxPlotDataSeries <double, double>();

            boxDataSeries.Append(boxData.Select(x => x.XValue),
                                 boxData.Select(x => x.Median),
                                 boxData.Select(x => x.Minimum),
                                 boxData.Select(x => x.LowerQuartile),
                                 boxData.Select(x => x.UpperQuartile),
                                 boxData.Select(x => x.Maximum));


            EllipsePointMarker epm = new EllipsePointMarker
            {
                Width           = 9,
                Height          = 9,
                Fill            = Colors.Transparent,
                Stroke          = Colors.White,
                StrokeThickness = 2
            };

            RenderableSeriesViewModels = new ObservableCollection <IRenderableSeriesViewModel>()
            {
                new LineRenderableSeriesViewModel {
                    DataSeries = lineDataSeries, StyleKey = "LineSeriesStyle"
                },
                new XyScatterRenderableSeriesViewModel {
                    DataSeries = lineDataSeries, PointMarker = epm
                },
                new BoxPlotRenderableSeriesViewModel {
                    DataSeries = boxDataSeries
                }
            };
        }
		/// <summary>
		/// To analyze.
		/// </summary>
		protected override void OnAnalyze()
		{
			var chart = Chart;
			var grid = Grid;

			var chartSeries = new XyDataSeries<double, double>();
			ThreadSafeObservableCollection<GridRow> gridSeries = null;

			chart.GuiSync(() =>
			{
				// clear prev values
				chart.RenderableSeries.Clear();
				grid.Columns.Clear();

				chart.RenderableSeries.Add(new FastColumnRenderableSeries
				{
					ResamplingMode = ResamplingMode.None,
					DataPointWidth = 1,
					SeriesColor = Colors.Chocolate,
					DataSeries = chartSeries
				});

				chart.XAxis = new NumericAxis { AxisTitle = LocalizedStrings.Price };
				chart.YAxis = new NumericAxis { AxisTitle = LocalizedStrings.Volume, GrowBy = new DoubleRange(0, 0.1) };

				grid.AddTextColumn("Price", LocalizedStrings.Price).Width = 150;
				var volumeColumn = grid.AddTextColumn("Volume", LocalizedStrings.Volume);
				volumeColumn.Width = 100;

				var gridSource = new ObservableCollectionEx<GridRow>();
				grid.ItemsSource = gridSource;
				gridSeries = new ThreadSafeObservableCollection<GridRow>(gridSource);

				grid.SetSort(volumeColumn, ListSortDirection.Descending);
			});

			// get candle storage
			var storage = StorateRegistry.GetCandleStorage(typeof(TimeFrameCandle), Security, TimeFrame, format: StorageFormat);

			// get available dates for the specified period
			var dates = storage.GetDates(From, To).ToArray();

			var rows = new Dictionary<decimal, GridRow>();

			foreach (var loadDate in dates)
			{
				// check if stopped
				if (ProcessState != ProcessStates.Started)
					break;

				// load candles
				var candles = storage.Load(loadDate);

				// groupping candles by candle's middle price
				var groupedCandles = candles.GroupBy(c => c.LowPrice + c.GetLength() / 2);

				foreach (var group in groupedCandles.OrderBy(g => g.Key))
				{
					// check if stopped
					if (ProcessState != ProcessStates.Started)
						break;

					var price = group.Key;

					// calc total volume for the specified time frame
					var sumVol = group.Sum(c => c.TotalVolume);

					var row = rows.TryGetValue(price);
					if (row == null)
					{
						// new price level
						rows.Add(price, row = new GridRow { Price = price, Volume = sumVol });

						// draw on chart
						chartSeries.Append((double)price, (double)sumVol);

						// draw on table
						gridSeries.Add(row);
					}
					else
					{
						// update existing price level
						row.Volume += sumVol;

						// update chart
						chartSeries.Update((double)price, (double)row.Volume);
					}
				}

				chart.GuiAsync(() =>
				{
					// update grid sorting
					grid.RefreshSort();

					// scale chart
					chart.ZoomExtents();
				});
			}

			// notify the script stopped
			Stop();
		}
Esempio n. 36
0
        public void AddLithologyObject(LithologyInfo lithology, ChartToShow chartToShow = null, IEnumerable<Chart> charts = null)
        {
            if (chartToShow == null)
                chartToShow = IoC.Kernel.Get<IGlobalDataModel>().MainViewModel.Charts.SingleOrDefault(u => u.ChartObject.ID == lithology.RefChart);

            if (chartToShow == null) return;

            var trackToShowObject = chartToShow.Tracks.SingleOrDefault(u => u.TrackObject.ID == lithology.RefTrack);
            if (trackToShowObject == null) return;

            if (trackToShowObject.TrackObject == null)
                throw new Exception("Track not found against track to show object while adding lithology");
            //while loading project track object would already have lithologies in it, so we dont have to re-add it in the object
            if (!trackToShowObject.TrackObject.Lithologies.Any(u => u.ID == lithology.ID))
                trackToShowObject.TrackObject.Lithologies.Add(lithology);
            FastLineRenderableSeries actualLithologySeries = null;

            //track to show object has renderable series  for lithologies
            //get the proper renderable series and add an annotation to it
            if (!trackToShowObject.CurveRenderableSeries.Any(u => (u as FastLineRenderableSeries).Name == "Lithology"))
            {
                AddLithologyAxisInChart(trackToShowObject, charts);
            }
            var normalDataSeries = new XyDataSeries<double, double>();
            var fullDataSeries = new XyDataSeries<double, double>();

            var renderableSeries = trackToShowObject.CurveRenderableSeries.Where(u => u.GetType() == typeof(FastLineRenderableSeries)).Select(v => v as FastLineRenderableSeries);
            actualLithologySeries = renderableSeries.SingleOrDefault(u => u.Name == "Lithology" && u.XAxisId == "Lithology");

            FastLineRenderableSeries normalLithologySeries = null;
            FastLineRenderableSeries fullLithologySeries = null;
            var subSeries = renderableSeries.Where(u => u.Tag != null && u.Tag.ToString() == lithology.LithologyName);
            if (!subSeries.Any())
            {
                normalLithologySeries = GetNormalLithologySeries(normalDataSeries, lithology.LithologyName);
                fullLithologySeries = GetFullLithologySeries(fullDataSeries, lithology.LithologyName, trackToShowObject);
                trackToShowObject.CurveRenderableSeries.Add(normalLithologySeries);
                trackToShowObject.CurveRenderableSeries.Add(fullLithologySeries);
                ApplyBindingToNormalLithology(actualLithologySeries, normalLithologySeries);
                ApplyBindingToFullLithology(actualLithologySeries, fullLithologySeries);

            }
            else
            {
                foreach (var series in subSeries)
                {
                    if (series.PointMarker.Width == 50)
                    {
                        normalLithologySeries = series;
                        normalDataSeries = normalLithologySeries.DataSeries as XyDataSeries<double, double>;
                    }
                    else
                    {
                        fullLithologySeries = series;
                        fullDataSeries = fullLithologySeries.DataSeries as XyDataSeries<double, double>;
                    }
                }
            }

            var startingPoint = int.Parse(lithology.InitialDepth.ToString());
            var endingPoint = int.Parse(lithology.FinalDepth.ToString());

            for (decimal i = startingPoint; i <= endingPoint; i++)
            {
                normalDataSeries.Append(9.5, double.Parse(i.ToString()));
                fullDataSeries.Append(5, double.Parse(i.ToString()));
            }
        }
Esempio n. 37
0
        public ChartViewModel()
        {
            this.SetDefaults();

            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.
                _marketDataService = new MarketDataService(new DateTime(2015, 08, 11), 1, 5000);
            }
            else
            {
                // Code runs "for real"
                _marketDataService = new MarketDataService(new DateTime(2015, 08, 11), 1, 1000);
            }

            var ds0 = new OhlcDataSeries<DateTime, double>();
            _seriesViewModels.Add(new ChartSeriesViewModel(ds0, new FastOhlcRenderableSeries() { Name = "Series1", XAxisId = "dateTimeXAxis", YAxisId = "Y1" }));
            // Append 500 historical bars to data series
            var prices = _marketDataService.GetHistoricalData(500);
            ds0.Append(
                prices.Select(x => x.DateTime),
                prices.Select(x => x.Open),
                prices.Select(x => x.High),
                prices.Select(x => x.Low),
                prices.Select(x => x.Close));

            //Create price/volume distribution
            double minPrice = prices.Select(x => x.Low).Min();
            double maxPrice = prices.Select(x => x.High).Max();

            int numBins = 5;
            double interval = (maxPrice - minPrice) / numBins;
            var bins = new Tuple<double, double>[numBins];
            double binLower = minPrice;
            for (int i = 0; i < numBins; i++)
            {
                bins[i] = new Tuple<double, double>(binLower, binLower + interval);
                binLower += interval;
            }

            var dsVolByPrice = new XyDataSeries<double, double>();
            _seriesViewModels.Add(new ChartSeriesViewModel(dsVolByPrice, new FastColumnRenderableSeries() { Name = "PriceByVol", XAxisId = "verticalXAxis", YAxisId = "Y2" }));

            var dblVolume = new List<double>();
            for (int i = 0; i < numBins; i++) dblVolume.Add(10 - i);

            dsVolByPrice.Append(bins.Select(x => x.Item1), dblVolume);

            _marketDataService.SubscribePriceUpdate(OnNewPrice);
            _xVisibleRange = new IndexRange(0, 1000);

            SelectedChartType = ChartType.FastOhlc;

            //this.DeleteCommand = new RelayCommand(DeleteCommandExecuted);
        }
		/// <summary>
		/// To analyze.
		/// </summary>
		protected override void OnAnalyze()
		{
			var chart = Chart;
			var grid = Grid;

			var chartSeries = new XyDataSeries<double, double>();
			ThreadSafeObservableCollection<GridRow> gridSeries = null;

			chart.GuiSync(() =>
			{
				// очищаем данные с предыдущего запуска скрипта
				chart.RenderableSeries.Clear();
				grid.Columns.Clear();

				chart.RenderableSeries.Add(new FastColumnRenderableSeries
				{
					ResamplingMode = ResamplingMode.None,
					DataPointWidth = 1,
					SeriesColor = Colors.Chocolate,
					DataSeries = chartSeries
				});

				chart.XAxis = new NumericAxis { AxisTitle = LocalizedStrings.Price };
				chart.YAxis = new NumericAxis { AxisTitle = LocalizedStrings.Volume, GrowBy = new DoubleRange(0, 0.1) };

				grid.AddTextColumn("Price", LocalizedStrings.Price).Width = 150;
				var volumeColumn = grid.AddTextColumn("Volume", LocalizedStrings.Volume);
				volumeColumn.Width = 100;

				var gridSource = new ObservableCollectionEx<GridRow>();
				grid.ItemsSource = gridSource;
				gridSeries = new ThreadSafeObservableCollection<GridRow>(gridSource);

				grid.SetSort(volumeColumn, ListSortDirection.Descending);
			});

			// получаем хранилище свечек
			var storage = StorateRegistry.GetCandleStorage(typeof(TimeFrameCandle), Security, TimeFrame, format: StorageFormat);

			// получаем набор доступных дат за указанный период
			var dates = storage.GetDates(From, To).ToArray();

			var rows = new Dictionary<decimal, GridRow>();

			foreach (var loadDate in dates)
			{
				// проверяем флаг остановки
				if (ProcessState != ProcessStates.Started)
					break;

				// загружаем свечки
				var candles = storage.Load(loadDate);

				// группируем свечки по цене (середина свечи)
				var groupedCandles = candles.GroupBy(c => c.LowPrice + c.GetLength() / 2);

				foreach (var group in groupedCandles.OrderBy(g => g.Key))
				{
					// проверяем флаг остановки
					if (ProcessState != ProcessStates.Started)
						break;

					var price = group.Key;

					// получаем суммарный объем в пределах ценового уровня за день
					var sumVol = group.Sum(c => c.TotalVolume);

					var row = rows.TryGetValue(price);
					if (row == null)
					{
						// пришел новый уровень - добавляем новую запись
						rows.Add(price, row = new GridRow { Price = price, Volume = sumVol });

						// выводим на график
						chartSeries.Append((double)price, (double)sumVol);

						// выводит в таблицу
						gridSeries.Add(row);
					}
					else
					{
						// увеличиваем суммарный объем
						row.Volume += sumVol;

						// обновляем график
						chartSeries.Update((double)price, (double)row.Volume);
					}
				}

				chart.GuiAsync(() =>
				{
					// обновление сортировки в таблице
					grid.RefreshSort();

					// автомасштабирование графика
					chart.ZoomExtents();
				});
			}

			// оповещаем программу об окончании выполнения скрипта
			base.Stop();
		}