오늘은 xingAPI를 사용한 자동매매 프로그램을 만들기 위한 기본 작업들에 대한 포스팅을 하려 한다. 

이 내용은 이베스트 투자증권의 xingAPI 소개자료에도 동일하게 소개되어 있는 내용이지만, 엑셀 VBA를 사용한 개발 소스로 정리되어 있다. 

 

내가 정리하는 내용은 C# COM 방식의 xingAPI 개발 방법이다. 

 


앞서 포스팅한 내용처럼 이베스트 xingAPI의 경우, HTS 서버 연결과 HTS 로그인이 별개로 동작한다. 

2020/07/08 - [Trading] - [Trading] HTS 로그인 설계, 구현

 

[Trading] HTS 로그인 설계, 구현

이베스트에서 제공하는 XingAPI에 의한 로그인 기능은 키움API에서 제공하는 기능과는 사뭇 다르다. 먼저 키움API의 경우에는 로그인 할때 키움 HTS에서 로그인하는 것과 같은 방식을 제공한다. 로��

brandon-dev.tistory.com

때문에 이베스트 투자증권 보유계좌를 활요하기 위해서는 아래의 단계를 거쳐야 한다. 

 

[서버연결] - [로그인] - [보유계좌선택]

 

위의 단계가 완료된 이후부터 종목을 검색하고, 내가 가진 종목 확인을 하고, 주식 주문을 할 수 있다. 

자동매매 프로그램 시작의 3단계를 간단한 테스트 프로그램으로 구현해보자.

 

xingAPI Test 프로그램 시작 화면

 

테스트 프로그램이므로 화면 구성은 매우 간단하다. 

서버 연결을 할 수 있는 버튼, 아이디/비밀번호를 입력할 수 있는 텍스트 박스와 로그인할 수 있는 버튼, 로그인 후 불러오기가 완료된 보유 계좌 목록 캄보 박스와 사용할 계좌를 선택할 수 있는 버튼.

 

그리고 이후 포스팅하게 될 [단일데이터 조회]용 자산현황 조회 버튼과 [반복데이터 조회]용 계좌잔고 조회 버튼이 있다.

실제로 xingAPI를 이용한 자동매매 프로그램을 설계해보면 위의 기능들외의 데이터 조회 기능을 굳이 사용하지 않아도 충분하다는 것을 깨달을 것이다.

 

아래는 계좌 선택까지의 Full 소스다.

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;
using XA_SESSIONLib;
using XA_DATASETLib;

namespace xingAPI_Test
{
    public partial class xingAPI_Test : Form
    {
        // Global 변수
        bool gIsConnHTS = false;
        string gAccount = string.Empty;

        // xingAPI Session 클래스 선언
        XASessionClass myXASessionClass;

        public xingAPI_Test()
        {
            InitializeComponent();
            // xingAPI Session 객체 생성
            myXASessionClass = new XASessionClass();
        }

        // Form Load될 때 초기화
        private void xingAPI_Test_Load(object sender, EventArgs e)
        {
            Realtime_Log.Items.Add("====== xingAPI Test 프로그램 시작 ======");
            // HTS 로그인 핸들러 등록
            myXASessionClass._IXASessionEvents_Event_Login += new XA_SESSIONLib._IXASessionEvents_LoginEventHandler(myXASessionClass_Login);
        }
        
        // HTS 서버 접속
        private void Btn_Conn_Server_Click(object sender, EventArgs e)
        {
            string serverType = "hts.ebestsec.co.kr";
            gIsConnHTS = myXASessionClass.ConnectServer(serverType, 20001); // 20001은 HTS 서버 고정 Port 값
            if (gIsConnHTS == true)
            {
                Realtime_Log.Items.Add("이베스트 실투자 서버 접속 완료");
            }
            else // 연결 실패했을 경우
            {
                int ErrCode = myXASessionClass.GetLastError();
                var ErrMsg = myXASessionClass.GetErrorMessage(ErrCode);
                string err_log = String.Format("[서버연결] ERR - {0}({1})", ErrMsg, ErrCode);
            }
        }

        // HTS 서버 로그인
        private void Btn_Login_Click(object sender, EventArgs e)
        {
            if (gIsConnHTS == true) // HTS 서버 로그인은 서버 접속이 완료된 이후에만 가능.
            {
                bool reqLogin = ((XA_SESSIONLib.IXASession)myXASessionClass).Login(TB_User_ID.Text, TB_User_Passwd.Text, 
                    "", 0, false); // 세번째 인자는 공인인증비번을 입력하는 칸이지만 보안을 위해 입력 받지 않고 보안 프로그램에서 입력하는 것이 좋다.
                // reqLogin의 결과 값은 로그인 완료 여부가 아닌, 서버에 로그인 요청을 전송 완료 여부이다. 때문에 Login Handler 함수를
                // 별도 추가하여 요청한 로그인 정보가 정상적으로 성공했는지 확인해야한다.
                if (reqLogin == true)
                {
                    Realtime_Log.Items.Add("HTS 로그인 요청 완료");
                }
                else
                {
                    Realtime_Log.Items.Add("HTS 로그인 요청 실패");
                    int ErrCode = myXASessionClass.GetLastError();
                    var ErrMsg = myXASessionClass.GetErrorMessage(ErrCode);
                    string err_log = String.Format("[로그인] ERR - {0}({1})", ErrMsg, ErrCode);
                }
            }
        }

        // HTS 서버 로그인 결과
        void myXASessionClass_Login(string code, string msg)
        {
            if (code == "0000") // code 0000은 성공을 의미
            {
                Realtime_Log.Items.Add("HTS 로그인 완료");

                // 보유 계좌 정보 Loading
                int AccountCount = myXASessionClass.GetAccountListCount();
                for (int i = 0; i < AccountCount; i++)
                {
                    string AccountNo = string.Empty;
                    string AccountName = string.Empty;
                    string AccountDetailName = string.Empty;
                    string AccountNickName = string.Empty;
                    string AccountFinal = string.Empty;

                    AccountNo = myXASessionClass.GetAccountList(i);
                    AccountName = myXASessionClass.GetAccountName(AccountNo);
                    AccountDetailName = myXASessionClass.GetAcctDetailName(AccountNo);
                    AccountNickName = myXASessionClass.GetAcctDetailName(AccountNo);
                    AccountFinal = AccountNo + "(" + AccountName + ")";
                    Realtime_Log.Items.Add(AccountFinal);
                    CB_Account_List.Items.Add(AccountNo);
                }
                Realtime_Log.Items.Add("보유 계좌 정보 Loading 완료");
            }
        }

        // 보유 계좌 선택
        private void Btn_Input_Account_Click(object sender, EventArgs e)
        {
            if (CB_Account_List.Text != "")
            {
                gAccount = CB_Account_List.Text;
                string str_log = String.Format("[보유계좌선택] {0} 선택완료.", gAccount);
                Realtime_Log.Items.Add(str_log);
            }
        }

        // 자산현황 조회 [단일데이터]
        private void Btn_Get_Balance_Click(object sender, EventArgs e)
        {




        }

        // 계좌잔고 조회 [반복데이터]
        private void Btn_Get_Items_Click(object sender, EventArgs e)
        {

        }
    }
}

 

이제 한 단계씩 프로그램을 실행해 보자.

 

STEP 1. 서버 연결

에러 발생 없이 정상적으로 이베스트 HTS 실투자 서버에 접속했다.

 

STEP 2. 로그인

아이디와 비밀번호를 입력하고 로그인을 누르면, HTS 로그인 요청이 완료되었다는 문구와 함께 공인인증서 비밀번호를 입력하는 팝업이 하나 뜬다. 많은 xingAPI 자동매매 프로그램들이 아이디/비밀번호와 함께 공인인증서 비밀번호를 입력하도록 만들어져 있는 걸 보았는데 이렇게 보안 프로그램에서 입력하는 것이(조금 번거로울 수 있겠지만...) 더 안전하겠다.

 

STEP 3. 보유 계좌 선택

로그인이 성공하면 보유계좌 목록에 보유한 계좌들이 저장되게 되고, 그중에서 하나를 골라 선택 버튼을 누르면 비로소 해당 계좌에 대해 자동 매매를 진행할 준비가 완료된다.

 

 

이 이후부터는 xingAPI의 TR들을 적절히 조합하여 자신만의 자동 매매 프로그램을 만들어 적용하면 된다.

다음은 선택한 계좌의 자산현황을 조회하는 기능으로 xingAPI의 [단일데이터 조회] 기능을 구현해본다.

Posted by [ 브랜든 ]
,