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)); }
// 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(); }
// 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); } }
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(); } }
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(), }; } }
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(); } }
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(), }; } }
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(); } }
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; }