XingAPI 주식 주문 프로그램

openaitrading logo1 ver1

이베스트 투자증권 XingAPI로 주식 주문 프로그램 구현을 설명한다. 알고리즘을 통해 매매 가격과 시점이 결정되었다면 본 주식 주문 코드를 수행하여 실제 주식의 매매를 수행 할 수 있다. 여담으로 XingAPI 등록을 한 이후, 계속해서 등록을 유지하려면 Xing API를 통한 주식 거래 실적이 있어야 한다. 구입하기 원하는 주식을 본 코드를 이용해서 구입하면 등록을 유지할 수 있다.

프로그램 구성

  1. 로그인
  2. 주식 종목 현재가 읽어오기
  3. 주문

로그인

id와 passwd, cert_passwd는 본인의 것을 입력하고 수행하면 된다. 로그인이 완료되면 계좌의 번호가 출력된다.

주식 종목 현재가 읽어오기

구입하려는 주식의 현재 장중 가격을 읽어와야 가지고 있는 돈으로 몇 주를 구입할 지 결정 할 수 있다. T1101 주식 현재가 호가 조회 쿼리를 이용하여 가능하다. 구체적인 코드는 다음과 같다.

주문

주문에는 CSPTA00600 쿼리를 사용한다. 이전의 T1101 쿼리와 이름만 다를 뿐 사용하는 방법은 동일하다. 이전의 T1101 쿼리는 입력으로 shcode만 필요로 했다. CSPTA00600의 경우 10개의 입력이 필요하다. 각 입력의 세부 내용은 xingAPI DevCenter에서 확인이 가능하다.

전체 코드는 다음과 같다.

import win32com.client as w32
import pythoncom

class XASessionEventHandler:
    login_state = 0

    def OnLogin(self, code, msg):
        if code == "0000":
            print("login successed")
            XASessionEventHandler.login_state = 1
        else:
            print("login failed")

id = ""
passwd = "" \
         ""
cert_passwd = ""

instXASession = w32.DispatchWithEvents("XA_Session.XASession", XASessionEventHandler)
instXASession.ConnectServer("hts.ebestsec.co.kr", 20001)
instXASession.Login(id, passwd, cert_passwd, 0, 0)

while XASessionEventHandler.login_state == 0:
    pythoncom.PumpWaitingMessages()

# getting acount list
num_account = instXASession.GetAccountListCount()
for i in range(num_account):
    account = instXASession.GetAccountList(i)
    print(account)

class XAQueryEventHandlerT1101:
    query_state = 0
    offerho1 = 0
    offerho2 = 0
    offerrem1 = 0
    offerrem2 = 0
    bidho1 = 0
    bidho2 = 0
    bidrem1 = 0
    bidrem2 = 0

    def OnReceiveData(self, code):
        XAQueryEventHandlerT1101.query_state = 1

        self.offerho1 = self.GetFieldData("t1101OutBlock", "offerho1", 0)
        self.offerho2 = self.GetFieldData("t1101OutBlock", "offerho2", 0)
        self.offerrem1 = self.GetFieldData("t1101OutBlock", "offerrem1", 0)
        self.offerrem2 = self.GetFieldData("t1101OutBlock", "offerrem2", 0)
        self.bidho1 = self.GetFieldData("t1101OutBlock", "bidho1", 0)
        self.bidho2 = self.GetFieldData("t1101OutBlock", "bidho2", 0)
        self.bidrem1 = self.GetFieldData("t1101OutBlock", "bidrem1", 0)
        self.bidrem2 = self.GetFieldData("t1101OutBlock", "bidrem2", 0)

        print(self.offerho1, self.offerho2, self.bidho1, self.bidho2)
        print(self.offerrem1, self.offerrem2, self.bidrem1, self.bidrem2)

instXAQueryT1101 = w32.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEventHandlerT1101)
instXAQueryT1101.ResFileName = "C:\\eBest\\xingAPI\\Res\\T1101.res"

shcode = "047810" # 한국항공우주
# shcode = "020560" # 아시아나
# shcode = "031330" # 에스에이엠티
# shcode = "034220" # lg디스플레이
# shcode = "056360" # 코위버
# shcode = "068270" # 셀트리온
# shcode = "086060" # 진바이오텍
# shcode = "136480" # 하림
# shcode = "151910" # 나노스
# shcode = "217270" # 넵튠
# shcode = "000660" # sk하이닉스
# shcode = "035720" # 카카오
money = 500000

instXAQueryT1101.SetFieldData("t1101InBlock", "shcode", 0, shcode)
instXAQueryT1101.Request(0)

while XAQueryEventHandlerT1101.query_state == 0:
    pythoncom.PumpWaitingMessages()

price = instXAQueryT1101.offerho1
possible_stock_count = money / int(price)
possible_stock_count = int(possible_stock_count)

# if possible_stock_count < instXAQueryT1101.offerrem1:

print(price, possible_stock_count)


class XAQueryEventHandlerCSPAT00600:
    query_state = 0

    def OnReceiveData(self, code):
        XAQueryEventHandlerCSPAT00600.query_state = 1

instXAQueryCSPAT00600 = w32.DispatchWithEvents("XA_DataSet.XAQuery", XAQueryEventHandlerCSPAT00600)
instXAQueryCSPAT00600.ResFileName = "C:\\eBest\\xingAPI\\Res\\CSPAT00600.res"

instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "AcntNo", 0, str(account))
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "InptPwd", 0, '')
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "IsuNo", 0, shcode)
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "OrdQty", 0, possible_stock_count)
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "OrdPrc", 0, price)
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "BnsTpCode", 0, "2")
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "OrdprcPtnCode", 0, "00")
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "MgntrnCode", 0, "000")
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "LoanDt", 0, "0")
instXAQueryCSPAT00600.SetFieldData("CSPAT00600InBlock1", "OrdCndiTpCode", 0, "0")

instXAQueryCSPAT00600.Request(0)

while XAQueryEventHandlerCSPAT00600.query_state == 0:
   pythoncom.PumpWaitingMessages()

rec_cnt = instXAQueryCSPAT00600.GetFieldData("CSPAT00600OutBlock1", "RecCnt", 0)
acnt_no = instXAQueryCSPAT00600.GetFieldData("CSPAT00600OutBlock1", "AcntNo", 0)


print(rec_cnt, acnt_no)

이 글이 유용하셨다면 아래의 도네리카노를 통해 후원 부탁드립니다.

2 댓글

  1. 키노장 응답

    안녕하세요.
    책을 공부중에

    while XAQueryEventHandlerCSPAT00600.query_state == 0:
    pythoncom.PumpWaitingMessages()

    의 코드에서 다음단계로 진행이 되지 않습니다.
    현재 모의계좌에서 테스트하고 있었어요.

    XAQueryEventHandlerCSPAT00600.query_state 의 값을 print해보면 ‘-39’가 출력됩니다.

    혹시 어떻게하면 이문제를 풀수 있을까요?

    감사합니다.^^

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다