2017년 4월 28일 금요일

실시간 차트에 보조지표(이평선) 추가하기

저번에 만들어 놓은 실시간 차트에 이평선 보조 지표를 추가하도록 하겠습니다.
5분의 20이평 선을 추가 하기 위해서 전에 사용하였던  PriceEntityObject  에 사용하기 위한 해당 날짜의 이평선 값을 추가 합니다.



1.     TR 데이터를 수신할 때 이평선을 계산하고 이평선 차트를 생성
2.     실시간 데이터가 수신될 때 마다 업데이트
A.     기존 이평선 값을 업데이트 하는 경우
B.      새로운 캔들이 추가되면서 새로운 이평선을 추가해야 되는 경우

위 단계를 통해서 지표 작업을 진행해 보도록 할게요.

일단 20일 이평선 이므로 20개 이하가 있는 과거 데이터에 대해서는 계산하지 않고 0으로 설정하도록 합니다.

12A 2B 함수 를 아래와 같이 만듭니다.
void update_20이평선_add()
        {
            Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 정보를 우선 가져온다.
            if (avr_20 == null)
                return;

            double avr_sum;
            avr_sum = 0.0;
            //i번째 부터 20개의 데이터의 합을 구한다.
            for (int j = 0; j < 20; j++)
            {
                avr_sum += m_real_data_list[j].close;
            }
            m_real_data_list[0].avr_20 = avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.

            //설정된 X 0번째에 값을 추가 한다.
            avr_20.Points.AddXY(real_chart.Series["f_price"].Points[0].XValue, m_real_data_list[0].avr_20);

           
           
        }

        void update_20이평선_update()
        {
            //최신 20 이평선만 재계산하면 된다.
            if (m_real_data_list.Count > 0)
            {
                Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 정보를 우선 가져온다.
                if (avr_20 == null)
                    return;

                double avr_sum;
                avr_sum = 0.0;               
                //i번째 부터 20개의 데이터의 합을 구한다.
                for (int j = 0; j < 20; j++)
                {
                    avr_sum += m_real_data_list[j].close;
                }
                m_real_data_list[0].avr_20 = avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.
                //현재 최신 값을 수정한다.
                avr_20.Points[0].SetValueY(m_real_data_list[0].avr_20);
               
            }
        }

        void update_20이평선_create()
        {
           
            if (m_real_data_list.Count > 0)
            {
                Series avr_20 = real_chart.Series.FindByName("avr_20"); //현재 차트에 20이평선이 그려져 있다면 정보를 우선 가져온다.
                if (avr_20 == null)
                    avr_20 = real_chart.Series.Add("avr_20"); //없다면 새로 추가를 한다.

                avr_20.ChartType = SeriesChartType.Line; //이평선은 선형태 그래프 .
                avr_20.Color = Color.Green; //색상은 초록색
                avr_20.Points.Clear();  //기존의 이평선 값을 초기화 한다.

                //과거 마지막 20개는 20 데이터가 없기 때문에 이평선데이터를 만들수 없다.
                for (int i = 0; i < m_real_data_list.Count-20; i++)
                {                   
                    double avr_sum;
                    avr_sum = 0.0;
                    //i번째 부터 20개의 데이터의 합을 구한다.
                    for (int j = 0; j < 20; j++)
                    {
                        avr_sum += m_real_data_list[i + j].close;
                    }
                    m_real_data_list[i].avr_20 = avr_sum / 20; //i 번째에 20개를 계산하여 업데이트 한다.
                    //입력되는 x단위는 캔들데이터가 가지고 있는 날짜시간 값과 동일해야 한다.
                    avr_20.Points.AddXY(real_chart.Series["f_price"].Points[i].XValue, m_real_data_list[i].avr_20);
                }

            }
        }


추가를 아래 위치에 하나씩 해줍니다.
TR 데이터를 수신할





실시간 데이터를 수신할 때 기존 캔들 데이터가 업데이트 된것이면 이평선도 업데이트를
신규 캔들이 만들어 지면 이평선도 같이 추가를 해서 만들어 주는  add  함수를 만들어 주면됩니다.





결과 화면

댓글 없음:

댓글 쓰기