Pre loader

iOS & macOS Volume Profile Stock Chart

iOS & macOS charts - Examples

Please note! These examples are new to SciChart iOS v4 release! SciChart’s OpenGL ES and Metal iOS and Metal macOS Chart library ships with hundred of Objective-C and Swift iOS & macOS Chart Examples which you can browse, play with and view the source-code. All of this is possible with the new and improved SciChart iOS Examples Suite and demo application for Mac, which ships as part of the SciChart SDK.

Download Examples

Volume Profile Chart shows the distribution of trading volume over a specific time period at various price levels. Instead of displaying volume as a single bar for each time period, it plots volume horizontally, alongside the price axis.

The Swift and Objective-C source code for the iOS and macOS Volume Profile Stock Chart example is included below (Scroll down!).

Did you know that we have the source code for all our example available for free on Github?

Clone the SciChart.iOS.Examples from Github.

Also the SciChart iOS and Scichart macOS Trials contain the full source for the examples (link below).

DOWNLOAD THE IOS CHART EXAMPLES

VolumeProfileStockChartFragment.swift
View source code
//******************************************************************************
// SCICHART® Copyright SciChart Ltd. 2011-2019. All rights reserved.
//
// Web: http://www.scichart.com
// Support: support@scichart.com
// Sales:   sales@scichart.com
//
// VolumeProfileStockChartFragment.swift is part of the SCICHART® Examples. Permission is hereby granted
// to modify, create derivative works, distribute and publish any part of this source
// code whether for commercial, private or personal use.
//
// The SCICHART® examples are distributed in the hope that they will be useful, but
// without any warranty. It is provided "AS IS" without warranty of any kind, either
// expressed or implied.
//******************************************************************************


class VolumeProfileStockChartFragment: SCDSingleChartViewController<SCIChartSurface> {
    
    override var associatedType: AnyClass { return SCIChartSurface.self }
    
    private let VOLUME_XAXIS = "VolumeXAxis";
    private let PRICES_XAXIS = "PricesXAxis";
    private let VOLUME_YAXIS = "VolumeYAxis";
    private let PRICES_YAXIS = "PricesYAxis";
    
    override func initExample() {
        let SCDPriceSeries = SCDDataManager.getPriceDataEurUsd()
        
        initPrice(model: SCDPriceSeries)
        initVolume(model: SCDPriceSeries)
    }
    
    private func initPrice(model: SCDPriceSeries) {
        
        let xAxis = SCICategoryDateAxis()
        xAxis.visibleRange = SCIDoubleRange()
        xAxis.growBy = SCIDoubleRange(min: 0.0, max: 0.05)
        xAxis.axisId = PRICES_XAXIS
        
        let yAxis = SCINumericAxis()
        yAxis.textFormatting = "$0.0000"
        yAxis.axisId = PRICES_YAXIS
        yAxis.autoRange = .always
        yAxis.minorsPerMajor = 4
        yAxis.maxAutoTicks = 8
        
        let growBy = 0.05
        yAxis.growBy = SCIDoubleRange(min: growBy, max: growBy)
        
        // Add the main OHLC chart
        let stockPrices = SCIOhlcDataSeries(xType: .date, yType: .double)
        stockPrices.seriesName = "EUR/USD"
        stockPrices.append(x: model.dateData, open: model.openData, high: model.highData, low: model.lowData, close: model.closeData)
        
        let candlestickSeries = SCIFastCandlestickRenderableSeries()
        candlestickSeries.dataSeries = stockPrices
        candlestickSeries.yAxisId = PRICES_YAXIS
        candlestickSeries.xAxisId = PRICES_XAXIS
        
        let xAxisDragModifier = SCIXAxisDragModifier()
        xAxisDragModifier.dragMode = .pan
        xAxisDragModifier.clipModeX = .stretchAtExtents
        
        let pinchZoomModifier = SCIPinchZoomModifier()
        pinchZoomModifier.direction = .xDirection
        
        let legendModifier = SCILegendModifier()
        legendModifier.showCheckBoxes = false
        
        var annotations = SCIAxisMarkerAnnotation()
        annotations = addAxisMarkerAnnotationWith(PRICES_YAXIS, xAxisId: PRICES_XAXIS, format: "$%.4f", value: stockPrices.yValues.value(at: stockPrices.count - 1), color: SCIColor.fromARGBColorCode(0xFF67BDAF))
        
        SCIUpdateSuspender.usingWith(surface) {
            self.surface.xAxes.add(xAxis)
            self.surface.yAxes.add(yAxis)
            self.surface.renderableSeries.add(candlestickSeries)
            self.surface.annotations.add(annotations)
            self.surface.chartModifiers.add(items: xAxisDragModifier, pinchZoomModifier, SCIZoomPanModifier(), SCIZoomExtentsModifier(), legendModifier)
        }
    }
    
    private func initVolume(model: SCDPriceSeries) {
        
        let xAxis = SCICategoryDateAxis()
        xAxis.visibleRange = SCIDoubleRange()
        xAxis.growBy = SCIDoubleRange(min: 0.0, max: 0.05)
        xAxis.isVisible = false
        xAxis.axisId = VOLUME_XAXIS
        xAxis.axisAlignment = .left
        
        let yAxis = SCINumericAxis()
        yAxis.textFormatting = "$0.0000"
        yAxis.axisId = VOLUME_YAXIS
        yAxis.isVisible = false
        yAxis.axisAlignment = .top
        yAxis.autoRange = .always
        yAxis.minorsPerMajor = 4
        yAxis.maxAutoTicks = 8
        let growBy = 0.05
        yAxis.growBy = SCIDoubleRange(min: growBy, max: growBy)
        
        let volumePrices = SCIXyDataSeries(xType: .date, yType: .long)
        volumePrices.seriesName = "Volume"
        volumePrices.append(x: model.dateData, y: model.volumeData)

        let columnSeries = SCIFastColumnRenderableSeries()
        columnSeries.dataSeries = volumePrices
        columnSeries.yAxisId = VOLUME_YAXIS
        columnSeries.xAxisId = VOLUME_XAXIS
        columnSeries.fillBrushStyle = SCISolidBrushStyle(color: 0x30FFFFFF)
        columnSeries.strokeStyle = SCISolidPenStyle(color: 0x30FFFFFF, thickness: 1)

        let xAxisDragModifier = SCIXAxisDragModifier()
        xAxisDragModifier.dragMode = .pan
        xAxisDragModifier.clipModeX = .stretchAtExtents

        let pinchZoomModifier = SCIPinchZoomModifier()
        pinchZoomModifier.direction = .xDirection

        let legendModifier = SCILegendModifier()
        legendModifier.showCheckBoxes = false

        SCIUpdateSuspender.usingWith(surface) {
            self.surface.xAxes.add(xAxis)
            self.surface.yAxes.add(yAxis)
            self.surface.renderableSeries.add(columnSeries)
            self.surface.chartModifiers.add(items: xAxisDragModifier, pinchZoomModifier, SCIZoomPanModifier(), SCIZoomExtentsModifier(), legendModifier)
        }
    }
    
    func addAxisMarkerAnnotationWith(_ yAxisId: String, xAxisId: String, format: String, value: ISCIComparable, color: SCIColor?) -> SCIAxisMarkerAnnotation {
        let axisMarkerAnnotation = SCIAxisMarkerAnnotation()
        axisMarkerAnnotation.yAxisId = yAxisId
        axisMarkerAnnotation.xAxisId = xAxisId
        axisMarkerAnnotation.set(y1: value.toDouble())
        axisMarkerAnnotation.coordinateMode = .absolute
        
        if let uiColor = color {
            axisMarkerAnnotation.backgroundBrush = SCISolidBrushStyle(color: uiColor)
        }
        
        axisMarkerAnnotation.fontStyle = SCIFontStyle(fontSize: 12, andTextColor: .white)
        axisMarkerAnnotation.formattedValue = String(format: format, value.toDouble())

        return axisMarkerAnnotation
    }
}
Back to iOS & macOS charts Examples