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

쉽게 C# 프로그램으로 주식 자동매매 하는 방법 - 키움증권 OpenAPI 설치 , 로그인, 사용자 정보 확인

by 자유코딩 2018. 4. 17.

쉽게 C# 프로그램으로 주식 자동매매 하는 방법 - 키움증권 OpenAPI 설치 , 로그인, 사용자 정보 확인

 

안녕하세요 우종선입니다.

이번 글에서는 키움 증권 Open API를 설치하고 프로그램에서 로그인 화면을 띄워보도록 하겠습니다.

◆OpenAPI란?
API는 프로그래머가 구현하고자 하는 기능을 편리하게 구현 할 수 있도록 제공되는 기능(함수)의 모음입니다.
OpenAPI는 그런 API가 모든 사람들이 쓸 수 있도록 공개되어 있다는 말입니다.

◆OpenAPI의 역할
Kiwoom OpenAPI는 영웅문 HTS에서 사용자가 요청 할 수 있는 정보들을 프로그램에서 그대로 요청 할 수 있게 해줍니다.
키움증권 OpenAPI를 통해서 프로그래머는 영운문 HTS에서 처럼 종목의 정보를 조회하고, 주문 하는 프로그램을 만들 수 있습니다.
설정한 조건에 맞춰서 자동으로 매수 주문을 하고, 설정한 조건에 따라서 자동으로 매도 주문을 할 수도 있습니다.

1. Open API 신청하기

 

 

키움증권 홈페이지 하단의 OpenAPI를 클릭합니다.

 

https://www3.kiwoom.com/nkw.templateFrameSet.do?m=m1408000000

 

1.사용 신청하러 가기

 

 

신청하러 가기를 클릭하고 로그인 합니다.

 

저는 이미 신청을 해놓아서 등록된 아이디가 표시 되었습니다.
서비스 사용 등록/해지 탭에서 안내에 따라 신청해주시면 됩니다.

2.키움 OpenAPI+ 모듈을 다운로드

 

 

다운로드를 클릭하면 exe 파일을 다운로드 받으실 수 있습니다.
exe 파일을 저장하시고 실행하세요.

 

 

파일을 실행하면 아래와 같은 설치 화면이 나타납니다.

 

저는 이미 설치했기 때문에 수정,복구,제거 옵션이 나타났습니다.
하지만 처음 설치하시는 분들은 안내에 따라 설치를 진행 하실 수 있습니다.

3.KOA Studio 다운로드
1,2,3의 순서로 진행해주시면 됩니다.

다운로드 한 키움 OpenAPI+ 모듈과 KOA Studio 를 확인해보도록 하겠습니다.

 

키움 OpenAPI + 모듈을 다운로드 하면 khopenapi.ocx 파일을 확인 할 수 있습니다.
앞으로 이 파일을 자주 사용하시게 될 것입니다.

KOA Studio는 키움증권에서 제공하는 API의 함수들을 어떻게 사용하는지 서술한 문서 파일이라고 생각하시면 됩니다.

 

 

아래 그림처럼 함수들을 확인 할 수 있습니다.

이제 다운로드 한 OpenAPI 모듈을 사용해서 프로그램을 만들어보도록 하겠습니다.

먼저 Visual Studio 를 실행하고 프로젝트를 생성합니다.

 

Windows Forms 앱(.NET Framework) 를 선택합니다.
프로젝트 이름을 지정하고 확인을 클릭합니다.

 

 

프로젝트가 생성되었습니다.

 

 

 

이제 모듈을 불러오도록 하겠습니다.

 

보기 - 도구상자를 클릭합니다.
그리고 도구 상자 옆의 핀을 클릭하셔서 도구 상자를 폼 화면에 고정 시키시길 바랍니다.

 

핀이 세로로 바뀌게 됩니다.

 

앞으로 도구상자에 폼 화면으로 버튼 , label등 여러가지 화면 구성 요소들을 끌어다 놓고 사용하게 될 것입니다.
그래서 도구 상자는 Form1.cs[디자인] 화면에 두고 접근하셔야 합니다.
Form1.cs[디자인] 화면이 안 보이신다면 shift 와 F7키를 함께 누르시면 Form1.cs[디자인] 창이 나타납니다

 

 

마우스 우클릭 후 항목선택을 클릭합니다.

 

 

KHOpenAPI Control을 체크하시고 확인을 클릭하시면 됩니다.

 

 


KHOpenAPI Control 을 폼 화면으로 드래그 합니다.

 

 

 

 

드래그 하기 전에 Form1.Designer.cs 파일을 열어보시면 프로젝트를 생성 할 때 자동으로 생성된 내용 말고는 다른 내용이 없습니다.

 

 

드래그 하면 화면에 API 모듈이 추가 되었습니다.

 

모듈을 추가하고 Form1.Designer.cs 파일을 열어보시면 없었던 부분이 생겨납니다.
이것을 통해서 Form1.Designer.cs 파일은 Form1.cs[디자인]에서 일어나는 일들을 반영하는 것임을 확인 할 수 있습니다.
그리고 모듈을 추가 했을때 AxKHOpenAPILib.AxKHOpenAPI axKHOpenAPI1라는 코드가 자동으로 생성되었습니다.

앞으로 로그인, 데이터요청 , 주문 , 실시간 데이터 수신 등 증권사에 정보를 요청하는 모든 메소드는 추가된 axKHOpenAPI1 객체를 이용해서 사용하게 됩니다.

이제 Form1() 코드에 로그인 화면을 띄우는 코드를 작성해보도록 하겠습니다.

Form1() 을 선택합니다.
Form1()의 아래에는 아까 드래그해서 추가한 axKHOpenAPI1 : AxKHOpenAPI 도 보입니다.
앞으로 소스코드 안에서 axKHOpenAPI1라는 변수를 사용해서 API 함수를 호출하게 됩니다.

 

여기에 로그인 화면을 띄우는 코드를 작성해보도록 하겠습니다.

시작 버튼을 클릭해서 프로그램을 실행합니다.

 

로그인 화면이 나타났습니다.
비밀번호를 입력하고 로그인 하면 로그인이 됩니다.

 

 

바로 이 함수를 작성한 것입니다.
KOA Studio를 보면 함수를 관련 있는 함수들끼리 묶어놓았습니다.

그럼 이제 코드를 조금 바꿔 보겠습니다.
저 상태로는 로그인이 잘 된 것인지 알 수가 없습니다.

 

폼에서 Button을 추가합니다. 저는 버튼의 이름을 LoginButton 으로 지정했습니다.
버튼의 이름은 아래 그림과 같은 방법으로 바꿀 수 있습니다.


 

버튼에 표시되는 텍스트는 "로그인 버튼" 이라고 지정했습니다.
이제 화면에 사용자 정보를 표시하기 위한 컨트롤들을 배치해보겠습니다.
먼저 폼에 TableLayout을 끌어다 놓습니다.

 

TableLayout을 끌어다 놓은 화면입니다.

 

 

이제 TableLayout에 Label을 끌어다 놓습니다.

 

 

끌어다 놓은 label1을 클릭하고 조금 바꿔줍니다.

 

이제 label1의 색을 바꿔줍니다.

 

 

저는 웹을 클릭하고 white를 클릭했습니다.

 

label의 색이 바뀐 것을 확인 할 수 있습니다.
이제 label1의 글씨를 바꿔보겠습니다.

 

 

 

 

 

클릭하면 글자가 가운데로 이동합니다.

 

그러면 이제 다른 Label도 더 추가해보겠습니다.
계좌번호가 적힌 Label을 클릭하고 Ctrl+C , Ctrl+V를 누르시면 label(라벨)이 복사, 붙여넣기 됩니다.

 

 

라벨이 하나 더 생겨났습니다.
이 라벨을 아래쪽으로 드래그 하시면 됩니다.

 

 

 

이렇게 하면 아래 그림처럼 계좌번호 label과 사용자이름 label 이 만들어집니다.

 

그러면 이제 다른 Label들도 더 추가해보도록 하겠습니다.
다른 label들을 추가하기 위해서 테이블 레이아웃의 행을 늘려야 합니다.

 

테이블 레이아웃을 클릭하고 오른쪽 위의 작은 아이콘을 클릭합니다.

 

 

행 추가를 클릭합니다.
행 추가를 클릭하면 표에서 행이 한 줄 생겨납니다.

 

 

행 추가를 한번 더 클릭해서 표를 4줄로 만들어줍니다.

 

이제 아까처럼 label을 하나 클릭해서 복사하고 붙여넣습니다.

표의 왼쪽에는 항목의 이름을 적을 것입니다.
표의 오른쪽에는 사용자 정보를 표시할 것입니다.

 

 

Text를 아이디 라고 바꿔줍니다.

 

 

Label을 한개 더 복사해서 만들고 왼쪽 아래로 끌어다 놓습니다.

 

Text를 접속 서버 구분이라고 입력합니다.

 

 

표의 행들의 넓이가 제각각입니다.
같은 크기로 고쳐보겠습니다.

 

 

 

 

그러면 이제 label의 다른 속성도 바꿔보겠습니다.

 

 

label 이름을 UserName으로 지정합니다.

 

Label 위 텍스트를 가운데로 정렬합니다.

 

 

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

 

 

 

이제 접속서버구분을 표시할 label을 하나 더 복사해서 붙여넣습니다.
이렇게 label을 복사해서 붙여넣으면 새롭게 추가한 label의 가운데정렬 , 크기 조절을 안해도 됩니다.

 

 

label을 추가하고 이름을 변경합니다.
저는 이름을 GetServer라고 지정했습니다

 

이렇게 폼을 구성했습니다.
그러면 이제 로그인 버튼을 클릭했을 때 로그인 화면이 나타나도록 코드를 작성해보겠습니다

 

코드는 Form1.cs 파일에 작성합니다.

 

 

 

이렇게 이벤트 함수의 동작을 작성 할 수 있습니다.
코드를 더 작성하도록 하겠습니다

 

OnEventConnect 이벤트 함수로 전달되는 정보는 AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent 타입의 변수를 통해서 접근 할 수 있습니다.
저는 매개변수의 이름을 e라고 지었습니다.
제가 만약 e.nErrCode 를 출력한다면, 정상적으로 로그인이 성공 했을때는 0이 출력 될 것입니다.
그러면 이제 e.nErrCode 가 0인 경우에 사용자 정보를 화면에 보여주도록 하겠습니다

 

아래 코드는 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
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();
            LoginButton.Click += loginButton;
            axKHOpenAPI1.OnEventConnect += onEventConnect;
            
        }
        public void loginButton(object sender , EventArgs e)
        {
            axKHOpenAPI1.CommConnect();
        }
        public void onEventConnect(object sender,AxKHOpenAPILib._DKHOpenAPIEvents_OnEventConnectEvent e)
        {
            if (e.nErrCode==0)//if문으로 e.nErrCode가 0인지 검사해서 로그인이 잘 되었는지 체크합니다
            {
                string 계좌목록 = axKHOpenAPI1.GetLoginInfo("ACCLIST").Trim();
                string[] 사용자계좌 = 계좌목록.Split(';');//계좌목록은 ';'문자로 분리된 문자열입니다.
//예를 들어서 123456;456789;789456 과 같은 문자열을 ';'를 기준으로 분리하는 것입니다.
                for (int i = 0; i < 사용자계좌.Length; i++)
                {
                    AccountList.Items.Add(사용자계좌[i]);//분리된 계좌를 ComboBox에 추가합니다.
                }
                string 사용자id = axKHOpenAPI1.GetLoginInfo("USER_ID");
                UserId.Text = 사용자id;//사용자 id를 UserId 라벨에 추가합니다.
 
                string 사용자이름 = axKHOpenAPI1.GetLoginInfo("USER_NAME");
                UserName.Text = 사용자이름;//사용자 이름을 UserName 라벨에 추가합니다.
 
                string 접속서버구분 = axKHOpenAPI1.GetLoginInfo("GetServerGubun");
                GetServer.Text = 접속서버구분;//접속서버 구분 숫자를 GetServer 라벨에 추가합니다.
            }
        }
    }
}
 
 
cs

 

KOA Studio를 참고해서 GetLoginInfo 함수의 매개변수를 작성합니다.
매개변수를 작성한다는 말은 코드에서처럼
GetLoginInfo()의 괄호 안에 "ACCOUNT_CNT" 같은 특정한 문자나 숫자 값을 집어 넣는다는 말입니다.
GetLoginInfo("ACCOUNT_CNT") 이렇게 말입니다.

 

함수를 호출하면 사용자 정보를 얻을 수 있습니다.
그러면 이제 작성한 코드를 가지고 프로그램을 실행해보도록 하겠습니다

사용자이름, 아이디 , 접속서버구분 같은 다른 사용자 정보도 확인이 가능합니다.


필요한 글이나 영상이 있으시다면 아래 홈페이지에 올려주세요

https://www.contents.click/


질문은 아래 메일로 보내주세요

jswoo030@gmail.com


댓글