2016年10月18日火曜日

.netでローソク足と出来高表示

.netでローソク足と出来高を表示する
コンパイルは
csc ChartTest2.cs /r:System.Windows.Forms.DataVisualization.dll

using System.Runtime.InteropServices;
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成(出来高)

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
結果はこんな感じ。
ただ、このままだと、上と下でY軸の線が合わずにみづらいので、
chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
を追加して、軸合わせする。
(上下の軸合わせしたいだけなのに、探すのに手間取った。
 Chartクラスは、凄い便利だと思うけど、使い方に癖があって
 慣れないと使いづらい。)
で、直した版はこんな感じ。


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public class ChartTest:Form
{
  private Chart chart;

  public ChartTest()
  {
    this.SuspendLayout();

    Size = new Size(500,500);
    SetChart();
 
    this.ResumeLayout();
  }

  //チャート画面の作成
  private void SetChart()
  {
    //チャート画面の作成
    chart = new Chart();
    //1つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart1"));
    chart.ChartAreas["chart1"].AxisX.Interval = 5;

    //2つ目のチャートエリア
    chart.ChartAreas.Add(new ChartArea("chart2"));
    //チャートエリアサイズ
    chart.Size = new Size(400,400);
 
    Controls.Add(chart);

    //チャート1の描画
    chart.Series.Add(new Series());
    Series series;
    series = chart.Series[0];
    series.ChartArea = "chart1";
    series.ChartType = SeriesChartType.Candlestick;

    //データの作成(ローソク足)
    int ii;
    for(ii = 1; ii < 10 ; ii++)
      {
        double[] d = new double[4];
        d[0] = ii * 10;  // 高値
        d[1] = ii *  3;     // 安値
        d[2] = ii *  5;     // 始値
        d[3] = ii *  8;  // 終値
        DataPoint dp = new DataPoint(ii,d);
        series.Points.Add(dp);
      }
    
    //チャート2の描画(出来高)

    chart.Series.Add(new Series());
    Series series2;
    series2 = chart.Series[1];
    series2.ChartArea = "chart2";
    series2.ChartType = SeriesChartType.StackedColumn;

    //データの作成

    for(ii = 1; ii < 10 ; ii++)
      {
        DataPoint dp = new DataPoint(ii,ii*10000);
        series2.Points.Add(dp);
      }

    /**** 上のチャートと下のチャートのY軸位置調整 ******/
    chart.ChartAreas["chart1"].AlignWithChartArea = "chart2";
    /***************************************************/
  }

  public static int Main(string[] args)
  {
    ChartTest ct = new ChartTest();
    ct.ShowDialog();
    return 0;
  }

}
実行結果は、↓
軸があって見易くなった。