주식 차트인 candle type series 를 기본으로 하고 그위에 여러 지표를 표시 하기 위해
Series를 여러개 넣어 사용 하고 있었습니다.
그런데 candle type series는 Full range로 데이터를 입력 하고
다른 series는 필요 값만 Points.AddXY() 합수를 이용해 입력을 하게 되면
자꾸 ArixX의 Lable이 사라지게 됐습니다.
딱히 기능에 문제도 없고 X label을 다른 chart에서 표시도 해주고 해서 참고 개발을 하다가
이제 더 이상 눈감을 수 없는 지점이 와서 하루종일 여러 방법으로 해결하려 했는데 결국.....
해결 방법을 알게 됐습니다.
원인은 candle type series의 Xvalue를 넣 값과 이후 분석 기반으로 line type, point type seriese의 Xvalue 값의 type과 값이 맞지 않아서 였습니다.
아래와 같이 Candle type series는 table을 이용해 자동으로 bind 되도록 DataBind() 함수를 써서 Bind 했고 쉽고 간단하게 Candle type series를 그릴 수 있었지만 내부 PointData 값을 보면 x 값이 제대로 들어가 있지 않은 것을 확인 할 수 있었습니다.
CANDLE.ChartType = SeriesChartType.Candlestick;
CANDLE.XValueMember = "StockDay";
CANDLE.YValueMembers = "StockHigh,StockLow,StockOpen,StockClose";
CANDLE.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Date;
CANDLE.CustomProperties = "PriceDownColor=Blue,PriceUpColor=Red";
AREA1.AxisX.Interval = 5;
CANDLE["ShowOpenClose"] = "Both";
chart1.DataManipulator.IsStartFromFirst = true;
chart1.DataSource = curInfo.table;
chart1.DataBind();
그래서 다른 series에서 AddXY를 통해 값을 넣으면 x값이 맞지 않아 차트가 어그러지고 lable이 사라지는 것으로 원인 파악을 했습니다.
(아래 코드는 line type series 값을 입력 하는 것으로 인덱스를 값을 이용해 x 값을 넣어주는데 이 부분을 날짜 값으로 변환 해서 넣으면 차트에 제 위치에 나오지 않게 되고 인덱스 값으로 넣으면 ArixX label이 사라지게 됐었습니다. 물론 point type series도 마찬가지 였습니다.)
foreach (AnalyzeEdge each in investInfo.list_edges)
{
DataPoint origin = CANDLE.Points[each.chart_index];
LINES.Points.AddXY(each.chart_index, each.values.GetHigh());
}
결국 돌고 돌고 돌아 차트에 제대로 표시가 되는 법을 찾다
Xvalue를 모든 series에서 맞게 입력하고 arixX label만 원하는 대로 표기 할 수 있는 방법을 찾다
CustomLabels 값을 넣어 따로 표시 해줄 수 있다는 것을 알게됐고
마침낸 코드에 적용해서 오랜 숙원을 해결 했습니다.
아래에 코드를 보면 기존에 DataBind를 사용하지 않고
직접 AddXY를 통해 candle type series에 넣고 있으며
AxisX.Interval 간격에 맞게 CustomLabels에 표시될 label값을 입력 해주는 형태로 변경 했습니다.
(line type, point type series는 코드 변경이 필요 없습니다.)
CANDLE.ChartType = SeriesChartType.Candlestick;
CANDLE.XValueType = ChartValueType.Auto;
CANDLE.CustomProperties = "PriceDownColor=Blue,PriceUpColor=Red";
LINES.XValueType = ChartValueType.Auto;
INVEST[0].XValueType = ChartValueType.Auto;
BOLLINGER.XValueType = ChartValueType.Auto;
AREA1.AxisX.Interval = 5;
CANDLE.Points.Clear();
for (int i = 0; i < curInfo.list_StockDayInfo.Count; ++i)
{
StockDayInfo info = curInfo.list_StockDayInfo[i];
CANDLE.Points.AddXY((double)i, new object[] {info.high, info.low, info.open, info.close});
if (i % 5 == 4)
{
AREA1.AxisX.CustomLabels.Add(i - 1.5, i + 1.5, info.date.ToString());
}
}
결국 하루를 몽땅 검색에만 쏟아 해결을 했고
알고 나면 별거 아니지만 모를때는 절망하는 케이스를 또 한번 겪게 됐습니다.
(판매 기준 가격이 표시 안되는 것은 날짜가 지나 주식의 추천 상태가 변경되어서 그렇습니다.)
'Programming > WindowsForm' 카테고리의 다른 글
Magnetic Window (sticky window) (2) | 2021.02.17 |
---|---|
프로그래머가 만든 Thread에서 WindowsForm Control 접근시 문제 (0) | 2021.02.17 |
댓글