서론
C#으로 키움증권 Open API 활용하여 프로그램을 구현하는 방법에 대한 포스팅 3탄입니다. 이번엔 좀 더 응용된 기능을 구현해보려고 합니다. 우선 선택한 계좌의 예수금 조회를 추가하려고 합니다. 이후 주문 기능을 구현하게 된다면 필요하기 때문입니다. 또한 본격적으로 종목에 대한 정보를 조회하는 기능을 구현해보도록 하겠습니다.
C# 키움증권 Open API (2) - 로그인 구현 링크
C# 키움증권 Open API (4) - 조건식 실시간 검색
1. 예수금 조회
private void InitializeEvents()
{
// ComboBox Eventes
cboAcctInfo.SelectedIndexChanged += (s, e) =>
{
// 계좌 번호가 공백이 아닌 경우에만 예수금 조회
if (!string.IsNullOrEmpty(cboAcctInfo.Text.Trim()))
GetCashInfo(cboAcctInfo.Text.Trim());
};
}
// 예수금 조회
private string GetCashInfo(string acctNo)
{
axKHOpenAPI1.SetInputValue("계좌번호", acctNo);
axKHOpenAPI1.SetInputValue("비밀번호입력매체구분", "00");
axKHOpenAPI1.SetInputValue("조회구분", "2"); // 3:추정조회, 2:일반조회
int result = axKHOpenAPI1.CommRqData("예수금상세현황", "OPW00001", 0, GetScreenNo());
return GetErrorMessage(result);
}
axKHOpenAPI1.OnReceiveTrData += (s, e) =>
{
switch(e.sRQName)
{
case "예수금상세현황":
txtCash.Text = string.Format("{0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "예수금").Trim().ToDecimal());
break;
}
};
private int _screenNo = 1001; // 화면 번호
// 화면 번호 생성
private string GetScreenNo()
{
if (_screenNo < 1200)
_screenNo++;
else
_screenNo = 1001;
return _screenNo.ToString();
}
2. 종목 정보 조회
private void InitializeEvents()
{
axKHOpenAPI1.OnReceiveTrData += (s, e) =>
{
switch(e.sRQName)
{
case "예수금상세현황":
txtCash.Text = string.Format("{0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "예수금").Trim().ToDecimal());
break;
case "주식기본정보":
WriteLog(" --------------------------------------------------------");
WriteLog(string.Format(" 종목코드: {0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "종목코드").Trim()));
WriteLog(string.Format(" 종목명: {0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "종목명").Trim()));
WriteLog(string.Format(" 연중최고: {0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "연중최고").Trim().ToInt()));
WriteLog(string.Format(" 연중최저: {0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "연중최저").Trim().ToInt()));
WriteLog(string.Format(" PER: {0:#,##0.00}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "PER").Trim().ToDecimal()));
WriteLog(string.Format(" EPS: {0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "EPS").Trim().ToInt()));
WriteLog(string.Format(" ROE: {0:#,##0.00}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "ROE").Trim().ToDecimal()));
WriteLog(string.Format(" PBR: {0:#,##0.00}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "PBR").Trim().ToDecimal()));
WriteLog(string.Format(" EV: {0:#,##0.00}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "EV").Trim().ToDecimal()));
WriteLog(string.Format(" BPS: {0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "BPS").Trim().ToInt()));
WriteLog(string.Format(" 신용비율: {0:#,##0.00}%", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "신용비율").Trim().ToDecimal()));
WriteLog(string.Format(" 외인소진률: {0:#,##0.00}%", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "외인소진률").Trim().ToDecimal()));
WriteLog(string.Format(" 거래량: {0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "거래량").Trim().ToDecimal()));
WriteLog(" --------------------------------------------------------");
break;
}
};
// 종목 조회 버튼
btnSearchStock.Click += (s, e) =>
{
if (axKHOpenAPI1.GetConnectState() == 0)
{
ShowMessageBox("Open API 연결되어 있지 않습니다.", MessageBoxIcon.Information);
return;
}
if (string.IsNullOrEmpty(txtStockCode.Text.Trim()))
{
ShowMessageBox("종목코드를 입력해주세요.", MessageBoxIcon.Information);
return;
}
WriteLog("[종목 조회]");
string errorMessage = SearchStockInfo(txtStockCode.Text.Trim());
if (!string.IsNullOrEmpty(errorMessage))
WriteLog($" {errorMessage}");
};
}
private string SearchStockInfo(string code)
{
axKHOpenAPI1.SetInputValue("종목코드", code);
int result = axKHOpenAPI1.CommRqData("주식기본정보", "OPT10001", 0, GetScreenNo());
return GetErrorMessage(result);
}
마무리
C#으로 구현하는 키움증권 Open API 3번째 포스팅을 마쳤습니다. 본격적으로 증권 데이터를 가져올 수 있게되어서 기분이 좋습니다. 다음 포스팅에서는 보다 더 응용된 기능을 구현하여 포스팅할 수 있도록 하겠습니다.
C# 키움증권 Open API (2) - 로그인 구현 링크
C# 키움증권 Open API (4) - 조건식 실시간 검색
Uploaded by N2T