2017년 4월 8일 토요일

키움 OPEN API 실시간차트 만들기(2)


조회 요청을 한 데이터를 수신하기 위해서는 수신할 데이터를 위한 데이터 구조 클래스를 하나 추가 합니다.

프로젝트를 오른쪽 버튼을 눌러서 새항목을 선택 후 PriceObject 를 클래스로 만들어서 추가 버튼을 누릅니다.
 위와 같은 클래스를 하나 만듭니다.

이후 form 에 멤버 변수를 하나 정의하고 생성자 함수에서 초기화를 합니다. 
(만약 프로그램에 미숙하신 분이시라면 멤버 변수나 생성자라는 용어는 C# 프로그래밍 서적을 하나 보시는게 좋습니다
쉽게 저 m_real_data_list 는 위의 날짜, 시가, 고가, 저가, 종가를 저장할수 있는 공간이고 LIST 라는 표현으로 PriceEntityObject 를 여러게 저장할 수 있다는 의미 입니다.
이 변수에 데이터를 저장하기 위해서는 form1() 함수내에서 아래와 같이 초기화를 하여야 합니다.)
 이후 아까 추가 하였던 TrData 함수에 아래와 같이 요청 이름과 동일한 응답이 들어 온다면 (sRQName == "과거데이터조회") -> Request Name 이 라는 의미 입니다.
현재 존재하는 m_real_data_list 의 데이터를 모두 삭제하고, 들어온 데이터의 갯수만큼 PriceEntityObject 를 만들어서 
다시 추가해줍니다. 저기서 중요한 것은 키움 뿐 아니라 다른 여러 증권사 API 에서 가격 데이터를 응답해 줄때 
이전 가격 데이터 대비 하락 시 -(음수) 값으로 준다는 것입니다. 우리는 이것을 항상 양수로 판단해야 되기 때문에 음수이면 -1 을 곱하여 양수로 만들어서 넣어 줍니다. 

 그리고 실시간 데이터가 들어 오면 처리해야 될 부분을 아래와 같이 추가해줍니다.

수신이 되면 여기서 해야 될 일은 들어온 실시간 데이터를 기존 캔들에 업데이트 해줄 것이냐 아니면 새로운 캔들에 업데이트 해줄 것이냐 입니다. 
시간을 비교하기 위해 아래 함수를 추가 합니다. 
OPENAPI 를 통해 전달되는 TR 데이터의 시간 형식은 년(4자리)월(2자리)일(2자리)시(2)분(2)초(2) 로 되어 있습니다. 
반면 실시간으로 전달되는 데이터는 년 월 일이 빠진 일(2자리)시(2)분(2)초(2) 로 들어 오기 때문에 오늘 날짜를 구하여 앞에 붙여줍니다. 그리고 아래와 같이 date 와 현재 설정된 시간간격(5분) 과 비교하여 해당 시간 안에 있다면 true 를 자신의 캔들의 허용시간이 아니라면 false 를 리턴합니다. 
 실시간 데이터가 들어 오는 OnReceiveRealData 함수에 아래와 같이 코딩을 추가 합니다.
TR데이터가 비어있다면 실시간 데이터를 처리하지 않으며
실시간 현재 가격을 저장한다음, TR데이터의 마지막 데이터와 같은 캔들 시간데에 존재한다면 현재 가격이 고가나 저가보다 난거나 높은지 비교하고 고,저, 종가를 업데이트 합니다. 시가는 항상 처음에 한번 캔들이 생성될 때만 업데이트 되기 때문에 새로운 가격이 생성될 때 그 실시간 가격의 체결시간이 아닌 현재 선택된 분봉 기준으로 시간을 재계산하여 
만들어 줍니다. 
 이제 차트에 데이터를 그려 볼까요


디자인화면에서 차트를 선택하고 Name 속성을 real_chart 로 변경합니다. 
그리고 생성자 함수 Form1() 에 아래와 같이 속성들을 초기화 합니다. 상승일때 빨간색, 하락일 때 파란색, 
그리고 맨위에 아래와 같이 한줄을 추가해야 에러가 나지 않습니다.

using System.Windows.Forms.DataVisualization.Charting;


코드에서 나오는 real_chart_AxisViewChanged 를 추가하기 위해서 디자인 창에서 차트를 선택한다음 속성에서 번개 아이콘을 선택하고 아래의 AxisViewChanged 를 더블 클릭합니다. 이 함수는 차트에서 마우스로 확대 축소를 하기 위한 기능을 위해 사용됩니다. 
 확대 축소를 위해서는 아래 와 같은 코드를 추가 합니다.
 이제 차트를 그리기 위해서 TR 데이터가 처리된후 차트를 한번 생성해 줍니다.
아래와 같이 마지막에 real_chart_data_create() 함수를 추가 하고 
 아래와 같이 데이터를 차트에 입력 합니다.
 여기까지 하고 실행을 해보면 마우스로 드래그 확대를 해서 보면
 이런식으로 데이터가 캔들처럼 보입니다.

하지만 실시간 데이터 처리가 되지 않았기 때문에 실시간 데이터가 들어 올때 차트에 반영될 수 있도록 처리를 추가 해야 됩니다. 
 위는 현재 캔들에 가격을 업데이트하는 것이고 아래는 새로운 캔들 데이터를 추가하는 코드 입니다.

이렇게 하고 장운영시간에 실행을 해보면 실시간으로 데이터가 변경되는 차트를 확인 할수 있습니다.~~


댓글 없음:

댓글 쓰기