Chartコントロールでローソク足を表示させる
ただでさえ情報が少ない、C#のChartコントロールに関する情報。
ましてやChartコントロールを使ってローソク足を表示するための情報は皆無に等しいのが現状です。
そこで、断片的な情報を集めて試行錯誤した結果をまとめます。
本記事のコードは以下の環境で確認しています
- Microsoft Visual Studio Community 2017
- .NET Framework 4.7
私がつまづいたのは以下の二点です
・X軸を日付にするには?DateTimeを代入したいのにdouble型でしか値を指定できない
また、X軸の最大値最小値はどうやって設定すればいいの?
→OLEオートメーション日付に変換する必要がある
・四本値(高値、安値、始値、終値)のDataPointインスタンスの作成方法?
→System.Windows.Forms.DataVisualization.Charting.DataPoint
(double xValue, double[] yValues)メソッドを用いる
横軸を日付にするには?
ChartArea.AxisX.IntervalTypeをDateTimeIntervalType.Daysにする。
また、横軸の最大値最小値を設定する場合はDateTime.ToOADate()メソッドで
OLEオートメーション日付に変換
// グラフ領域の設定
ChartArea area = new ChartArea();
// 横軸を日付に設定
area.AxisX.IntervalType = DateTimeIntervalType.Days;
// 横軸の最大・最小値を設定 DateTimeをToOADateメソッドを用いてdoubleに変換
area.AxisX.Minimum = new DateTime(2010, 1, 1).ToOADate();
area.AxisX.Maximum = new DateTime(2010, 1, 10).ToOADate();
4本値データのDataPointインスタンスの作成方法
// 日付を格納する
DateTime date = new DateTime(2010, 1, 4);
// High Low Open Closeの順番で配列を作成
double[] values = new double[4] { 1010, 990, 1000, 1005 };
// 日付、四本値の配列からDataPointのインスタンスを作成
DataPoint dp = new DataPoint(date.ToOADate(), values);
サンプルコード
以上の事を踏まえたうえでChartコントロールにローソク足を表示させるソースコード(全体)
フォームアプリケーションにChartントロール(chart1)を追加した後、以下のコードをコピペして実行してみてください。
Form1.cs
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// グラフ領域の設定
ChartArea area = new ChartArea();
// 横軸(日付軸)の設定
// DateTimeのままでは使えないので
//ToOADateメソッドでOLEオートメーション日付に変換
area.AxisX.Title = "日付";
area.AxisX.IntervalType = DateTimeIntervalType.Days;
area.AxisX.Minimum = new DateTime(2010, 1, 1).ToOADate();
area.AxisX.Maximum = new DateTime(2010, 1, 10).ToOADate();
// 縦軸(株価軸)の設定
area.AxisY.Title = "株価";
area.AxisY.Minimum = 950;
area.AxisY.Maximum = 1050;
// 既定のグラフ領域の設定をクリアした後、設定する
chart1.ChartAreas.Clear();
chart1.ChartAreas.Add(area);
// データ系列を作成する
Series series = new Series();
series.ChartType = SeriesChartType.Candlestick;
series.Color = Color.Red;
for (int i = 0; i < 5; i++)
{
// 日付(2010/1/4から5本)
DateTime date = new DateTime(2010, 1, 4).AddDays(i);
// High Low Open Closeの順番で配列を作成
double[] values = new double[4]
{
1010 + i, 990 + i, 1000 + i, 1005 + i
};
// 日付、四本値の配列からDataPointのインスタンスを作成
DataPoint dp = new DataPoint(date.ToOADate(), values);
series.Points.Add(dp);
}
chart1.Series.Clear();
chart1.Series.Add(series);
}
}