注目の記事 PICK UP!

  • C#

C# チャートデータからローソク足を描画する方法

Form上にローソク足を表示するグラフ描画のサンプルプログラムです。チャートデータは下記のCSVを使っています。

C#ローソク足

Formにローソク足を描画

こちらはForm上にローソク足のチャートを描画するサンプルプログラムです。Formの初期起動時にグラフ描画をするようになっています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace Study
{
    public partial class Top : Form
    {
        public Top()
        {
            InitializeComponent();
            Init();
        }

        /// <summary>
        /// チャートデータを取得してローソク足を表示します
        /// </summary>
        private void Init()
        {
            Chart Candle = new Chart();
            Candle.Size = this.ClientSize;
            this.Controls.Add(Candle);

            // トレンドラインエリアの領域
            ChartArea area = new ChartArea("AREA");
            Candle.ChartAreas.Add(area);

            // グラフ種類
            Series series = new Series("CANDLE");
            series.ChartType = SeriesChartType.Candlestick;
            Candle.Series.Add(series);

            // チャートデータ取り込み
            DataTable dt = this.CsvRead();

            // グラフY軸の最大値と最小値
            double[] Yval = this.MaxMin(dt);

            // タイトル
            Candle.Titles.Add("EUR/USD");

            // タイトルカラー
            Candle.ChartAreas[0].AxisY.TitleForeColor = Color.White;

            // ローソク足の間隔
            Candle.Series["CANDLE"]["PointWidth"] = "0.6";

            // ローソク足の色
            Candle.Series["CANDLE"]["PriceUpColor"] = "Red";
            Candle.Series["CANDLE"]["PriceDownColor"] = "DarkBlue";

            // 凡例非表示
            Candle.Series[0].IsVisibleInLegend = false;

            // チャートカラーの設定
            Candle.BackColor = Color.FloralWhite;
            Candle.ChartAreas[0].BackColor = Color.Transparent;

            // グリッド線
            Candle.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.DarkBlue;
            Candle.ChartAreas[0].AxisX.LabelStyle.ForeColor = Color.DarkBlue;
            Candle.ChartAreas[0].AxisY.LabelAutoFitMaxFontSize = 8;
            Candle.BorderColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisY.MajorGrid.Enabled = true;
            Candle.ChartAreas[0].AxisY.MajorGrid.LineColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisX.MajorGrid.LineColor = ColorTranslator.FromHtml("#008242");
            Candle.ChartAreas[0].AxisY.MinorGrid.Enabled = false;
            Candle.ChartAreas[0].AxisY.MinorGrid.LineColor = ColorTranslator.FromHtml("#008242");

            // Y軸の範囲
            // クロス円
            //Candle.ChartAreas[0].AxisY.Maximum = Yval[0];
            //Candle.ChartAreas[0].AxisY.Minimum = Yval[1];
            //Candle.ChartAreas[0].AxisY.LabelStyle.Format = "000.000";
            // ドルストレート
            Candle.ChartAreas[0].AxisY.Maximum = Yval[0];
            Candle.ChartAreas[0].AxisY.Minimum = Yval[1];
            Candle.ChartAreas[0].AxisY.LabelStyle.Format = "0.00000";

            // 4本値の設定
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                // 高値
                Candle.Series["CANDLE"].Points.AddXY("", float.Parse(dt.Rows[i]["高値"].ToString()));
                // 安値
                Candle.Series["CANDLE"].Points[i].YValues[1] = float.Parse(dt.Rows[i]["安値"].ToString());
                // 始値
                Candle.Series["CANDLE"].Points[i].YValues[2] = float.Parse(dt.Rows[i]["始値"].ToString());
                // 終値
                Candle.Series["CANDLE"].Points[i].YValues[3] = float.Parse(dt.Rows[i]["終値"].ToString());
            }
        }
    }
}

為替データのCSVを読み込む

CsvRead();というメソッドは、下記のクラスファイルを利用しています。
CSVファイルをdatatableに読み込む方法

Y軸の最大値と最小値を設定

MaxMin(dt);というメソッドでは、読み込んだ為替データのCSVを使って、グラフY軸の最大値と最小値を設定するために為替データの高値と安値を拾ってきます。

/// <summary>
/// 最大値と最小値を取得します
/// グラフのY軸に設定します
/// </summary>
public double[] MaxMin(DataTable dt)
{
    DataRow[] data = null;
    double high = 0;
    double min = 0;

    data = dt.Select("高値 = MAX(高値)");
    foreach (DataRow datas in data)
    {
        high = double.Parse(datas["高値"].ToString());
    }

    data = dt.Select("安値 = MIN(安値)");
    foreach (DataRow datas in data)
    {
        min = double.Parse(datas["安値"].ToString());
    }            
    return new[] {high,min};
}

関連記事

  1. C# LINQでDataTableから高速に特定行を検索する方法

  2. C# Webサーバーからhttp通信でファイルを取得する方法

  3. C# DataTableからComputeを使って合計値や平均値を算出する

  4. C#でHTMLのtableタグを生成する方法

  5. C# LINQを使って重複行をGroup byする方法

  6. C# JSONファイルからLINQを使って集計する方法 – 合計値

  7. C# DataTableのデータをゼロパディング(ゼロ埋め)する

  8. C# LINQを使ってDataTableを並び替える

  9. Android Studio libsフォルダがない?libsフォルダの表示方法

PAGE TOP