티스토리 뷰

서론


C#으로 키움증권 Open API 활용하여 프로그램을 구현하는 방법에 대한 포스팅 3탄입니다. 이번엔 좀 더 응용된 기능을 구현해보려고 합니다. 우선 선택한 계좌의 예수금 조회를 추가하려고 합니다. 이후 주문 기능을 구현하게 된다면 필요하기 때문입니다. 또한 본격적으로 종목에 대한 정보를 조회하는 기능을 구현해보도록 하겠습니다.

C# 키움증권 Open API (2) - 로그인 구현 링크

C# 키움증권 Open API (2) - 로그인 구현
이제 본격적으로 키움증권 Open API를 통해 기능을 구현할 차례입니다.
https://joel-helloworld.tistory.com/69

C# 키움증권 Open API (4) - 조건식 실시간 검색

C# 키움증권 Open API (4) - 조건식 실시간 검색
서론 C# 을 통해 키움증권 Open API 활용한 프로그램 구현하기 포스팅 4탄입니다. 이번 포스팅에서는 키움증권 계정에 설정된 조건식을 읽어와서, 조건식 실시간 검색 을 구현하려고 합니다. 조건식은 Open API를..
https://joel-helloworld.tistory.com/71

1. 예수금 조회


💡
예수금 조회를 위해서 디자인에 Label과 TextBox를 추가합니다.

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);
}
💡
예수금 정보를 조회하는 시점은 계좌 ComboBox의 SelectedIndexChanged 이벤트로 구현합니다.
💡
GetCashInfo 함수를 만들어서 예수금 조회 기능을 구현합니다.
💡
예수금 조회를 위해서는 KHOpenAPI ControlSetInputValue를 3가지 해야합니다. 계좌번호, 비밀번호입력매체구분, 조회구분 입니다.
💡
비밀번호입력매체구분은 “00”으로 고정하고, 조회구분은 “2”인 경우 일반조회, “3”인 경우 추정조회입니다.
💡
SetInputValue가 끝난 뒤에 CommRqData를 통해 Request를 보냅니다. 첫번째 파라미터의 경우 Request Name이며 원하는 문자열을 입력하면됩니다. 추후에 구분자로 활용됩니다.
💡
두번째 파라미터의 경우 TR Code에 해당하는데 예수금상세현황을 위한 Code는 OPW00001 입니다. 세번째 파라미터0으로 하고 네번째 파라미터에는 화면 번호를 전달합니다.

axKHOpenAPI1.OnReceiveTrData += (s, e) =>
{
    switch(e.sRQName)
    {
        case "예수금상세현황":
            txtCash.Text = string.Format("{0:#,##0}", axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0, "예수금").Trim().ToDecimal());
            break;
    }
};
💡
CommRqData를 하는 경우 KHOpenAPI ControlOnReceiveTrData 이벤트가 호출됩니다. e.sRQName은 앞서서 전달한 첫번째 파라미터값입니다. 어떤 Request인지 구분하기 위해 전달한 것입니다.
💡
GetCommData 을 통해 본격적인 예수금을 조회할 수 있습니다. 네번째 파라미터는 “예수금”을 전달하면 예수금을 조회할 수 있습니다.

💡
OPW00001의 OutPut은 KOA Studio TR 목록을 통해 확인할 수 있습니다.
💡
OPW00001 예수금상세현황요청의 경우 “예수금” 외에도 다양한 값을 확인할 수 있습니다. 네번째 파라미터에 전달하는 문자열을 바꾸면 됩니다.

private int _screenNo = 1001; // 화면 번호

// 화면 번호 생성
private string GetScreenNo()
{
    if (_screenNo < 1200)
        _screenNo++;
    else
        _screenNo = 1001;
    return _screenNo.ToString();
}
💡
GetScreenNo의 경우 화면 번호를 가져오는 동작입니다. 화면 번호는 “0000”을 제외한 4자리 숫자이며 200개를 초과해서 사용하면 안된다고 하여 “1001”~”1200” 을 사용하겠습니다.
💡
화면 번호는 서버에 조회나 주문등 필요한 기능을 요청할때 이를 구별하기 위한 키값으로 이해하시면 됩니다. 0000(혹은 0)을 제외한 임의의 네자리 숫자를 사용하시면 되는데 개수가 200개로 한정되어 있기 때문에 이 개수를 넘지 않도록 관리하셔야 합니다. 만약 사용하는 화면번호가 200개를 넘는 경우 조회 결과나 주문 결과에 다른 데이터가 섞이거나 원하지 않는 결과가 나타날 수 있습니다.

💡
로그인을 한 뒤 바로 정보 조회를 하면안됩니다. 계좌 비밀번호를 등록해야 합니다.

💡
컴퓨터에 실행 중인 계좌 비밀번호 입력 프로그램을 통해 등록합니다. 해당 프로그램은 Open API 로그인을 하면 자동으로 실행되어 있습니다.

💡
정상적으로 예수금을 조회한 결과입니다. 모의 투자 설정 금액을 1억으로 설정하여 1억이 출력됬습니다. 실제 제 돈이였으면 좋겠는데.. 하하

2. 종목 정보 조회


💡
다음으로 종목 코드를 입력하고, 종목 정보를 조회하는 기능을 구현하려합니다. 동작 구현을 위해 Label, TextBox, Button을 추가합니다.

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);
}
💡
종목 정보 조회는 앞서서 한 예수금 조회와 방식은 같은데 비교적 더 간단합니다. SetInputValue종목 코드 1개만 하면되고, CommRqDataOPT10001을 전달합니다.
💡
종목코드, 종목명, 연중최고, 연중최저, PER, EPS, ROE, PBR, EV, BPS, 신용비율, 외인소진률, 거래량을 가져오는 코드를 구현했습니다.

💡
종목 코드의 경우 네이버 금융에서도 쉽게 찾을 수 있습니다. 삼성전자의 종목 코드는 “005930” 입니다.

💡
OPT10001 주식기본정보요청의 경우에도 위에 구현한 것 외에 다양한 값들을 OutPut으로 받을 수 있습니다.

💡
삼성전자종목 코드“005930”을 입력하고 종목 조회를 한 결과입니다. 보다 더 다양한 OutPut을 받아올 수 있으니 원하는 기능을 다양하게 구현할 수 있습니다.

마무리


C#으로 구현하는 키움증권 Open API 3번째 포스팅을 마쳤습니다. 본격적으로 증권 데이터를 가져올 수 있게되어서 기분이 좋습니다. 다음 포스팅에서는 보다 더 응용된 기능을 구현하여 포스팅할 수 있도록 하겠습니다.

C# 키움증권 Open API (2) - 로그인 구현 링크

C# 키움증권 Open API (2) - 로그인 구현
이제 본격적으로 키움증권 Open API를 통해 기능을 구현할 차례입니다.
https://joel-helloworld.tistory.com/69

C# 키움증권 Open API (4) - 조건식 실시간 검색

C# 키움증권 Open API (4) - 조건식 실시간 검색
서론 C# 을 통해 키움증권 Open API 활용한 프로그램 구현하기 포스팅 4탄입니다. 이번 포스팅에서는 키움증권 계정에 설정된 조건식을 읽어와서, 조건식 실시간 검색 을 구현하려고 합니다. 조건식은 Open API를..
https://joel-helloworld.tistory.com/71

Uploaded by N2T

댓글