// --------------------------------------------------------------------------------------------------------------------
//
// Copyright (c) 2014 OxyPlot contributors
//
// --------------------------------------------------------------------------------------------------------------------
namespace ExampleLibrary
{
using System;
using System.Linq;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
[Examples("CandleStickSeries"), Tags("Series")]
public static class CandleStickSeriesExamples
{
[Example("Large Data Set (wide window)")]
public static Example LargeDataSetWide()
{
var pm = new PlotModel { Title = "Large Data Set (wide window)" };
var timeSpanAxis1 = new DateTimeAxis { Position = AxisPosition.Bottom };
pm.Axes.Add(timeSpanAxis1);
var linearAxis1 = new LinearAxis { Position = AxisPosition.Left };
pm.Axes.Add(linearAxis1);
var n = 1000000;
var items = HighLowItemGenerator.MRProcess(n).ToArray();
var series = new CandleStickSeries
{
Color = OxyColors.Black,
IncreasingColor = OxyColors.DarkGreen,
DecreasingColor = OxyColors.Red,
DataFieldX = "Time",
DataFieldHigh = "H",
DataFieldLow = "L",
DataFieldOpen = "O",
DataFieldClose = "C",
TrackerFormatString =
"High: {2:0.00}\nLow: {3:0.00}\nOpen: {4:0.00}\nClose: {5:0.00}",
ItemsSource = items
};
timeSpanAxis1.Minimum = items[n - 200].X;
timeSpanAxis1.Maximum = items[n - 130].X;
linearAxis1.Minimum = items.Skip(n - 200).Take(70).Select(x => x.Low).Min();
linearAxis1.Maximum = items.Skip(n - 200).Take(70).Select(x => x.High).Max();
pm.Series.Add(series);
timeSpanAxis1.AxisChanged += (sender, e) => AdjustYExtent(series, timeSpanAxis1, linearAxis1);
var controller = new PlotController();
controller.UnbindAll();
controller.BindMouseDown(OxyMouseButton.Left, PlotCommands.PanAt);
return new Example(pm, controller);
}
[Example("Large Data Set (narrow window)")]
public static Example LargeDataSetNarrow()
{
var pm = new PlotModel { Title = "Large Data Set (narrow window)" };
var timeSpanAxis1 = new DateTimeAxis { Position = AxisPosition.Bottom };
pm.Axes.Add(timeSpanAxis1);
var linearAxis1 = new LinearAxis { Position = AxisPosition.Left };
pm.Axes.Add(linearAxis1);
var n = 1000000;
var items = HighLowItemGenerator.MRProcess(n).ToArray();
var series = new CandleStickSeries
{
Color = OxyColors.Black,
IncreasingColor = OxyColors.DarkGreen,
DecreasingColor = OxyColors.Red,
TrackerFormatString =
"High: {2:0.00}\nLow: {3:0.00}\nOpen: {4:0.00}\nClose: {5:0.00}",
ItemsSource = items
};
timeSpanAxis1.Minimum = items[0].X;
timeSpanAxis1.Maximum = items[29].X;
linearAxis1.Minimum = items.Take(30).Select(x => x.Low).Min();
linearAxis1.Maximum = items.Take(30).Select(x => x.High).Max();
pm.Series.Add(series);
timeSpanAxis1.AxisChanged += (sender, e) => AdjustYExtent(series, timeSpanAxis1, linearAxis1);
var controller = new PlotController();
controller.UnbindAll();
controller.BindMouseDown(OxyMouseButton.Left, PlotCommands.PanAt);
return new Example(pm, controller);
}
[Example("Small Set")]
public static Example SmallDataSet()
{
var pm = new PlotModel { Title = "Small Data Set" };
var timeSpanAxis1 = new DateTimeAxis { Position = AxisPosition.Bottom };
pm.Axes.Add(timeSpanAxis1);
var linearAxis1 = new LinearAxis { Position = AxisPosition.Left };
pm.Axes.Add(linearAxis1);
var n = 100;
var items = HighLowItemGenerator.MRProcess(n).ToArray();
var series = new CandleStickSeries
{
Color = OxyColors.Black,
IncreasingColor = OxyColors.DarkGreen,
DecreasingColor = OxyColors.Red,
DataFieldX = "X",
DataFieldHigh = "High",
DataFieldLow = "Low",
DataFieldOpen = "Open",
DataFieldClose = "Close",
TrackerFormatString =
"High: {2:0.00}\nLow: {3:0.00}\nOpen: {4:0.00}\nClose: {5:0.00}",
ItemsSource = items
};
pm.Series.Add(series);
timeSpanAxis1.AxisChanged += (sender, e) => AdjustYExtent(series, timeSpanAxis1, linearAxis1);
var controller = new PlotController();
controller.UnbindAll();
controller.BindMouseDown(OxyMouseButton.Left, PlotCommands.PanAt);
return new Example(pm, controller);
}
[Example("Simple CandleStickSeries example")]
public static PlotModel SimpleExample()
{
var startTimeValue = DateTimeAxis.ToDouble(new DateTime(2016, 1, 1));
var pm = new PlotModel { Title = "Simple CandleStickSeries example" };
pm.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum = startTimeValue - 7, Maximum = startTimeValue + 7 });
pm.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var series = new CandleStickSeries();
series.Items.Add(new HighLowItem(startTimeValue, 100, 80, 92, 94));
series.Items.Add(new HighLowItem(startTimeValue + 1, 102, 77, 94, 93));
series.Items.Add(new HighLowItem(startTimeValue + 2, 99, 85, 93, 93));
pm.Series.Add(series);
return pm;
}
///
/// Adjusts the Y extent.
///
/// Series.
/// Xaxis.
/// Yaxis.
private static void AdjustYExtent(CandleStickSeries series, DateTimeAxis xaxis, LinearAxis yaxis)
{
var xmin = xaxis.ActualMinimum;
var xmax = xaxis.ActualMaximum;
var istart = series.FindByX(xmin);
var iend = series.FindByX(xmax, istart);
var ymin = double.MaxValue;
var ymax = double.MinValue;
for (int i = istart; i <= iend; i++)
{
var bar = series.Items[i];
ymin = Math.Min(ymin, bar.Low);
ymax = Math.Max(ymax, bar.High);
}
var extent = ymax - ymin;
var margin = extent * 0.10;
yaxis.Zoom(ymin - margin, ymax + margin);
}
}
}