본문 바로가기
주식 자동매매 | 시스템 트레이딩 프로그래밍

쉽게 C# 프로그램으로 주식 자동매매하는 방법 - 사용자 계좌 잔고조회

by 자유코딩 2018. 4. 25.

안녕하세요 우종선입니다.
이번 글은 키움증권 API 를 사용해서 계좌정보조회를 하는 방법입니다.

이번 글의 내용을 모두 따라하시면 아래 그림과 같은 계좌 조회 창을 만들 수 있습니다.

계좌번호를 선택하고 계좌조회를 클릭하시면 잔고 정보가 화면에 표시됩니다.
이제 함께 만들어보도록 하겠습니다.

예수금조회,종목조회라는 이름의 새 프로젝트를 생성했습니다.

화면에 API 모듈을 추가합니다.
이어서 화면에 TableLayout , Label , Button 을 추가합니다.

이제 label을 끌어다 놓습니다.

label의 이름을 AccountList로 변경합니다.

Anchor 속성도 변경해줍니다.
이전 글에서 label의 속성을 변경하는 것과 같습니다.

다음은 BackColor를 바꿔줍니다.

저는 White를 선택했습니다.

이번에는 label의 TextAlign을 바꿔주겠습니다.

그리고 Text를 바꿉니다.
"계좌번호" 라고 적습니다.

앞으로 가지고 있는 계좌에 대해서 예수금 , 매입금 , 평가금, 손익금을 테이블에 표시할 것입니다.
그래서 테이블을 선택하고, 행을 추가합니다.

1행을 추가했습니다

같은 방법으로 1행을 더 추가합니다.

마지막 행을 추가합니다.

이제 행이 5개가 되었습니다.

계좌번호 label을 복사해서 붙여넣습니다.(Ctrl + C , Ctrl + V)

왼쪽으로 옮깁니다.
이전 글처럼 왼쪽은 항목 이름 label을 놓고, 오른쪽에 항목을 표시할 계획입니다.

두번째 label의 Text를 예수금 이라고 바꿉니다.

그리고 테이블의 크기를 조금 키우고, 행의 높이를 똑같이 맞춰줍니다.

오른쪽 아래의 하얀 네모를 움직이시면 크기를 조절 할 수 있습니다.
이제 행의 크기를 조절해보겠습니다.

테이블을 선택하고, 행 및 열 편집을 선택합니다.

행을 선택합니다.

백분율을 클릭하세요.

Row4 , Row5 도 마찬가지로 선택하고 백분율을 선택합니다.

Row5까지 모두 크기를 변경한 모습입니다.

확인을 클릭합니다.

모든 행의 크기가 같아졌습니다.
표를 클릭하고 표의 테두리 선도 만들어주겠습니다.

CellBorderStyle을 선택하고 None을 Single로 바꿔줍니다.

이제 테두리가 생겼습니다.

예수금 label 아래의 행들도 label을 채워보겠습니다.
예수금 label을 복사해서 붙여넣으면 됩니다.(Ctrl + C , Ctrl + V)

label을 드래그해서 이동시킵니다.

이제 label의 Text를 바꿉니다.

label의 text를 전체매입금액 이라고 바꿔줍니다.

label을 복사해서 붙여넣습니다.

label을 드래그해서 이동시킵니다.

label의 텍스트를 바꿔 적습니다.

전체평가금액 이라고 적었습니다.
label을 한개 더 복사해서 붙여넣습니다.

label의 텍스트를 전체손익금액 이라고 적습니다.

이렇게 왼쪽 label이 모두 생성되었습니다.
다음은 표의 오른쪽 행을 채워보겠습니다.

ComboBox를 드래그해서 놓습니다.
첫번째 글과 같습니다.

드래그 한 ComboBox를 선택하고 Anchor 속성을 바꿔줍니다.

ComboBox의 이름을 AccountList로 바꿔줍니다.

(Name)을 AccountList로 바꾸면 됩니다.

이제 아래에 label들을 추가합니다.
전체손익금액 label을 선택하고 복사해서 붙여넣으면 됩니다.(label을 클릭하시고 Ctrl+C , Ctrl+V)

위쪽으로 label을 끌어다 놓습니다.

Text를 0으로 바꿉니다.

그리고 (Name)을 예수금label로 바꿔줍니다.

다음 label도 이전과 똑같이 복사해서 만들어냅니다.
전체손익금액 label을 선택하고 Ctrl + C , Ctrl + V해서 복사 붙여넣기를 합니다.

label을 위쪽으로 드래그합니다.

label을 선택하고 Text를 0으로 바꿔줍니다.

label의 Text 옆을 클릭하고 바꿔주면 됩니다.

label의 (Name)도 바꿔줍니다.

(Name)을 전체매입금액label로 변경합니다.

전체평가금액 label 옆에도 label을 추가해줍니다.
계속 복사해서 붙여넣고 드래그해서 가져다 놓으면 됩니다.

label을 선택하고 Text를 바꿔줍니다.

Text 를 0으로 바꿨습니다.
이제 label의 (Name)도 바꿔줍니다.

(Name)을 선택하고 전체평가금액label을 입력합니다.

이제 다음 label도 복사해서 붙여넣습니다.

label을 클릭하시고 Ctrl+C , Ctrl+V (복사 붙여넣기) 해줍니다.

label의 자리를 옮긴 다음에는 label을 선택하고 (Name)을 바꿔줍니다.

(Name)옆에 전체손익금액label 이라고 작성합니다.

label을 다 고쳤으면 이제 Button을 하나 드래그해서 가져옵니다.

Button을 선택하고 Text를 바꿔줍니다.

Text에 계좌조회라고 입력합니다.

button의 (Name)도 변경합니다.

이제 Form1.cs에 코드를 작성해보겠습니다.

Form1()을 더블클릭해서 소스코드가 있는 창을 엽니다.

먼저 로그인 코드를 작성합니다.

이렇게 하면 프로그램을 실행하자마자 로그인 창이 나타날 수 있습니다.
이제 로그인이 되었을때 계좌번호를 선택 할 수 있도록 코드를 작성하겠습니다.

로그인이 되었을때 동작을 정의하는 OnEventConnect 함수를 추가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace 예수금조회_종목조회
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            axKHOpenAPI1.CommConnect();
            axKHOpenAPI1.OnEventConnect += onEventConnect;
        }
        public void onEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
        {
            if (e.nErrCode==0)
            {
                string 계좌리스트 = axKHOpenAPI1.GetLoginInfo("ACCLIST").Trim();
                string[] 계좌목록 = 계좌리스트.Split(';');
 
                for (int i = 0; i < 계좌목록.Length; i++)
                {
                    AccountList.Items.Add(계좌목록[i]);
                }
            }
        }
    }
}
 
cs


계좌목록을 ComboBox에 추가하는 전체 코드입니다.
첫번째 글에서 처럼 작성하면 됩니다.
이제 계좌조회 버튼을 클릭했을때 동작하는 함수도 정의해보겠습니다.

버튼의 (Name)을 적고 . 을 쓴 다음 Click을 적으면 버튼을 클릭했을때 실행이 될 함수를 추가 할 수 있습니다.

onEventConnect 함수 아래에 새로운 함수를 정의합니다.

이제 함수의 내용을 채워넣습니다.

잠시 KOA Studio안의 함수들로 계좌정보를 어떻게 조회하는지 설명드리면,

그림과 같은 순서로 동작하게 됩니다.
이것을 조금 더 자세하고 쉽게 설명드리면, 이렇습니다.

예를 들어서 사용자가 그림처럼 CommRqData()함수로 요청을 하면
키움API서버에서는 OnReceiveTrData()함수를 호출해줍니다.

그러면 이제 OnReceiveTrData 함수에서 다시 GetCommData함수를 호출해서 요청을 진행하면 됩니다.

그럼 이제 이 그림에 따라서 코드를 더 작성해보겠습니다.

지금까지의 코드는 버튼을 클릭했을때 CommRqData함수를 호출한 것입니다.
OnReceiveTrData 함수가 호출되었을 때의 동작도 정의해보겠습니다.

먼저 Form 에 OnReceiveTrData를 추가합니다.

AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent 뒤에 있는 e는 AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent 타입의 변수입니다.
여기에 사용자가 CommRqData 함수로 요청한 정보가 들어있습니다.
이 e를 사용해서 아래 그림처럼 함수의 내용을 작성합니다.

e.sRqName에는 앞서 CommRqData에 적었던 "계좌잔고평가내역"이 들어있습니다.
GetCommData의 괄호 안은 KOA Studio를 보고 작성하면 됩니다.

GetCommData로 자료를 요청하면 사용자는 문자열로 요청의 결과를 받습니다.
요청의 결과를 한번 확인해보겠습니다.

MessageBox.Show()는 알림창을 띄워서 사용자가 메세지를 확인 할 수 있게 해주는 함수입니다.
GetCommData로 요청을 하고 결과를 결과문자열에 저장했습니다.
코드를 실행하면 아래 그림처럼 표시가 됩니다.

계좌조회를 클릭하면 오른쪽처럼 새로운 창이 나타나고 , 요청한 총 매입금액이 표시가 됩니다.
하지만 뭔가 메세지가 이상합니다.
00000007414100 이렇게 표시가 되고 있습니다.
저렇게 숫자를 표시한다면 보기에 편하지 않습니다.
000을 없애려면 int.Parse() 라는 함수를 사용하면 됩니다.
int.Parse(문자열)는 () 괄호안에 들어있는 문자열에 포함된 숫자를 숫자로 바꿔주는 함수입니다.
예를 들어서 "123" 이라는 문자열을 숫자 123으로 바꿔줍니다.
"000123" 이라는 문자열은 123이라는 숫자로 바꿔줍니다.

덧붙여서 double.Parse() 는 문자열을 소수로 바꿔줍니다.
"123.456" 을 123.456으로 바꿔주는 것입니다.

axKHOpenAPI1.GetCommData(e.sTrCode,e.sRQName,0,"총매입금액");
이라는 요청을 int.Parse()의 괄호 안에 집어넣으면 됩니다.

그러면 이제 GetCommData로 받은 자료들을 프로그램 화면에 적어보도록 하겠습니다.

label의 Text에 변수를 저장했습니다.
아래 코드는 Form1.cs의 전체 코드입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace 예수금조회_종목조회
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            axKHOpenAPI1.CommConnect();
            axKHOpenAPI1.OnEventConnect += onEventConnect;
            AccountButton.Click += accountbutton;
            axKHOpenAPI1.OnReceiveTrData += onReceiveTrData;
        }
        public void onReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
        {
            if (e.sRQName =="계좌잔고평가내역")
            {
                int 전체매입금액 = int.Parse(axKHOpenAPI1.GetCommData(e.sTrCode,e.sRQName,0,"총매입금액"));
                int 예수금 = int.Parse(axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0"추정예탁자산"));
                int 전체평가금액 = int.Parse(axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0"총평가금액"));
                int 전체손익금액 = int.Parse(axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, 0"총평가손익금액"));
 
                전체매입금액label.Text = 전체매입금액.ToString();
                예수금label.Text = 예수금.ToString();
                전체평가금액label.Text = 전체평가금액.ToString();
                전체손익금액label.Text = 전체손익금액 + "";
 
            }
        }
        public void onEventConnect(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
        {
            if (e.nErrCode==0)
            {
                string 계좌리스트 = axKHOpenAPI1.GetLoginInfo("ACCLIST").Trim();
                string[] 계좌목록 = 계좌리스트.Split(';');
 
                for (int i = 0; i < 계좌목록.Length; i++)
                {
                    AccountList.Items.Add(계좌목록[i]);
                }
            }
        }
        public void accountbutton(object sender, EventArgs e)
        {
            
            string 계좌번호 = AccountList.Text;
            axKHOpenAPI1.SetInputValue("계좌번호", 계좌번호);
            axKHOpenAPI1.SetInputValue("비밀번호""2351");
            axKHOpenAPI1.SetInputValue("비밀번호입력매체구분""00");
            axKHOpenAPI1.SetInputValue("조회구분""2");
 
            axKHOpenAPI1.CommRqData("계좌잔고평가내역""opw00018"0"5000");   
 
            
        }
    }
}
 
cs


 

그러면 이제 프로그램을 실행해보겠습니다.

비밀번호를 입력하고 로그인합니다.

계좌번호를 선택합니다.

계좌조회를 클릭합니다.

이런 메세지가 나타난다면

모니터 오른쪽 맨 아래의 작업표시줄에서 이렇게 생긴 아이콘을 마우스 우클릭합니다.

이렇게 생긴 창이 나타날 것입니다.

비밀번호를 입력하고 등록을 클릭합니다.
AUTO를 체크해주시면 앞으로 자동으로 비밀번호가 입력됩니다.

닫기를 클릭하고 계좌조회를 다시 클릭합니다.


계좌의 잔고가 잘 출력되는 것을 확인 할 수 있습니다.
만드시면서 어려운 점은 없으셨나요?
댓글이나 아래 연락처로 질문을 보내시면 빠른 답변을 받으실 수 있습니다.
우종선
blog : fors.tistory.com
email : jswoo030@gmail.com
naver 카페 : http://cafe.naver.com/codeshare
카카오톡 오픈 채팅방 : https://open.kakao.com/me/fors
카카오톡 ID : Jongsun1001

댓글