前回作成したローソク足チャートに出来高チャートを追加してみます。
出来高をローソク足と同じチャートエリアに表示しようとしたら、重なってみづらくなったので、チャートエリアを追加して表示することにしました。出来高とは売買数量のことです。
コントロールへの追加
出来高チャート表示のため、ChartAreaへChartArea2を追加します。
| コントロール | コレクション | 追加するメンバー |
| chart1 | ChartArea | ChartArea2 |
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);
}
}実行結果





