티스토리 뷰

일반적인 조회는 요청(Request)시점에서의 데이터를 전송해 주므로 그 이후 변경된 데이터를 받지 못한다. 하지만 실시간 데이터 조회의 경우에는 요청 시점 이후에 데이터가 변경이 되면 그때 데이터를 전송해 준다. 요청을 해제하기 전까지 데이터가 변경이 될 때마다 데이터를 전송해 준다.

실시간 데이터 조회는 요청 시점 이후에 데이터가 변경되어야만 데이터를 보내기 때문에 요청 시점에서의 데이터는 전송해 주지 않는다. 그러므로 주식현재가를 구성하기 위해서는 단일 조회로 요청 시점의 데이터를 가져온 후에 실시간 데이터를 요청하여 그 이후 데이터를 실시간으로 받아야 한다.

 

실시간 데이터 조회

이 예제는 "연속 데이터 조회"를 이어서 프로그래밍한다. 여기서는 현재가를 실시간으로 얻을 수 있게, [S3_] KOSPI 체결를 예제로 작성하였다.

 

1. 디자인 영역에 버튼을 추가하고 다음과 같이 속성을 수정한다.

 

2. "실시간 데이터 조회"버튼과 "실시간 데이터 조회 중지"버튼을 더블클릭하여 클릭이벤트 소스를 생성한다.

 

3. 아래와 같이 코드를 수정한다.

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

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

        string t1301CtsTime;

        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;

            t1301Occurs = new XAQueryClass();
            t1301Occurs.ResFileName = @"C:\eBEST\xingAPI\Header\t1301.res";
            t1301Occurs.ReceiveData += t1301ReceiveData;

            s3 = new XARealClass();
            s3.ResFileName = @"C:\eBEST\xingAPI\Res\S3_.res";
            s3.ReceiveRealData += s3ReceiveData;

            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 t1301ReceiveData(string trCode)
        {
            var count = t1301Occurs.GetBlockCount("t1301OutBlock1");

            string str;
            for (int index = 0; index < count; ++index)
            {
                str = "";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "chetime", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "price", index);
                str += " ";
                str += t1301Occurs.GetFieldData("t1301OutBlock1", "volume", index);
                listBox.Items.Add(str);
            }

            t1301CtsTime = t1301Occurs.GetFieldData("t1301OutBlock", "cts_time", 0);
            if (t1301CtsTime == "")
            {
                t1301CtsButton.Enabled = false;
            }
            else
            {
                t1301CtsButton.Enabled = true;
            }
        }

        private void s3ReceiveData(string trCode)
        {
            var time = s3.GetFieldData("OutBlock", "chetime");
            var shcode = s3.GetFieldData("OutBlock", "shcode");
            var price = s3.GetFieldData("OutBlock", "price");

            listBox.Items.Add(string.Format("{0} {1} {2}", time, shcode, price));
        }

        private void XASession_Login(string code, string msg)
        {
            if (code == "0000")
            {
                listBox.Items.Add("로그인 성공");
                loginButton.Enabled = false;
                t1101Button.Enabled = true;
                t1301OccursButton.Enabled = true;
                realStartButton.Enabled = true;
                realStopButton.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 조회 요청 실패");
            }
        }

        private void t1301OccursButton_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            t1301Occurs.SetFieldData("t1301InBlock", "shcode", 0, shcode);

            var result = t1301Occurs.Request(false);

            if (result < 0)
            {
                listBox.Items.Add("- t1301Occurs 조회 요청 실패");
            }
        }

        private void t1301CtsButton_Click(object sender, EventArgs e)
        {
            t1301Occurs.SetFieldData("t1301InBlock", "cts_time", 0, t1301CtsTime);
            var result = t1301Occurs.Request(true);

            if (result < 0)
            {
                listBox.Items.Add("- t1301 연속 조회 요청 실패");
                t1301CtsButton.Enabled = false;
            }
        }

        private void realStartButton_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            s3.SetFieldData("InBlock", "shcode", shcode);
            s3.AdviseRealData();
        }

        private void realStopButton_Click(object sender, EventArgs e)
        {
            s3.UnadviseRealData();
        }
    }
}

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

 

코드 설명

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

실시간 데이터 조회를 위해서 XARealClass를 s3 멤버변수를 선언한다.

        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;

            t1301Occurs = new XAQueryClass();
            t1301Occurs.ResFileName = @"C:\eBEST\xingAPI\Header\t1301.res";
            t1301Occurs.ReceiveData += t1301ReceiveData;

            s3 = new XARealClass();
            s3.ResFileName = @"C:\eBEST\xingAPI\Res\S3_.res";
            s3.ReceiveRealData += s3ReceiveData;

            severTypeComboBox.SelectedIndex = 0;
        }

s3객체를 생성하고 RES파일을 등록하고 ReceiveData를 추가한다.

        private void realStartButton_Click(object sender, EventArgs e)
        {
            var shcode = shcodeTextBox.Text;
            s3.SetFieldData("InBlock", "shcode", shcode);
            s3.AdviseRealData();
        }

"실시간 데이터 조회 시작" 버튼을 누르면 주식코드를 .SetFeildData()로 설정하고, .AdviseRealData()로 등록한다. 다른 주식코드도 여러개 등록할 수 있다.

        private void s3ReceiveData(string trCode)
        {
            var time = s3.GetFieldData("OutBlock", "chetime");
            var shcode = s3.GetFieldData("OutBlock", "shcode");
            var price = s3.GetFieldData("OutBlock", "price");

            listBox.Items.Add(string.Format("{0} {1} {2}", time, shcode, price));
        }

실시간 데이터가 변화가 생기면 ReceiveData로 등록된 메서드인 s3ReceiveData()메서드가 서버로 인해서 호출된다. .GetFeidlData()로 데이터를 얻을 수 있다.

        private void realStopButton_Click(object sender, EventArgs e)
        {
            s3.UnadviseRealData();
            // s3.UnadviseRealDataWithKey("shcode");
        }

"실시간 데이터 조회 중지"버튼을 누르면 s3에 등록된 모든 실시간 데이터 요청을 해지한다. 만일 특정 주식코드만 해지하고 싶다면 .UnadviseRealDataWithKey()메서드를 이용하면 된다.

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

RES 파일 저장 위치에 대하여...  (0) 2018.03.18
연속 데이터 조회  (0) 2018.03.18
반복 데이터 조회 (Occures)  (0) 2018.03.18
단일 데이터 조회  (0) 2018.03.15
로그인하기  (0) 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
글 보관함