コード例 #1
0
ファイル: SciChartViewModel.cs プロジェクト: AlienJust/RPD
        private IChartSeriesViewModel CreateChartSeriesViewModel(ITrendViewModel trendViewModel, bool discrete)
        {
            var dataSeries = new XyDataSeries <DateTime, double> {
                SeriesName = trendViewModel.Title
            };

            CopyPointsFromTrendToSeries(trendViewModel, dataSeries);

            IRenderableSeries series = null;

            if (discrete)
            {
                series = new FastMountainRenderableSeries {
                    DataSeries     = dataSeries,
                    Tag            = trendViewModel,
                    AntiAliasing   = false,
                    IsDigitalLine  = true,
                    ResamplingMode = ResamplingMode.None
                };
            }
            else
            {
                series = new FastLineRenderableSeries {
                    DataSeries = dataSeries,
                    Tag        = trendViewModel,
                };
            }

            ChooseSeriesColor(trendViewModel, series);
            return(new ChartSeriesViewModel(dataSeries, series));
        }
コード例 #2
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();
        }
コード例 #3
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();
        }
        private void CreateOverviewChart(out BoxAnnotation leftAreaAnnotation, out BoxAnnotation rightAreaAnnotation)
        {
            // Create an XAxis and YAxis for our chart
            var xAxis1 = new CategoryDateAxis(Activity)
            {
                AutoRange = AutoRange.Always
            };
            var yAxis1 = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1), AutoRange = AutoRange.Always
            };

            // Create the mountain chart for the overview , using the same price data but zoomed out
            var mountainSeries = new FastMountainRenderableSeries {
                DataSeries = _ohlcDataSeries
            };

            // Create some annotations to visualize the selected area on the main price chart
            leftAreaAnnotation = new BoxAnnotation(Activity)
            {
                CoordinateMode = AnnotationCoordinateMode.RelativeY,
                Y1Value        = 0,
                Y2Value        = 1,
                Background     = Activity.GetDrawableCompat(Resource.Drawable.example_gray_box_annotation_background)
            };

            rightAreaAnnotation = new BoxAnnotation(Activity)
            {
                CoordinateMode = AnnotationCoordinateMode.RelativeY,
                Y1Value        = 0,
                Y2Value        = 1,
                Background     = Activity.GetDrawableCompat(Resource.Drawable.example_gray_box_annotation_background)
            };

            // Populate the chart with Axis, RenderableSeries. The chart automatically updates when any property changes
            using (OverviewSurface.SuspendUpdates())
            {
                OverviewSurface.XAxes.Add(xAxis1);
                OverviewSurface.YAxes.Add(yAxis1);
                OverviewSurface.RenderableSeries.Add(mountainSeries);

                OverviewSurface.Annotations.Add(leftAreaAnnotation);
                OverviewSurface.Annotations.Add(rightAreaAnnotation);
            }
        }
コード例 #5
0
        protected override void InitExample()
        {
            var xAxis = new DateAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };
            var yAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1)
            };

            var priceData  = DataManager.Instance.GetPriceDataIndu();
            var dataSeries = new XyDataSeries <DateTime, double>();

            dataSeries.Append(priceData.TimeData, priceData.CloseData);

            var rSeries = new FastMountainRenderableSeries
            {
                DataSeries  = dataSeries,
                StrokeStyle = new SolidPenStyle(0xAAFFC9A8, 2f.ToDip(Activity)),
                AreaStyle   = new LinearGradientBrushStyle(0, 0, 1, 1, 0xAAFF8D42, 0x88090E11)
            };

            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();
            }
        }
コード例 #6
0
        protected override void InitExample()
        {
            var priceData = DataManager.Instance.GetPriceDataIndu();

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

            dataSeries.Append(priceData.TimeData, priceData.CloseData);

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

            var renderableSeries = new FastMountainRenderableSeries
            {
                DataSeries  = dataSeries,
                StrokeStyle = new PenStyle.Builder(Activity).WithColor(Color.Argb(0xAA, 0xFF, 0xC9, 0xA8)).WithThickness(2, ComplexUnitType.Dip).Build(),
                AreaStyle   = new LinearGradientBrushStyle(0, 0, 1, 1, Color.Argb(0xAA, 0xFF, 0x8D, 0x42), Color.Argb(0x88, 0x09, 0x0E, 0x11), TileMode.Clamp)
            };

            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(),
                };
            }
        }
コード例 #7
0
        private void SetupRenderableSeries()
        {
            var dataManager = DataManager.Instance;
            var priceBars   = dataManager.GetPriceDataIndu();

            var mountainDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Mountain Series"
            };
            var lineDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Line Series"
            };
            var columnDataSeries = new XyDataSeries <double, long> {
                SeriesName = "Column Series"
            };
            var candlestickDataSeries = new OhlcDataSeries <double, double> {
                SeriesName = "Candlestick Series"
            };

            var xValues = Enumerable.Range(0, priceBars.Count).Select(x => (double)x).ToArray();

            mountainDataSeries.Append(xValues, priceBars.LowData.Select(x => x - 1000d));
            lineDataSeries.Append(xValues, dataManager.ComputeMovingAverage(priceBars.CloseData, 50));
            columnDataSeries.Append(xValues, priceBars.VolumeData);
            candlestickDataSeries.Append(xValues, priceBars.OpenData, priceBars.HighData, priceBars.LowData, priceBars.CloseData);

            var mountainSeries = new FastMountainRenderableSeries {
                DataSeries = mountainDataSeries, YAxisId = "PrimaryAxisId"
            };
            var lineSeries = new FastLineRenderableSeries {
                DataSeries = lineDataSeries, YAxisId = "PrimaryAxisId"
            };
            var columnSeries = new FastColumnRenderableSeries {
                DataSeries = columnDataSeries, YAxisId = "SecondaryAxisId"
            };
            var candlestickSeries = new FastCandlestickRenderableSeries {
                DataSeries = candlestickDataSeries, YAxisId = "PrimaryAxisId"
            };

            var legendModifier = new LegendModifier(Activity);

            legendModifier.SetShowCheckboxes(false);

            using (Surface.SuspendUpdates())
            {
                Surface.RenderableSeries.Add(mountainSeries);
                Surface.RenderableSeries.Add(lineSeries);
                Surface.RenderableSeries.Add(columnSeries);
                Surface.RenderableSeries.Add(candlestickSeries);
                Surface.ChartModifiers = new ChartModifierCollection
                {
                    legendModifier,
                    new CursorModifier(),
                    new PinchZoomModifier(),
                    new ZoomExtentsModifier(),
                };

                new ScaleAnimatorBuilder(mountainSeries, 10500d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(candlestickSeries, 11700d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(lineSeries, 12250d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(columnSeries, 10500d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
            }
        }
コード例 #8
0
        protected override void InitExample()
        {
            var xAxis = new NumericAxis(Activity)
            {
                VisibleRange = new DoubleRange(150d, 165d)
            };
            var yAxis = new NumericAxis(Activity)
            {
                LabelProvider = new ThousandsLabelProvider(),
                GrowBy        = new DoubleRange(0, 0.1),
                AutoRange     = AutoRange.Always
            };

            var dataManager = DataManager.Instance;
            var priceBars   = dataManager.GetPriceDataIndu();

            var mountainDataSeries = new XyDataSeries <double, double>()
            {
                SeriesName = "Mountain Series"
            };
            var lineDataSeries = new XyDataSeries <double, double>()
            {
                SeriesName = "Line Series"
            };
            var columnDataSeries = new XyDataSeries <double, double>()
            {
                SeriesName = "Column Series"
            };
            var scatterDataSeries = new XyDataSeries <double, double>()
            {
                SeriesName = "Scatter Series"
            };
            var candlestickDataSeries = new OhlcDataSeries <double, double>()
            {
                SeriesName = "Candlestick Series"
            };
            var ohlcDataSeries = new OhlcDataSeries <double, double>()
            {
                SeriesName = "OHLC Series"
            };

            var xValues = Enumerable.Range(0, priceBars.Count).Select(x => (double)x).ToArray();

            mountainDataSeries.Append(xValues, priceBars.LowData.Select(x => x - 2000d));
            lineDataSeries.Append(xValues, priceBars.CloseData.Select(x => x + 1000d));
            ohlcDataSeries.Append(xValues, priceBars.OpenData, priceBars.HighData, priceBars.LowData, priceBars.CloseData);
            candlestickDataSeries.Append(xValues, priceBars.OpenData.Select(x => x - 1000d), priceBars.HighData.Select(x => x - 1000d), priceBars.LowData.Select(x => x - 1000d), priceBars.CloseData.Select(x => x - 1000d));
            columnDataSeries.Append(xValues, priceBars.CloseData.Select(x => x - 3000d));
            scatterDataSeries.Append(xValues, priceBars.OpenData.Select(x => x - 2500d));

            var annotation = new BoxAnnotation(Activity)
            {
                X1Value        = 152d,
                Y1Value        = 0d,
                X2Value        = 158d,
                Y2Value        = 1d,
                Background     = Activity.GetDrawableCompat(Resource.Drawable.example_box_annotation_background_1),
                IsEditable     = true,
                CoordinateMode = AnnotationCoordinateMode.RelativeY
            };

            annotation.SetOnAnnotationDragListener(new AnnotationDragListener());

            var mountainSeries = new FastMountainRenderableSeries
            {
                DataSeries      = mountainDataSeries,
                AreaStyle       = new SolidBrushStyle(0x9787CEEB),
                StrokeStyle     = new SolidPenStyle(Color.Magenta),
                PaletteProvider = new XyCustomPaletteProvider(Color.Red, annotation)
            };

            var lineSeries = new FastLineRenderableSeries
            {
                DataSeries  = lineDataSeries,
                StrokeStyle = new SolidPenStyle(Color.Blue),
                PointMarker = new EllipsePointMarker()
                {
                    FillStyle   = new SolidBrushStyle(Color.Red),
                    StrokeStyle = new SolidPenStyle(Color.Orange, 2f.ToDip(Activity)),
                    Width       = (int)10f.ToDip(Activity),
                    Height      = (int)10f.ToDip(Activity)
                },
                PaletteProvider = new XyCustomPaletteProvider(Color.Red, annotation)
            };

            var ohlcSeries = new FastOhlcRenderableSeries()
            {
                DataSeries      = ohlcDataSeries,
                PaletteProvider = new OhlcCustomPaletteProvider(Color.CornflowerBlue, annotation)
            };

            var candlestickSeries = new FastCandlestickRenderableSeries
            {
                DataSeries      = candlestickDataSeries,
                PaletteProvider = new OhlcCustomPaletteProvider(Color.Green, annotation)
            };

            var columnSeries = new FastColumnRenderableSeries
            {
                DataSeries      = columnDataSeries,
                StrokeStyle     = new SolidPenStyle(Color.Blue),
                FillBrushStyle  = new SolidBrushStyle(Color.Blue),
                ZeroLineY       = 6000,
                DataPointWidth  = 0.8,
                PaletteProvider = new XyCustomPaletteProvider(Color.Purple, annotation)
            };

            var scatterSeries = new XyScatterRenderableSeries()
            {
                DataSeries  = scatterDataSeries,
                PointMarker = new SquarePointMarker()
                {
                    FillStyle   = new SolidBrushStyle(Color.Red),
                    StrokeStyle = new SolidPenStyle(Color.Orange, 2f.ToDip(Activity)),
                    Width       = (int)7f.ToDip(Activity),
                    Height      = (int)7f.ToDip(Activity)
                },
                PaletteProvider = new XyCustomPaletteProvider(Color.LimeGreen, annotation)
            };


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

                Surface.RenderableSeries.Add(mountainSeries);
                Surface.RenderableSeries.Add(lineSeries);
                Surface.RenderableSeries.Add(ohlcSeries);
                Surface.RenderableSeries.Add(candlestickSeries);
                Surface.RenderableSeries.Add(columnSeries);
                Surface.RenderableSeries.Add(scatterSeries);

                Surface.ChartModifiers = new ChartModifierCollection
                {
                    new ZoomPanModifier(),
                    new PinchZoomModifier(),
                    new ZoomExtentsModifier(),
                };

                Surface.Annotations.Add(annotation);
            }
        }
        protected override void InitExample()
        {
            InitializeUIHandlers();

            var xAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1), VisibleRange = new DoubleRange(150, 180)
            };

            var yRightAxis = new NumericAxis(Activity)
            {
                GrowBy         = new DoubleRange(0.1, 0.1),
                AxisAlignment  = AxisAlignment.Right,
                AutoRange      = AutoRange.Always,
                AxisId         = "PrimaryAxisId",
                DrawMajorTicks = false,
                DrawMinorTicks = false,
                LabelProvider  = new ThousandsLabelProvider(),
            };

            var yLeftAxis = new NumericAxis(Activity)
            {
                GrowBy         = new DoubleRange(0, 3d),
                AxisAlignment  = AxisAlignment.Left,
                AutoRange      = AutoRange.Always,
                AxisId         = "SecondaryAxisId",
                DrawMajorTicks = false,
                DrawMinorTicks = false,
                LabelProvider  = new BillionsLabelProvider(),
            };

            var dataManager = DataManager.Instance;
            var priceBars   = dataManager.GetPriceDataIndu();

            var mountainDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Mountain Series"
            };
            var lineDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Line Series"
            };
            var columnDataSeries = new XyDataSeries <double, long> {
                SeriesName = "Column Series"
            };
            var candlestickDataSeries = new OhlcDataSeries <double, double> {
                SeriesName = "Candlestick Series"
            };

            var xValues = Enumerable.Range(0, priceBars.Count).Select(x => (double)x).ToArray();

            mountainDataSeries.Append(xValues, priceBars.LowData.Select(x => x - 1000d));
            lineDataSeries.Append(xValues, dataManager.ComputeMovingAverage(priceBars.CloseData, 50));
            columnDataSeries.Append(xValues, priceBars.VolumeData);
            candlestickDataSeries.Append(xValues, priceBars.OpenData, priceBars.HighData, priceBars.LowData, priceBars.CloseData);

            var mountainRenderableSeries = new FastMountainRenderableSeries {
                DataSeries = mountainDataSeries, YAxisId = "PrimaryAxisId"
            };
            var lineRenderableSeries = new FastLineRenderableSeries {
                DataSeries = lineDataSeries, YAxisId = "PrimaryAxisId"
            };
            var columnRenderableSeries = new FastColumnRenderableSeries {
                DataSeries = columnDataSeries, YAxisId = "SecondaryAxisId"
            };
            var candlestickRenderableSeries = new FastCandlestickRenderableSeries {
                DataSeries = candlestickDataSeries, YAxisId = "PrimaryAxisId"
            };

            var legendModifier = new LegendModifier(Activity);

            legendModifier.SetShowCheckboxes(false);

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yRightAxis);
                Surface.YAxes.Add(yLeftAxis);
                Surface.RenderableSeries.Add(mountainRenderableSeries);
                Surface.RenderableSeries.Add(lineRenderableSeries);
                Surface.RenderableSeries.Add(columnRenderableSeries);
                Surface.RenderableSeries.Add(candlestickRenderableSeries);
                Surface.ChartModifiers = new ChartModifierCollection
                {
                    legendModifier,
                    new CursorModifier(),
                    new ZoomExtentsModifier(),
                };
            }
        }
コード例 #10
0
        protected override void InitExample()
        {
            // Apply a theme to the chart
            // The custom theme is named SciChart_BerryBlue and is included as a number of resource files in the application resources
            // The xml resources contain all the keys for theme colors and brushes and styles to apply to the chart
            Surface.Theme = Resource.Style.SciChart_BerryBlue;

            // The rest of this example is setting up the chart with some axis, and data
            var xAxis = new NumericAxis(Activity)
            {
                GrowBy = new DoubleRange(0.1, 0.1), VisibleRange = new DoubleRange(150, 180)
            };

            var yRightAxis = new NumericAxis(Activity)
            {
                GrowBy         = new DoubleRange(0.1, 0.1),
                AxisAlignment  = AxisAlignment.Right,
                AutoRange      = AutoRange.Always,
                AxisId         = "PrimaryAxisId",
                DrawMajorTicks = false,
                DrawMinorTicks = false,
                LabelProvider  = new ThousandsLabelProvider(),
            };

            var yLeftAxis = new NumericAxis(Activity)
            {
                GrowBy         = new DoubleRange(0, 3d),
                AxisAlignment  = AxisAlignment.Left,
                AutoRange      = AutoRange.Always,
                AxisId         = "SecondaryAxisId",
                DrawMajorTicks = false,
                DrawMinorTicks = false,
                LabelProvider  = new BillionsLabelProvider(),
            };

            var dataManager = DataManager.Instance;
            var priceBars   = dataManager.GetPriceDataIndu();

            var mountainDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Mountain Series"
            };
            var lineDataSeries = new XyDataSeries <double, double> {
                SeriesName = "Line Series"
            };
            var columnDataSeries = new XyDataSeries <double, long> {
                SeriesName = "Column Series"
            };
            var candlestickDataSeries = new OhlcDataSeries <double, double> {
                SeriesName = "Candlestick Series"
            };

            var xValues = Enumerable.Range(0, priceBars.Count).Select(x => (double)x).ToArray();

            mountainDataSeries.Append(xValues, priceBars.LowData.Select(x => x - 1000d));
            lineDataSeries.Append(xValues, dataManager.ComputeMovingAverage(priceBars.CloseData, 50));
            columnDataSeries.Append(xValues, priceBars.VolumeData);
            candlestickDataSeries.Append(xValues, priceBars.OpenData, priceBars.HighData, priceBars.LowData, priceBars.CloseData);

            var mountainSeries = new FastMountainRenderableSeries {
                DataSeries = mountainDataSeries, YAxisId = "PrimaryAxisId"
            };
            var lineSeries = new FastLineRenderableSeries {
                DataSeries = lineDataSeries, YAxisId = "PrimaryAxisId"
            };
            var columnSeries = new FastColumnRenderableSeries {
                DataSeries = columnDataSeries, YAxisId = "SecondaryAxisId"
            };
            var candlestickSeries = new FastCandlestickRenderableSeries {
                DataSeries = candlestickDataSeries, YAxisId = "PrimaryAxisId"
            };

            var legendModifier = new LegendModifier(Activity);

            legendModifier.SetShowCheckboxes(false);

            using (Surface.SuspendUpdates())
            {
                Surface.XAxes.Add(xAxis);
                Surface.YAxes.Add(yRightAxis);
                Surface.YAxes.Add(yLeftAxis);
                Surface.RenderableSeries.Add(mountainSeries);
                Surface.RenderableSeries.Add(lineSeries);
                Surface.RenderableSeries.Add(columnSeries);
                Surface.RenderableSeries.Add(candlestickSeries);
                Surface.ChartModifiers = new ChartModifierCollection
                {
                    legendModifier,
                    new CursorModifier(),
                    new ZoomExtentsModifier(),
                };

                new ScaleAnimatorBuilder(mountainSeries, 10500d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(candlestickSeries, 11700d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(lineSeries, 12250d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
                new ScaleAnimatorBuilder(columnSeries, 10500d)
                {
                    Interpolator = new OvershootInterpolator(), Duration = 1000, StartDelay = 600
                }.Start();
            }
        }
コード例 #11
0
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our chart from the layout resource,
            var chart = FindViewById <SciChartSurface>(Resource.Id.Chart);

            // Init chart with axes and modifiers
            InitChart(chart);

            // Get the second chart from the layout resource.
            var secondChart = FindViewById <SciChartSurface>(Resource.Id.SecondChart);

            // Init secondChart with axes and modifiers
            InitChart(secondChart);

            const int fifoCapacity = 500;
            // Create XyDataSeries to host data for our chart
            var lineData = new XyDataSeries <double, double>()
            {
                SeriesName = "Sin(x)", FifoCapacity = new Integer(fifoCapacity)
            };
            var scatterData = new XyDataSeries <double, double>()
            {
                SeriesName = "Cos(x)", FifoCapacity = new Integer(fifoCapacity)
            };

            var x     = lineData.Count;
            var timer = new Timer(30)
            {
                AutoReset = true
            };

            // Append on each tick of timer
            timer.Elapsed += (s, e) =>
            {
                using (chart.SuspendUpdates())
                {
                    lineData.Append(x, Math.Sin(x * 0.1));
                    scatterData.Append(x, Math.Cos(x * 0.1));

                    // add label every 100 data points
                    if (x % 100 == 0)
                    {
                        // create text annotation with label
                        var label = new TextAnnotation(this)
                        {
                            Text    = "N",
                            X1Value = x,
                            Y1Value = 0,
                            HorizontalAnchorPoint = HorizontalAnchorPoint.Center,
                            VerticalAnchorPoint   = VerticalAnchorPoint.Center,
                            FontStyle             = new FontStyle(20, Color.White),
                            Background            = new ColorDrawable(Color.DarkGreen),
                            ZIndex  = 1,
                            YAxisId = x % 200 == 0 ? AxisBase.DefaultAxisId : "SecondaryAxis"
                        };

                        // add label into annotation collection
                        chart.Annotations.Add(label);

                        // if we add annotation and x > fifoCapacity
                        // then we need to remove annotation which goes out of the screen
                        if (x > fifoCapacity)
                        {
                            chart.Annotations.Remove(0);
                        }
                    }

                    // zoom series to fit viewport size into XAxis direction
                    chart.ZoomExtentsX();
                    x++;
                }
            };
            timer.Start();

            // Create line series with data appended into lineData
            var lineSeries = new FastLineRenderableSeries()
            {
                DataSeries  = lineData,
                StrokeStyle = new SolidPenStyle(Color.LightBlue, 2)
            };

            // Create scatter series with data appended into scatterData
            var scatterSeries = new XyScatterRenderableSeries()
            {
                DataSeries  = scatterData,
                PointMarker = new EllipsePointMarker()
                {
                    Width       = 10,
                    Height      = 10,
                    StrokeStyle = new SolidPenStyle(Color.Green, 2),
                    FillStyle   = new SolidBrushStyle(Color.LightBlue)
                },
                YAxisId = "SecondaryAxis"
            };

            // Add the renderable series to the RenderableSeries collection of the chart
            chart.RenderableSeries.Add(lineSeries);
            chart.RenderableSeries.Add(scatterSeries);

            // create mountain series with same data which we appended into scatter series
            var mountainSeries = new FastMountainRenderableSeries()
            {
                DataSeries  = scatterData,
                StrokeStyle = new SolidPenStyle(Color.LightSteelBlue),
                AreaStyle   = new SolidBrushStyle(Color.SteelBlue),
            };

            // Add the renderable series to the RenderableSeries collection of the second chart
            secondChart.RenderableSeries.Add(mountainSeries);

            // Share chart's XAxis VisibleRange with secondChart's XAxis VisibleRange
            secondChart.XAxes[0].VisibleRange = chart.XAxes[0].VisibleRange;
        }