이전글에서 모의투자 계좌를 개설했다. 본격적으로 API를 사용해보도록 하자. 키움증권에서는 KOA Studio라는 API Explorer(?)를 지원한다. 이곳을 눌러 KOA Studio를 다운로드 받자.
다운로드 후, KOA Studio를 실행하면 이런 화면이 나온다.
좌측에서 기능들의 목록을 볼 수 있다.
참고로, 실시간 데이터는 EventHandler를 통해 받는 실시간 데이터이며, TR은 Transaction의 약자로 서버에 보내는 일회성? 작업이다.
우선, KOA Studio를 사용하기 전에 로그인을 먼저 해주자. 좌측 상단에 파일 - Open API 접속을 통해 로그인 하면 된다
삼성전자 (005930)의 현재가를 한번 구해보자.
1. TR목록에서, 현재가를 검색한다.
2. 검색 결과에서 해당 기능을 선택한다.
3. 우측 속성에서 종목코드를 입력하고, 조회버튼을 클릭한다.
4. 하단 출력창에서 데이터의 출력을 확인한다.
여기까지, C#에서 구현해보도록 하자.
UI는 이렇게 구성했다. 종목 GET의 코드를 구현해보자.
잠깐! 코드를 구현하기 전에, 키움증권 API의 동작 방식부터 알고가자.
(출처 : 키움증권)
정리해보면 다음과 같다.
1. SetInputValue() > TR Input값 설정
2. CommRqData() 메소드를 통해 데이터 요청 (1초에 5회 제한!)
3. OnReceiveMsg(), OnReceiveTrData() 이벤트를 통해 결과 수신
4. GetRepeatCnt(), GetCommData() 메소드를 통해 데이터 접근
*이벤트란? 어떤 작업이 발생했을 때, 알려주는 기능이다. 예를 들어 설명하자면, 회사에서 내가 조부장이다. 박사원과 박인턴에게 작업을 할당했다. 작업이 다 됐는지 일일이 신경쓰고 물어보는 것은 비효율적이다. 박사원과 박인턴이 작업 중간마다, 끝나고 나에게 말해주는 것(이벤트)이 효율적이다.
설명이 길었다. (설명충) 코드를 작성해보자.
private void BtnSearch_Click(object sender, EventArgs e)
{
axKHOpenAPI.SetInputValue("종목코드", txtCode.Text); // 1. SetInputValue
int ret = axKHOpenAPI.CommRqData("주식기본정보", "OPT10001", 0, "1002"); // 2. CommRqData 를 통해 데이터 요청
if(ret < 0)
{
MessageBox.Show("요청 실패\nError Code : " + ret, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
OnReceiveTrData() 이벤트에 추가할 함수를 작성해주고...
private void OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
int receiveCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName);
if ("주식기본정보".Equals(e.sRQName))
{
for (int i = 0; i <= receiveCnt; i++)
{
string jName = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목명"); // 4. GetCommData 메소드를 통해 데이터 접근
string jPrice = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "현재가"); // 4. GetCommData 메소드를 통해 데이터 접근
MessageBox.Show("[" + jName + "]\n현재가 : " + jPrice);
}
}
}
public frmMain()
{
InitializeComponent();
axKHOpenAPI.OnReceiveTrData += OnReceiveTrData; // 3. EventListener 등록
}
확인
참고로, 반드시 로그인을 먼저 진행해야 종목 정보가 불러와진다.!
데이터가 나오긴 나오는데... 앞뒤가 요란하다!
Trim() 메소드를 통해 앞뒤 공백을 잘라보자.
private void OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
int receiveCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName);
if ("주식기본정보".Equals(e.sRQName))
{
for (int i = 0; i <= receiveCnt; i++)
{
string jName = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목명"); // 4. GetCommData 메소드를 통해 데이터 접근
string jPrice = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "현재가"); // 4. GetCommData 메소드를 통해 데이터 접근
jName = jName.Trim();
jPrice = jPrice.Trim();
MessageBox.Show("[" + jName + "]\n현재가 : " + jPrice);
}
}
}
삼성전자의 현재가가 보인다.!
앞에 -는 금일 시작가 기준으로 -여서 그런듯 하다.
참고로, CommRqData의 첫 번째 인자 (사진에서 "주식기본정보"), 와 마지막 인자 (화면번호, 사진에서 "1002")는 자신이 구분할 수 있는 임의의 문자열로 입력해도 되는듯 하다.
이렇게도 된다.