ローソク足チャートに出来高を追加する

前回作成したローソク足チャートに出来高チャートを追加してみます。

出来高をローソク足と同じチャートエリアに表示しようとしたら、重なってみづらくなったので、チャートエリアを追加して表示することにしました。出来高とは売買数量のことです。

コントロールへの追加

出来高チャート表示のため、ChartAreaへChartArea2を追加します。

コントロールコレクション追加するメンバー
chart1ChartAreaChartArea2

btnView_Click メソッドの変更

出来高チャートの追加は、btnView_Clickメソッドの変更だけで済んだので、そのサンプルコードを載せておきます。

        private void btnView_Click(object sender, EventArgs e)
        {

            prices.AdjustExRights = true;    // 権利落ち修正した価格を読み込む。

            string legend1 = txtCode.Text;  // ローソク足系列
            string legend2 = "SMA";         // 移動平均系列
            int value = Convert.ToInt32(cmbPeriod.SelectedValue);
            DataTable PanStock;
            if ( value < 0)
            {
                // 期間指定
                PanStock = prices.GetDataTable(legend1, dateTPbegin.Value, dateTPend.Value);
            }
            else
            {
                // 月数指定
                DateTime endDate = dateTPend.Value;
                DateTime beginDate = endDate.AddMonths(0 - value); 
                PanStock = prices.GetDataTable(legend1, beginDate, endDate);
            }
            

            if (allCodeNames.dict.ContainsKey(legend1) == false)
            {
                // 存在しないコード
                return;
            }

            if (PanStock is null)
            {
                // オブジェクトが存在しない。
                return;
            }
            int dataCount = PanStock.Rows.Count;
            if (dataCount == 0)
            {
                // データなし
                return;
            }

            string strName = allCodeNames.dict[txtCode.Text];  // 銘柄名を取得する
            chart1.Titles.Clear();
            chart1.Titles.Add(strName);
            chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Size = dataCount;

            chart1.ChartAreas["ChartArea1"].AxisX.IsMarginVisible = true;   // マージンあり
            chart1.ChartAreas["ChartArea1"].AxisY.IsStartedFromZero = false; // 軸の最小値を0に設定しない

            chart1.Series.Clear(); //グラフ初期化(系列を全て削除)

            chart1.Series.Add(legend1); //データ系列追加
            chart1.Series.Add(legend2); //データ系列追加
            chart1.Series[legend1].ChartArea = "ChartArea1";    // ChartArea1と紐づけする

            chart1.Series[legend1].ChartType = SeriesChartType.Candlestick;
            chart1.Series[legend1].LegendText = "株価"; //凡例に表示するテキストを指定
            chart1.Series[legend1].IsXValueIndexed = true;
            chart1.Series[legend1]["PriceUpColor"] = Color.Red.Name;
            chart1.Series[legend1]["PriceDownColor"] = Color.Blue.Name;
            chart1.Series[legend1].ToolTip = "日付:#VALX\n高値:#VALY\n安値:#VALY2\n始値" +
                                            ":#VALY3\n終値:#VALY4";
            chart1.ChartAreas["ChartArea1"].AlignWithChartArea = "ChartArea2"; //
            chart1.ChartAreas["ChartArea2"].AxisX.IsMarginVisible = true;   // マージンあり
            chart1.ChartAreas["ChartArea2"].AxisY.IsStartedFromZero = false; // 軸の最小値を0に設定しない
            chart1.ChartAreas["ChartArea2"].AxisX.ScaleView.Size = dataCount;
            object date;
            double high;
            double low;
            double open;
            double end;

            // ローソク足の表示
            for (int i = 0, j = 0 ; i < dataCount; i++, j++)
            {
                date = PanStock.Rows[j]["date"];
                high = Convert.ToDouble(PanStock.Rows[j]["high_v"]);
                low = Convert.ToDouble(PanStock.Rows[j]["low_v"]);
                open = Convert.ToDouble(PanStock.Rows[j]["open_v"]);
                end = Convert.ToDouble(PanStock.Rows[j]["close_v"]);

                // データポイントの値の登録
                chart1.Series[legend1].Points.AddXY(DateTime.Parse(date.ToString()), high);
                chart1.Series[legend1].Points[i].YValues[1] = low;
                chart1.Series[legend1].Points[i].YValues[2] = open;
                chart1.Series[legend1].Points[i].YValues[3] = end;
            }
            value = chart1.Series[legend1].Points.Count;
            chart1.DataManipulator.FinancialFormula(FinancialFormula.MovingAverage, numericMA.Value.ToString(), legend1 + ":Y4", legend2);
            chart1.Series[legend2].ChartType = SeriesChartType.Line;
            chart1.Series[legend2].ChartArea = "ChartArea1";    // ChartArea1と紐づけする
            chart1.Series[legend2].Legend = chart1.Series[legend1].Legend;
            chart1.Series[legend2].IsXValueIndexed = true;
            chart1.Series[legend2].LegendText = "単純移動平均";
            chart1.Series[legend2].ToolTip = "日付:#VALX\n移動平均値:#VALY";
            // 系列間のデータ数を合わせるためにデータを補完する
            for (int i = dataCount - chart1.Series[legend2].Points.Count - 1; i >= 0; i--)
            {
                DataPoint newDataPoint = new DataPoint();
                newDataPoint.XValue = chart1.Series[legend1].Points[i].XValue;
                newDataPoint.IsEmpty = true;    // 空のデータを設定する
                chart1.Series[legend2].Points.Insert(0, newDataPoint);
            }
            string volumeLegend = "volume";
            chart1.Series.Add(volumeLegend); //出来高系列の追加
            chart1.Series[volumeLegend].ChartArea = "ChartArea2";   // 時系列データとチャートの紐づけ
            chart1.Series[volumeLegend].ChartType = SeriesChartType.Column;
            chart1.Series[volumeLegend].LegendText = "出来高"; //凡例に表示するテキストを指定
            chart1.Series[volumeLegend].ToolTip = "日付:#VALX\n出来高:#VALY";
            chart1.Series[volumeLegend].XValueType = ChartValueType.Date;
            chart1.Series[volumeLegend].IsXValueIndexed = true;
            double volume;
            // ローソク足の表示
            for (int i = 0, j = 0; i < dataCount; i++, j++)
            {
                date = PanStock.Rows[j]["date"];
                volume = Convert.ToDouble(PanStock.Rows[j]["volume_v"]);

                // データポイントの値の登録
                chart1.Series[volumeLegend].Points.AddXY(DateTime.Parse(date.ToString()), volume);
            }
        }

実行結果

タイトルとURLをコピーしました