티스토리 뷰

XingAPI/개발가이드

단일 데이터 조회

히처리 2018. 3. 15. 23:30

이 포스트는 "로그인하기"를 이어서 설명한다. xingAPI에서 데이터 조회는 미리 정해진 형식의 입력값을 서버로 전송하고 서버로부터 데이터를 받는 것을 의미한다. 한번의 전송으로 한번의 결과값을 받는다. 현재가를 예로 들면 종목 코드를 서버에 전송하면 그 당시의 현재가를 결과값으로 서버로부터 데이터를 받게 된다. 일반 데이터에 사용되는 용어와 개념은 다음과 같다.

 

TR (Transaction)

xingAPI에서 TR은 서버로부터 데이터를 주고 받는 행위를 의미한다.

 

TR Code

TR Code는 어떤 정보를 주고 받을 지를 정하는 값이다. TR Code는 5자리와 10자리가 2종류가 있다. 자세한 내용은 DevCenter를 이용하면 된다. 예로 들어 t1101은 현재가 등의 종목 시세 데이터를 가져오는 TR코드이다.

 

TR Layout

TR Code를 사용하기 위해서 TR Code마다 미리 정해진 입력값과 출력값이 있다. 이렇게 미리 정해진 값들을 TR Layout이라고 한다. TR Layout에는 크게 입력값인 InBlock과 출력값인 OutBlock이 있다.

 

RES

RES는 TR Layout을 COM 버전에서 인식할 수 있는 형식으로 변경한 구조를 의미한다. COM 버전은 RES를 입력해 주어야 동작이 된다. RES파일은 TR Layout을 파일로 저장한 것을 의미한다.

 

단일 데이터 조회 과정

 

 

단일 데이터 조회

데이터를 가져오기 위해서는 XAQuery 객체를 사용한다. XAQuery 객체 하나당 하나의 TR Code를 등록할 수 있다. 여기서는 t1101을 이용하여 필요한 정보를 얻는 예제를 만들어 본다.

 

1. 디자인영역에 다음과 같이 Label, TextBox, Button을 추가하고 속성을 수정한다.

 

 

2. "t1101 조회"버튼을 더블클릭해서 클릭이벤트 코드를 생성한다.

 

3. 아래와 같이 코드를 작성한다.

using System;
using System.Windows.Forms;
using XA_SESSIONLib;
using XA_DATASETLib;

namespace XingAPI
{
    public partial class Form1 : Form
    {
        XASessionClass session;
        XAQueryClass t1101;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            session = new XASessionClass();
            session._IXASessionEvents_Event_Login += XASession_Login;

            t1101 = new XAQueryClass();
            t1101.ResFileName = @"C:\eBEST\xingAPI\Header\t1101.res";
            t1101.ReceiveData += t1101ReceiveData;

            severTypeComboBox.SelectedIndex = 0;
        }

        private void t1101ReceiveData(string trCode)
        {
            var name = t1101.GetFieldData("t1101OutBlock", "hname", 0);
            listBox.Items.Add(name);
            var price = t1101.GetFieldData("t1101OutBlock", "price", 0);
            listBox.Items.Add(price);
        }

        private void XASession_Login(string code, string msg)
        {
            if (code == "0000")
            {
                listBox.Items.Add("로그인 성공");
                loginButton.Enabled = false;
                t1101Button.Enabled = true;
            }
            else
            {
                MessageBox.Show("로그인 실패[" + code + "]: " + msg);
            }
        }

        private void loginButton_Click(object sender, EventArgs e)
        {
            string serverType;
            if (severTypeComboBox.SelectedIndex == 0)
            {
                // 실서버
                serverType = "hts.ebestsec.co.kr";
            }
            else
            {
                // 모의투자
                serverType = "demo.ebestsec.co.kr";
            }

            bool connectResult;
            connectResult = session.ConnectServer(serverType, 20001);
            if (connectResult)
            {
                listBox.Items.Add(serverType);
                listBox.Items.Add("서버 접속 성공");
            }
            else
            {
                var errCode = session.GetLastError();
                var errMsg = session.GetErrorMessage(errCode);
                MessageBox.Show(errMsg);
                return;
            }

            var id = idTextBox.Text;
            var pwd = pwdTextBox.Text;
            var certPwd = certPwdTextBox.Text;

            bool loginResult;
            loginResult = session.Login(id, pwd, certPwd, 0, false);
            if (!loginResult)
            {
                MessageBox.Show("로그인 서버전송 실패");
                return;
            }
        }

        private void t1101Button_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1101.SetFieldData("t1101InBlock", "shcode", 0, shcode);

            var result = t1101.Request(false);

            if (result > 0)
            {
                listBox.Items.Add("+ t1101 조회 요청 성공");
            }
            else
            {
                listBox.Items.Add("- t1101 조회 요청 실패");
            }
        }
    }
}

 

4. F5를 눌러서 프로그램을 실행하여 보자.

 

 

코드 설명

using XA_DATASETLib;

데이터를 조회하기 위해서 XAQueryClass가 필요하다. XAQueryClass는 XA_DATASETLib네임스페이스에 있으니 using한다.

    public partial class Form1 : Form
    {
        XASessionClass session;
        XAQueryClass t1101;

XAQueryClass는 TR당 하나가 필요하다. 지금은 t1101에 사용할 TR이 하나 필요하므로 멤버변수로 선언한다.

        private void Form1_Load(object sender, EventArgs e)
        {
            session = new XASessionClass();
            session._IXASessionEvents_Event_Login += XASession_Login;

            t1101 = new XAQueryClass();
            t1101.ResFileName = @"C:\eBEST\xingAPI\Header\t1101.res";
            t1101.ReceiveData += t1101ReceiveData;

            severTypeComboBox.SelectedIndex = 0;
        }

form1의 로드이벤트에서 t1101의 객체를 생성하고, RES파일을 추가하고, 서버로 호출될 ReceiveData() 이벤트 함수도 추가한다. RES파일은 아래와 같이 DevCenter에서 TR을 선택하고 RES를 저장하면 "C:\eBEST\xingAPI\Header\"에 저장이 된다. (xingAPI설치 장소에 따라서 달라진다.)

COM버전으로 TR을 하기 위해서는 꼭 RES파일이 있으니 RES파일을 다운받아서 조회를 해야 한다.

        private void t1101Button_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1101.SetFieldData("t1101InBlock", "shcode", 0, shcode);

            var result = t1101.Request(false);

            if (result > 0)
            {
                listBox.Items.Add("+ t1101 조회 요청 성공");
            }
            else
            {
                listBox.Items.Add("- t1101 조회 요청 실패");
            }
        }

"t1101 조회"버튼을 클릭하면 shcodeTextBox로 주식코드(shcode)를 얻어서 t1101.SetFieldData()로 TR 입력값을 설정한다. t1101의 입력값을 "shcode"만 필요하다.

 

 

TR 입력값 설정이 완료되면 Request를 이용해서 서버로 조회를 요청한다.

 

        private void t1101ReceiveData(string trCode)
        {
            var name = t1101.GetFieldData("t1101OutBlock", "hname", 0);
            listBox.Items.Add(name);
            var price = t1101.GetFieldData("t1101OutBlock", "price", 0);
            listBox.Items.Add(price);
        }

t1101ReceiveData()는 서버로 데이터 요청을 하고, 서버로부터 결과값을 오면 호출되는 콜백함수이다. t1101의 결과값으로는 많은 정보가 있다. DevCenter를 이용하여 원하는 결과값을 얻을 수 있다. 정보를 얻기 위해서는 GetFeildData()를 이용한다. GetFeildData()에 전달되는 문자열는 대문자 소문자를 잘 구별해서 전달해야 한다. "hName"처럼 소문자 n을 대문자 N로 입력하면 결과값을 없을 수 없게 된다.

 

 

'XingAPI > 개발가이드' 카테고리의 다른 글

연속 데이터 조회  (0) 2018.03.18
반복 데이터 조회 (Occures)  (0) 2018.03.18
로그인하기  (0) 2018.03.15
서버 접속하기  (0) 2018.03.15
COM을 등록하는 방법  (1) 2018.03.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함