이베스트 투자증권 XingAPI로 주식 주문 프로그램 구현을 설명한다. 알고리즘을 통해 매매 가격과 시점이 결정되었다면 본 주식 주문 코드를 수행하여 실제 주식의 매매를 수행 할 수 있다. 여담으로 XingAPI 등록을 한 이후, 계속해서 등록을 유지하려면 Xing API를 통한 주식 거래 실적이 있어야 한다. 구입하기 원하는 주식을 본 코드를 이용해서 구입하면 등록을 유지할 수 있다.
프로그램 구성
- 로그인
- 주식 종목 현재가 읽어오기
- 주문
로그인
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)
이 글이 유용하셨다면 아래의 도네리카노를 통해 후원 부탁드립니다.
안녕하세요.
책을 공부중에
while XAQueryEventHandlerCSPAT00600.query_state == 0:
pythoncom.PumpWaitingMessages()
의 코드에서 다음단계로 진행이 되지 않습니다.
현재 모의계좌에서 테스트하고 있었어요.
XAQueryEventHandlerCSPAT00600.query_state 의 값을 print해보면 ‘-39’가 출력됩니다.
혹시 어떻게하면 이문제를 풀수 있을까요?
감사합니다.^^
모의 계좌에서는 해보질 않아서 한번 해보겠습니다.