본문 바로가기
Programming/WindowsForm

C# WindowsForm 같은 Chart 같은 Area에 여러 Series를 다른 길이로 쓸 때 문제 해결

by subutie 2021. 2. 17.
728x90

주식 차트인 candle type series 를 기본으로 하고 그위에 여러 지표를 표시 하기 위해

Series를 여러개 넣어 사용 하고 있었습니다.

그런데 candle type series는 Full range로 데이터를 입력 하고

다른 series는 필요 값만 Points.AddXY() 합수를 이용해 입력을 하게 되면

자꾸 ArixX의 Lable이 사라지게 됐습니다.

 

캔들과 라인과 포인트 type의 series를 동시에 그릴때 하단 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());
                }
            }

 

 

결국 하루를 몽땅 검색에만 쏟아 해결을 했고

알고 나면 별거 아니지만 모를때는 절망하는 케이스를 또 한번 겪게 됐습니다.

이제 ArixX Label이 사라지지 않고 나오는 차트

 

(판매 기준 가격이 표시 안되는 것은 날짜가 지나 주식의 추천 상태가 변경되어서 그렇습니다.)

댓글