SciChart® the market leader in Fast WPF Charts, WPF 3D Charts, and now iOS Charting & Android Chart Components

Welcome to the SciChart Community Forums!

Please use the forums below to ask questions about SciChart. Take a moment to read our Question asking guidelines on how to ask a good question and our support policy

We also have a tag=SciChart on where you can earn rep for your questions!

0 votes

I am creating iOS aplication which displays charts based on stocks data.
I want to create box annotations to show when market is open or closed.
I am using CategoryDateTimeAxis to display data but when i add AnnotationCollection with BoxAnnotations to Surface i can not see the annotations.

This is my code for creating box Annotation:

    let pre = SCIBoxAnnotation()
    pre.coordinateMode = .relative
    pre.x1 = SCIGeneric(setDate(date, 4, 0, 0)!)
    pre.x2 = SCIGeneric(setDate(date, 9, 30, 0)!)
    pre.y1 = SCIGeneric(max )
    pre.y2 = SCIGeneric(0)
    pre.isEditable = false = SCISolidBrushStyle(color: #colorLiteral(red: 0.01680417731, green: 0.1983509958, blue: 1, alpha: 0.13)) = SCISolidPenStyle(color: .clear, withThickness: 0)
  • Marcin C asked 5 months ago
  • last active 3 months ago
3 votes
0 answers

Hi there!
I successfully build trader chart from nice example “2D Charts -> Create Stock Charts -> Using SciStockChart”.
Then I had to draw line on the chart with candles, but the problem was, that the line didn’t have data on some dates (there is data for lots of candles, but for the red line there is only 4 points: A,B,C,D), and result i want in shown here (solved):
Result i want image

XAxis: CategoryDateTimeAxis (Dates)
YAxis: NumericAxis (Prices)

Candles: FastCandlestickRenderableSeries (OhlcDataSeries<DateTime, double>)
Red Line: FastLineRenderableSeries (XyDataSeries<DateTime, double>)

CategoryDateTimeAxis type ignores the XAxis values for computation of x-coordinate, and choosing only the index of the value instead. CategoryDateTimeAxis vs DateTimeAxis. I have N-number of candles and only 4 values for red line. How to receive line with no gaps, with points on their places (dates on X-axis) ? I can’t use simple DateTimeAxis, because candles don’t draws.

1) Use double.NaN for each date (x-axis value) if no data for the red-line on date given.
2) In FastLineRenderableSeries set DrawNaNAs = LineDrawMode.ClosedLines (if don’t use this flag, you will receive something like this: WPF Chart Gaps (Nulls) in Series

Thanks a million to Julia Skorobogata from SciChart!

0 votes


I am trying to get the index of a specific date in CategoryDateTime X axis. I was trying to use this approach:

int idxOfMaxAvgScoreDate = [[self.dataSeriesAvg xValues] indexOf:SCIGeneric(dateOfMaxAvgScore) IsSorted:YES SearchMode:SCIArraySearchMode_Exact];

but it was returning -1. My guess is that comparison operator for the DateTime type is “too precise”, so some kind of range check needs to be done, similarly to common practice when comparing two floats:

if (abs(float1-float2) < epsilon)

instead of

if (float1 == float2)

I tried using SCIArraySearchMode_Nearest, but without success – most of the times I get a column right after the one I need (desiredIndex+1).

While trying to implement index lookup myself by iterating through the dataSeries.xValues I noticed that DateTime type decoder is not there for individual elements of SCIArrayControllerProtocol. Autocompletion for line below

[[self.dataSeries xValues] valueAt:i].

offers all typed of data decoding (int16, int32, char…) except dateTime. Is this the way it is supposed to be?

I tried solving it this way:

SCIGenericDate([[self.dataSeries xValues] valueAt:i])

but the date I am getting is always 01-01-1970. This indicates that entries in the X axis are not DateTime elements, which is not true, since this is my X axis:

id<SCIAxis2D> xAxis = [[SCICategoryDateTimeAxis alloc] init];

Any help, or even just thoughts and comments, would be highly appreciated.


0 votes

Hello again! 🙂

This time I am trying to draw marker for a maximum numeric data value in chart with CategoryDateTime X axis.

I have my X axis defined like this:

id<SCIAxis2D> xAxis = [[SCICategoryDateTimeAxis alloc] init];

and I am trying to draw a marker in draw() method of a custom modifier using this code:

 id<SCIRenderPassData> data = [_rSeries currentRenderPassData];
 id<SCICoordinateCalculator> xCalc = [data xCoordinateCalculator];
 id<SCICoordinateCalculator> yCalc = [data yCoordinateCalculator];
 NSLog(@"Is category calc: %d", [xCalc isCategoryAxisCalculator]);
 double xCoord = [xCalc getCoordinateFromDate:_xValue];
 double yCoord = [yCalc getCoordinateFrom:_yValue];
 [_marker drawToContext:context AtX:xCoord Y:yCoord];

My _xValue is computed and set from outside and is for sure is a valid date on X axis for which I need to draw the marker on.

My problem is that:

  1. xCoord is always 0.
  2. NSLog line prints 0 to debug console, meaning that xCalc is not CategoryAxisCalculator. I suspect this is why xCoord is always 0.

My questions are:

  1. Am I trying to compute xCoord the right way? I need it for drawing the marker and I have a date for which I want marker to be placed on.
  2. Why [data xCoordinateCalculator] returns something that is not CategoryAxisCalculator even though my axis is a category axis? Is this expected behaviour?

Looking forward to your always useful reply. 🙂

2 votes

I am implementing a feature to load more historical data when users pan to the left side on a CategoryDateAxis.
To load more, i need to have 2 Date which is the earliest data point i have and the Date that is shown on the X-Axis

For the earliest data point, i can get via IXyDataSeries#getXMin()
But for the other Date, i’m not sure how to get it. I can listen to range changes via IAxisCore#VisibleRangeChangeListener, but the range returns Double. I cant figure out to convert it into a Date

  • abc def asked 2 years ago
  • last active 2 years ago
0 votes

Based on the example in

IAxis axis = new CategoryDateAxis(getActivity());
axis.setGrowBy(new DoubleRange(0.1d, 0.1d));
axis.setVisibleRange(new DateRange(dateMin, dateMax));

It will crash at setVisibleRange with

java.lang.UnsupportedOperationException: Expected instance of DoubleRange
at com.scichart.core.utility.Guard.instanceOf(SourceFile:45)
at com.scichart.core.utility.Guard.instanceOfAndNotNull(SourceFile:52)
at com.scichart.charting.visuals.axes.AxisCore.setVisibleRange(SourceFile:241)

What would be the proper way to set a date range?

  • abc def asked 2 years ago
  • last active 2 years ago
0 votes

I am building a real-time graph with CategoryDate X Axis and Numeric Y Axis. I found it hard to understand the Annotation API’s regarding the X and Y positions.

Looking at AnnotationsAreEasyFragment, it draw a Horizontal line of (seemingly) full width. it declares

    .withPosition(7d, 2.8d)
    .withStroke(2, ColorUtil.Orange)

i can under Y = 2.8d, but what is the X=7d for? and in the next Horizontal line which is short, it declares .withPosition(5d, 3.2d)?? X=5d and X=7d gives such a big difference.

Since i am using CategoryDateAxis, referring to InteractionWithAnnotationsFragment to draw a vertical line at a specific date/time, there is a short line vertical line on 3rd Dec with the code


Since its a date axis, i would expect it to accept a Date.class (or long in millis) instead of .withX1(20). It doesnt even make sense! How exactly do i create full height vertical line at a specific date/time?

  • abc def asked 2 years ago
  • last active 2 years ago
0 votes
0 answers


I want to change the major tick of a CategoryDateTimeAxis.
I saw “Advanced Tick Frequency Overriding”.
It’s very helpful for me.

I tried to extends CategoryTickCoordinatesProvider class but I think that shouldn’t be work.

So how should I do?
Please help me, thanks

0 votes

I’m trying to set the visible range property of a CategoryDateTimeAxis through MVVM. I’m following the general instructions detailed here for converting between pixel & data coordinates on the axis:

I have the following code in my viewmodel:

var calc = XAxis.GetCurrentCoordinateCalculator();
var coordCalc = calc as ICategoryCoordinateCalculator;

XAxis is a CategoryDateTimeAxis injected from the view. I call OnBeginRenderpass as I saw in another forum post that this will ensure that the CoordinateCalculator is initialized.

calc shows in the debugger as:

  • calc {A.} Abt.Controls.SciChart.Numerics.CoordinateCalculators.ICoordinateCalculator {A.}

The coordCalc variable ends up assigned to NULL, as the ICoordinateCalculator< double > cannot be cast to the interface.

How do I accomplish the above?

Thanks, Asher

  • ashernew asked 3 years ago
  • last active 3 years ago
0 votes

I’m creating stock OHLC Bar Charts. My users have asked me if I can create a chart such that when the trading is open and there are no trades, the X Axis behaves like a DateTimeAxis and empty space appears on the chart in the X direction between trades. However, they would like the times that trading to does not take place to not appear on the X Axis so that there is no space between the last minute of open trading for one trading session and the next minute of trading for the next session. Is such a chart possible with Sci Charts?

  • deepakb1 asked 3 years ago
  • last active 3 years ago
0 votes

I’m using the CategoryDateTimeAxis as a xaxis of one chart.

The picture below is my question, can you give some suggestions?


  • Shawn Li asked 3 years ago
  • last active 3 years ago
0 votes

If I make my own implementation of AxisLabelprovider for a CategoryDatetimeAxis I get different DateTime.Kind settings depending on the function called to format a label.
I put in the values as DateTime.Kind = DateTimeKind.Utc to the DataSeries<DateTime, double>

I have this implementation for my labelprovider:

public class CategoryAxisLabelProvider : TradeChartAxisLabelProvider

    public override string FormatLabel(IComparable dataValue)
        DateTime value = (DateTime)Convert.ChangeType(dataValue, typeof(DateTime));
        if (value.Kind != DateTimeKind.Local)
            value = value.ToLocalTime();

        string s = value.ToString("HH:mm:ss\nfff 'ms'");
        return s;

    public override string FormatCursorLabel(IComparable dataValue)
        // do something

If FormatCursorLabel is called the “dataValue” has DateTime.Kind = DateTimeKind.Utc.
If FormatLabel is called the “dataValue” has Datetime.Kind = DateTimeKind.Unspecified. (Although the value is UTC)

How to handle DateTimeKind.Unspecified? Is it Utc or does it depend on what I put into the dataseries?

  • Uwe Hafner asked 3 years ago
  • last active 3 years ago
Showing 12 results
This template supports the sidebar's widgets. Add one or use Full Width layout.