대신증권 파이썬 api
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
- 1 주식 현재가 조회/실시간
- 2 주식 일자별 조회(다음)
- 3 주식 현재가 조회
- 4 종목정보 구하는 예제
- 5 주식차트 조회(일간/주간/월간/분간/틱) 예제
- 6 지수옵션 최근월물 시세 조회(실시간 포함)
- 7 매매입체분석(투자주체별현황) 예제
- 8 해외선물 현재가/5차 호가 조회(실시간 업데이트 포함)
- 9 주식 현재가(10차호가/시간대별/일자별) 구현하기 예제
- 10 주식 미체결 조회 및 실시간 미체결 업데이트/취소주문/일괄 취소 예제...
- 11 주식 현재가 10차 호가 화면 구현하기
- 12 주식 예약 매수/매도/취소/조회 예제
- 13 주식/ELW/선물/옵션/업종 전 종목 시세 조회 예제
- 14 시세 연속 조회 제한 확인용 예제
- 15 VI 발동 종목에 대한 현재가 변화 추이 감시 예제
- 16 주식 주문 체결 실시간 처리 예제
- 17 주식 잔고 종목 조회 및 실시간 현재가 업데이트
- 18 당일 상승률 상위 200 종목 실시간 통신 예제
- 19 MACD 차트지표 계산(실시간)
- 20 차트 데이터 구하는 예제
- 21 주식 현금 매도주문
- 22 주식 현금 매수주문
- 23 주식 복수종목 조회/실시간
- 24 주식 복수종목 실시간 등록/해지
- 25 ETF NAV , ETN IIV 실시간 수신 예제
- 26 데이터 요청 방법 2가지 BlockRequest 와 Request 방식 비교 예제
- 27 주식 5분 차트 MACD 신호
- 28 종목검색 조회 및 실시간 감시 예제
- 29 선물 현재가/시간대별/일자별/주문/잔고/미체결 예제
- 30 투자자별 매매 종합 예제
- 31 전종목 시가총액 구하기 예제
- 32 차트 지표 계산(MACD/RSI 등)
- 33 선물 분 차트 그리기(matplotlib 이용)
- 34 체결기준 주식 당일 매매 손익 예제
- 35 실시간 분차트 데이터 만들기
- 36 주식 잔고 실시간 조회(현재가 및 주문 체결 실시간 반영)
- 37 해외선물 주문 예제
- 38 특징주 포착(뉴스/공시/차트/외국인 신호) 예제
- 39 보유 주식 잔고 일괄 매도 예제
- 40 주식 IOC/FOK 주문 테스트 예제
- 41 종목검색 서비스를 이용하여 예제 전략 조건 조회하기 예제
- 42 종목별 투자자 매매동향 (잠정)데이터
- 43 주식 분할 주문 예제
- 44 해외선물 잔고(미결제약정)과 실시간 주문체결 처리 예제
1 주식 현재가 조회/실시간[편집]
2 주식 일자별 조회(다음)[편집]
3 주식 현재가 조회[편집]
4 종목정보 구하는 예제[편집]
5 주식차트 조회(일간/주간/월간/분간/틱) 예제[편집]
6 지수옵션 최근월물 시세 조회(실시간 포함)[편집]
7 매매입체분석(투자주체별현황) 예제[편집]
8 해외선물 현재가/5차 호가 조회(실시간 업데이트 포함)[편집]
9 주식 현재가(10차호가/시간대별/일자별) 구현하기 예제[편집]
10 주식 미체결 조회 및 실시간 미체결 업데이트/취소주문/일괄 취소 예제...[편집]
11 주식 현재가 10차 호가 화면 구현하기[편집]
import sys
from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtCore import pyqtSlot
import win32com.client
# cp object
g_objCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
g_objCpStatus = win32com.client.Dispatch("CpUtil.CpCybos")
g_objCpTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
# 현재가 정보 저장 구조체
class stockPricedData:
def __init__(self):
self.dicEx = {ord('0'): "동시호가/장중 아님", ord('1'): "동시호가", ord('2'): "장중"}
self.code = ""
self.name = ""
self.cur = 0 # 현재가
self.diff = 0 # 대비
self.diffp = 0 # 대비율
self.offer = [0 for _ in range(10)] # 매도호가
self.bid = [0 for _ in range(10)] # 매수호가
self.offervol = [0 for _ in range(10)] # 매도호가 잔량
self.bidvol = [0 for _ in range(10)] # 매수호가 잔량
self.totOffer = 0 # 총매도잔량
self.totBid = 0 # 총매수 잔량
self.vol = 0 # 거래량
self.baseprice = 0 # 기준가
# 예상체결가 정보
self.exFlag= ord('2')
self.expcur = 0 # 예상체결가
self.expdiff = 0 # 예상 대비
self.expdiffp = 0 # 예상 대비율
self.expvol = 0 # 예상 거래량
self.objCur = CpPBStockCur()
self.objOfferbid = CpPBStockBid()
def __del__(self):
self.objCur.Unsubscribe()
self.objOfferbid.Unsubscribe()
# 전일 대비 계산
def makediffp(self):
lastday = 0
if (self.exFlag == ord('1')): # 동시호가 시간 (예상체결)
if self.baseprice > 0 :
lastday = self.baseprice
else:
lastday = self.expcur - self.expdiff
if lastday:
self.expdiffp = (self.expdiff / lastday) * 100
else:
self.expdiffp = 0
else:
if self.baseprice > 0 :
lastday = self.baseprice
else:
lastday = self.cur - self.diff
if lastday:
self.diffp = (self.diff / lastday) * 100
else:
self.diffp = 0
def getCurColor(self):
diff = self.diff
if (self.exFlag == ord('1')): # 동시호가 시간 (예상체결)
diff = self.expdiff
if (diff > 0):
return 'color: red'
elif (diff == 0):
return 'color: black'
elif (diff < 0):
return 'color: blue'
# CpEvent: 실시간 이벤트 수신 클래스
class CpEvent:
def set_params(self, client, name, rpMst, parent):
self.client = client # CP 실시간 통신 object
self.name = name # 서비스가 다른 이벤트를 구분하기 위한 이름
self.parent = parent # callback 을 위해 보관
self.rpMst = rpMst
# PLUS 로 부터 실제로 시세를 수신 받는 이벤트 핸들러
def OnReceived(self):
if self.name == "stockcur":
# 현재가 체결 데이터 실시간 업데이트
self.rpMst.exFlag = self.client.GetHeaderValue(19) # 예상체결 플래그
code = self.client.GetHeaderValue(0)
diff = self.client.GetHeaderValue(2)
cur= self.client.GetHeaderValue(13) # 현재가
vol = self.client.GetHeaderValue(9) # 거래량
# 예제는 장중만 처리 함.
if (self.rpMst.exFlag == ord('1')): # 동시호가 시간 (예상체결)
# 예상체결가 정보
self.rpMst.expcur = cur
self.rpMst.expdiff = diff
self.rpMst.expvol = vol
else:
self.rpMst.cur = cur
self.rpMst.diff = diff
self.rpMst.makediffp()
self.vol = vol
self.rpMst.makediffp()
# 현재가 업데이트
self.parent.monitorPriceChange()
return
elif self.name == "stockbid":
# 현재가 10차 호가 데이터 실시간 업데이c
code = self.client.GetHeaderValue(0)
dataindex = [3, 7, 11, 15, 19, 27, 31, 35, 39, 43]
obi = 0
for i in range(10):
self.rpMst.offer[i] = self.client.GetHeaderValue(dataindex[i])
self.rpMst.bid[i] = self.client.GetHeaderValue(dataindex[i] + 1)
self.rpMst.offervol[i] = self.client.GetHeaderValue(dataindex[i] + 2)
self.rpMst.bidvol[i] = self.client.GetHeaderValue(dataindex[i] + 3)
self.rpMst.totOffer = self.client.GetHeaderValue(23)
self.rpMst.totBid = self.client.GetHeaderValue(24)
# 10차 호가 변경 call back 함수 호출
self.parent.monitorOfferbidChange()
return
# SB/PB 요청 ROOT 클래스
class CpPublish:
def __init__(self, name, serviceID):
self.name = name
self.obj = win32com.client.Dispatch(serviceID)
self.bIsSB = False
def Subscribe(self, var, rpMst, parent):
if self.bIsSB:
self.Unsubscribe()
if (len(var) > 0):
self.obj.SetInputValue(0, var)
handler = win32com.client.WithEvents(self.obj, CpEvent)
handler.set_params(self.obj, self.name, rpMst, parent)
self.obj.Subscribe()
self.bIsSB = True
def Unsubscribe(self):
if self.bIsSB:
self.obj.Unsubscribe()
self.bIsSB = False
# CpPBStockCur: 실시간 현재가 요청 클래스
class CpPBStockCur(CpPublish):
def __init__(self):
super().__init__("stockcur", "DsCbo1.StockCur")
# CpPBStockBid: 실시간 10차 호가 요청 클래스
class CpPBStockBid(CpPublish):
def __init__(self):
super().__init__("stockbid", "Dscbo1.StockJpBid")
# SB/PB 요청 ROOT 클래스
class CpPBConnection:
def __init__(self):
self.obj = win32com.client.Dispatch("CpUtil.CpCybos")
handler = win32com.client.WithEvents(self.obj, CpEvent)
handler.set_params(self.obj, "connection", None)
# CpRPCurrentPrice: 현재가 기본 정보 조회 클래스
class CpRPCurrentPrice:
def __init__(self):
if (g_objCpStatus.IsConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return
self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
return
def Request(self, code, rtMst, callbackobj):
# 현재가 통신
rtMst.objCur.Unsubscribe()
rtMst.objOfferbid.Unsubscribe()
self.objStockMst.SetInputValue(0, code)
ret = self.objStockMst.BlockRequest()
if self.objStockMst.GetDibStatus() != 0:
print("통신상태", self.objStockMst.GetDibStatus(), self.objStockMst.GetDibMsg1())
return False
# 수신 받은 현재가 정보를 rtMst 에 저장
rtMst.code = code
rtMst.name = g_objCodeMgr.CodeToName(code)
rtMst.cur = self.objStockMst.GetHeaderValue(11) # 종가
rtMst.diff = self.objStockMst.GetHeaderValue(12) # 전일대비
rtMst.baseprice = self.objStockMst.GetHeaderValue(27) # 기준가
rtMst.vol = self.objStockMst.GetHeaderValue(18) # 거래량
rtMst.exFlag = self.objStockMst.GetHeaderValue(58) # 예상플래그
rtMst.expcur = self.objStockMst.GetHeaderValue(55) # 예상체결가
rtMst.expdiff = self.objStockMst.GetHeaderValue(56) # 예상체결대비
rtMst.makediffp()
rtMst.totOffer = self.objStockMst.GetHeaderValue(71) # 총매도잔량
rtMst.totBid = self.objStockMst.GetHeaderValue(73) # 총매수잔량
# 10차호가
for i in range(10):
rtMst.offer[i] = (self.objStockMst.GetDataValue(0, i)) # 매도호가
rtMst.bid[i] = (self.objStockMst.GetDataValue(1, i) ) # 매수호가
rtMst.offervol[i] = (self.objStockMst.GetDataValue(2, i)) # 매도호가 잔량
rtMst.bidvol[i] = (self.objStockMst.GetDataValue(3, i) ) # 매수호가 잔량
rtMst.objCur.Subscribe(code,rtMst, callbackobj)
rtMst.objOfferbid.Subscribe(code,rtMst, callbackobj)
class Form(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent)
self.ui = uic.loadUi("hoga.ui", self)
self.ui.show()
self.objMst = CpRPCurrentPrice()
self.item = stockPricedData()
self.setCode("000660")
@pyqtSlot()
def slot_codeupdate(self):
code = self.ui.editCode.toPlainText()
self.setCode(code)
def slot_codechanged(self):
code = self.ui.editCode.toPlainText()
self.setCode(code)
def monitorPriceChange(self):
self.displyHoga()
def monitorOfferbidChange(self):
self.displyHoga()
def setCode(self, code):
if len(code) < 6 :
return
print(code)
if not (code[0] == "A"):
code = "A" + code
name = g_objCodeMgr.CodeToName(code)
if len(name) == 0:
print("종목코드 확인")
return
self.ui.label_name.setText(name)
if (self.objMst.Request(code, self.item, self) == False):
return
self.displyHoga()
def displyHoga(self):
self.ui.label_offer10.setText(format(self.item.offer[9],','))
self.ui.label_offer9.setText(format(self.item.offer[8],','))
self.ui.label_offer8.setText(format(self.item.offer[7],','))
self.ui.label_offer7.setText(format(self.item.offer[6],','))
self.ui.label_offer6.setText(format(self.item.offer[5],','))
self.ui.label_offer5.setText(format(self.item.offer[4],','))
self.ui.label_offer4.setText(format(self.item.offer[3],','))
self.ui.label_offer3.setText(format(self.item.offer[2],','))
self.ui.label_offer2.setText(format(self.item.offer[1],','))
self.ui.label_offer1.setText(format(self.item.offer[0],','))
self.ui.label_offer_v10.setText(format(self.item.offervol[9],','))
self.ui.label_offer_v9.setText(format(self.item.offervol[8],','))
self.ui.label_offer_v8.setText(format(self.item.offervol[7],','))
self.ui.label_offer_v7.setText(format(self.item.offervol[6],','))
self.ui.label_offer_v6.setText(format(self.item.offervol[5],','))
self.ui.label_offer_v5.setText(format(self.item.offervol[4],','))
self.ui.label_offer_v4.setText(format(self.item.offervol[3],','))
self.ui.label_offer_v3.setText(format(self.item.offervol[2],','))
self.ui.label_offer_v2.setText(format(self.item.offervol[1],','))
self.ui.label_offer_v1.setText(format(self.item.offervol[0],','))
self.ui.label_bid10.setText(format(self.item.bid[9],','))
self.ui.label_bid9.setText(format(self.item.bid[8],','))
self.ui.label_bid8.setText(format(self.item.bid[7],','))
self.ui.label_bid7.setText(format(self.item.bid[6],','))
self.ui.label_bid6.setText(format(self.item.bid[5],','))
self.ui.label_bid5.setText(format(self.item.bid[4],','))
self.ui.label_bid4.setText(format(self.item.bid[3],','))
self.ui.label_bid3.setText(format(self.item.bid[2],','))
self.ui.label_bid2.setText(format(self.item.bid[1],','))
self.ui.label_bid1.setText(format(self.item.bid[0],','))
self.ui.label_bid_v10.setText(format(self.item.bidvol[9],','))
self.ui.label_bid_v9.setText(format(self.item.bidvol[8],','))
self.ui.label_bid_v8.setText(format(self.item.bidvol[7],','))
self.ui.label_bid_v7.setText(format(self.item.bidvol[6],','))
self.ui.label_bid_v6.setText(format(self.item.bidvol[5],','))
self.ui.label_bid_v5.setText(format(self.item.bidvol[4],','))
self.ui.label_bid_v4.setText(format(self.item.bidvol[3],','))
self.ui.label_bid_v3.setText(format(self.item.bidvol[2],','))
self.ui.label_bid_v2.setText(format(self.item.bidvol[1],','))
self.ui.label_bid_v1.setText(format(self.item.bidvol[0],','))
cur = self.item.cur
diff = self.item.diff
diffp = self.item.diffp
if (self.item.exFlag == ord('1')): # 동시호가 시간 (예상체결)
cur = self.item.expcur
diff = self.item.expdiff
diffp = self.item.expdiffp
strcur = format(cur, ',')
if (self.item.exFlag == ord('1')): # 동시호가 시간 (예상체결)
strcur = "*" + strcur
curcolor = self.item.getCurColor()
self.ui.label_cur.setStyleSheet(curcolor)
self.ui.label_cur.setText(strcur)
strdiff = str(diff) + " " + format(diffp, '.2f')
strdiff += "%"
self.ui.label_diff.setText(strdiff)
self.ui.label_diff.setStyleSheet(curcolor)
self.ui.label_totoffer.setText(format(self.item.totOffer,','))
self.ui.label_totbid.setText(format(self.item.totBid,','))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Form()
sys.exit(app.exec())
12 주식 예약 매수/매도/취소/조회 예제[편집]
- 예약매수 전송 - 예약 매수(오늘 종가 기준) - 예약매도 전송 - 예약 매수(오늘 종가 기준) - 예약주문 취소 - 미체결 예약주문 리스트에서 첫번째 예약 주문 취소 - 예약내역 가져오기 - 예약주문 리스트 가져와 미체결 건만 리스트에 저장(취소 주문 할 수 있도록)
# 예약매수/매도/예약주문 내역 조회 예제
# 화면 설명
# 예약매수 전송 - 예약 매수(오늘 종가 기준)
# 예약매도 전송 - 예약 매수(오늘 종가 기준)
# 예약주문 취소 - 미체결 예약주문 리스트에서 첫번째 예약 주문 취소
# 예약내역 가져오기 - 예약주문 리스트 가져와 미체결 건만 리스트에 저장(취소 주문 할 수 있도록)
import sys
from PyQt5.QtWidgets import *
from enum import Enum
import win32com.client
import time
import pythoncom
g_objCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
g_objCpStatus = win32com.client.Dispatch("CpUtil.CpCybos")
g_objCpTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
# enum 주문 상태 세팅용
class EorderBS(Enum):
buy = 1 # 매수
sell= 2 # 매도
none =3
# 현재가 정보 저장 구조체
class stockPricedData:
def __init__(self):
self.dicEx = {ord('0'): "동시호가/장중 아님", ord('1'): "동시호가", ord('2'): "장중"}
self.code = ""
self.name = ""
self.cur = 0 # 현재가
self.open = self.high = self.low = 0 # 시/고/저
self.diff = 0
self.diffp = 0
self.objCur = None
self.objBid = None
self.vol = 0 # 거래량
self.offer = [0 for _ in range(10)] # 매도호가
self.bid = [0 for _ in range(10)] # 매수호가
self.offervol = [0 for _ in range(10)] # 매도호가 잔량
self.bidvol = [0 for _ in range(10)] # 매수호가 잔량
# 전일 대비 계산
def makediffp(self, baseprice):
lastday = 0
if baseprice :
lastday =baseprice
else:
lastday = self.cur - self.diff
if lastday:
self.diffp = (self.diff / lastday) * 100
else:
self.diffp = 0
def debugPrint(self, type):
if type == 0 :
print("%s, %s %s, 현재가 %d 대비 %d, (%.2f), 1차매도 %d(%d) 1차매수 %d(%d)"
%(self.dicEx.get(self.exFlag), self.code,
self.name, self.cur, self.diff, self.diffp,
self.offer[0], self.offervol[0],self.bid[0], self.bidvol[0] ) )
else :
print("%s %s, 현재가 %.2f 대비 %.2f, (%.2f), 1차매도 %.2f(%d) 1차매수 %.2f(%d)"
% (self.code,
self.name, self.cur, self.diff, self.diffp,
self.offer[0], self.offervol[0], self.bid[0], self.bidvol[0]))
# 주문 데이터
class orderData:
def __init__(self):
self.dicEx = {EorderBS.buy: "매수", EorderBS.sell: "매도", EorderBS.none: "없음"}
self.orderNum = 0
self.bs = EorderBS.none # 0 : buy 1: sell
self.code = ""
self.amount = 0
self.price = 0
def debugPrint(self):
print(self.dicEx.get(self.bs), self.code, self.orderNum, self.amount, self.price)
# CpRPCurrentPrice: 현재가 기본 정보 조회 클래스
class CpRPCurrentPrice:
def __init__(self):
if (g_objCpStatus.IsConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return
self.objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
return
def Request(self, code, rtMst):
# 현재가 통신
rqtime = time.time()
self.objStockMst.SetInputValue(0, code)
ret = self.objStockMst.BlockRequest()
if self.objStockMst.GetDibStatus() != 0:
print("통신상태", self.objStockMst.GetDibStatus(), self.objStockMst.GetDibMsg1())
return False
# 수신 받은 현재가 정보를 rtMst 에 저장
rtMst.code = code
rtMst.name = g_objCodeMgr.CodeToName(code)
rtMst.cur = self.objStockMst.GetHeaderValue(11) # 종가
rtMst.diff = self.objStockMst.GetHeaderValue(12) # 전일대비
rtMst.baseprice = self.objStockMst.GetHeaderValue(27) # 기준가
rtMst.exFlag = self.objStockMst.GetHeaderValue(58) # 예상플래그
if rtMst.baseprice :
rtMst.diffp = (rtMst.diff / rtMst.baseprice) * 100
# 10차호가
for i in range(10):
rtMst.offer[i] = (self.objStockMst.GetDataValue(0, i)) # 매도호가
rtMst.bid[i] = (self.objStockMst.GetDataValue(1, i) ) # 매수호가
rtMst.offervol[i] = (self.objStockMst.GetDataValue(2, i)) # 매도호가 잔량
rtMst.bidvol[i] = (self.objStockMst.GetDataValue(3, i) ) # 매수호가 잔량
return True
# CpRPPreOrder - 예약 주문 매수/매도/취소/내역 조회 클래스
class CpRPPreOrder:
def __init__(self):
if (g_objCpStatus.IsConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return
if (g_objCpTrade.TradeInit(0) != 0):
print("주문 초기화 실패")
exit
self.objOrder = win32com.client.Dispatch("CpTrade.CpTdNew9061")
self.objCancel = win32com.client.Dispatch("CpTrade.CpTdNew9064")
self.objResult = win32com.client.Dispatch("CpTrade.CpTd9065")
self.acc = g_objCpTrade.AccountNumber[0] # 계좌번호
self.accFlag = g_objCpTrade.GoodsList(self.acc, 1) # 주식상품 구분
return
# 예약 매수 또는 매도
def RequestOrder(self, bs, code, price, amount, data):
data.code = code
data.amount = amount
data.price = price;
rqBS = "2"
if bs == EorderBS.buy: # 매수
rqBS = "2"
data.bs = EorderBS.buy
elif bs == EorderBS.sell: # 매도
data.bs = EorderBS.sell
rqBS = "1"
# 예약 주문
print(self.acc, self.accFlag[0])
self.objOrder.SetInputValue(0, self.acc)
self.objOrder.SetInputValue(1, self.accFlag[0])
self.objOrder.SetInputValue(2, rqBS)
self.objOrder.SetInputValue(3, code)
self.objOrder.SetInputValue(4, amount)
self.objOrder.SetInputValue(5, "01") # 주문호가 구분 01: 보통
self.objOrder.SetInputValue(6, price)
# 예약 주문 요청
self.objOrder.BlockRequest()
if self.objOrder.GetDibStatus() != 0:
print("통신상태", self.objOrder.GetDibStatus(), self.objOrder.GetDibMsg1())
return False
data.orderNum = self.objOrder.GetHeaderValue(0) # 예약번호
print("예약주문 성공, 예약번호 #", data.orderNum)
# 예약 취소 주문
def RequestCancel(self, ordernum, code):
# 예약주문 취소
print(self.acc, self.accFlag[0])
self.objCancel.SetInputValue(0, ordernum)
self.objCancel.SetInputValue(1, self.acc)
self.objCancel.SetInputValue(2, self.accFlag[0])
self.objCancel.SetInputValue(3, code)
# 예약 취소 주문 요청
self.objCancel.BlockRequest()
if self.objCancel.GetDibStatus() != 0:
print("통신상태", self.objCancel.GetDibStatus(), self.objCancel.GetDibMsg1())
return False
print("예약주문 취소 ", ordernum, self.objCancel.GetDibMsg1() )
# 예약 주문 내역 조회 및 미체결 리스트 구하기
def RequestOrderList(self, orderList):
print(self.acc, self.accFlag[0])
self.objResult.SetInputValue(0, self.acc)
self.objResult.SetInputValue(1, self.accFlag[0])
self.objResult.SetInputValue(2, 20)
while True: # 연속 조회로 전체 예약 주문 가져온다.
self.objResult.BlockRequest()
if self.objResult.GetDibStatus() != 0:
print("통신상태", self.objResult.GetDibStatus(), self.objResult.GetDibMsg1())
return False
cnt = self.objResult.GetHeaderValue(4)
if cnt == 0 :
break
for i in range(cnt):
i1 = self.objResult.GetDataValue(1, i) # 주문구분(매수 또는 매도)
i2 = self.objResult.GetDataValue(2, i) # 코드
i3 = self.objResult.GetDataValue(3, i) # 주문 수량
i4 = self.objResult.GetDataValue(4, i) # 주문호가구분
i5 = self.objResult.GetDataValue(6, i) # 예약번호
i6 = self.objResult.GetDataValue(12, i) # 처리구분내용 - 주문취소 또는 주문예정
i7 = self.objResult.GetDataValue(9, i) # 주문단가
i8= self.objResult.GetDataValue(11, i) # 주문번호
i9 = self.objResult.GetDataValue(12, i) # 처리구분코드
i10= self.objResult.GetDataValue(13, i) # 거부코드
i11 = self.objResult.GetDataValue(14, i) # 거부내용
print(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11)
# 미체결
if (i6 == "주문예정") :
item = orderData()
item.orderNum = i5
if (i1 == "매수") :
item.bs = EorderBS.buy
else:
item.bs = EorderBS.sell
item.code = i2
item.amount = i3
item.price = i7
orderList.append(item)
# 연속 처리 체크 - 다음 데이터가 없으면 중지
if self.objResult.Continue == False :
break
# 샘플 코드 메인 클래스
class testMain():
def __init__(self):
self.orderList = []
self.objMst = CpRPCurrentPrice()
self.obj9061 = CpRPPreOrder()
# 미체결 된 예약 주문 처음부터 받아옴.
self.resultOrder()
return
def newBuyOrder(self, code, amount):
mstData = stockPricedData()
if self.objMst.Request(code, mstData) == False :
print("현재가 요청 실패")
return
item = orderData()
ret = self.obj9061.RequestOrder(EorderBS.buy, code, mstData.cur, amount, item )
if (ret == False):
return False
self.orderList.append(item)
item.debugPrint()
def newSellOrder(self, code, amount):
mstData = stockPricedData()
if self.objMst.Request(code, mstData) == False :
print("현재가 요청 실패")
return
item = orderData()
ret = self.obj9061.RequestOrder(EorderBS.sell, code, mstData.cur, amount, item )
if (ret == False):
return False
self.orderList.append(item)
item.debugPrint()
def cancelOrder(self):
if len(self.orderList) == 0:
print("취소 할 주문 확인하세요")
return
item = self.orderList[0]
ret = self.obj9061.RequestCancel(item.orderNum, item.code)
if (ret == False):
return False
del (self.orderList[0])
def resultOrder(self):
self.orderList = []
# 미체결 주문만 받아 보자
ret = self.obj9061.RequestOrderList(self.orderList)
if (ret == False):
return False
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.main = testMain()
self.setWindowTitle("PLUS API TEST")
w = 200
h = 30
nHeight = 20
btnBuy = QPushButton("예약매수 전송", self)
btnBuy.move(20, nHeight)
btnBuy.resize(w, h)
btnBuy.clicked.connect(self.btnBuy_clicked)
nHeight += 50
btnSell = QPushButton("예약 매도 전송", self)
btnSell.move(20, nHeight)
btnSell.resize(w, h)
btnSell.clicked.connect(self.btnSell_clicked)
nHeight += 50
btnCancel = QPushButton("예약 주문 취소", self)
btnCancel.move(20, nHeight)
btnCancel.resize(w, h)
btnCancel.clicked.connect(self.btnCancel_clicked)
nHeight += 50
btnResult= QPushButton("예약 내역 가져오기", self)
btnResult.move(20, nHeight)
btnResult.resize(w, h)
btnResult.clicked.connect(self.btnResult_clicked)
nHeight += 50
btnExit = QPushButton("종료", self)
btnExit.move(20, nHeight)
btnExit.resize(w, h)
btnExit.clicked.connect(self.btnExit_clicked)
nHeight += 50
self.setGeometry(300, 500, 300, nHeight)
def btnBuy_clicked(self):
self.main.newBuyOrder("A003540", 10)
return
def btnSell_clicked(self):
self.main.newSellOrder("A003540", 10)
return
def btnCancel_clicked(self):
self.main.cancelOrder()
return
def btnResult_clicked(self):
self.main.resultOrder()
return
def btnExit_clicked(self):
exit()
return
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()
13 주식/ELW/선물/옵션/업종 전 종목 시세 조회 예제[편집]
import sys
from PyQt5.QtWidgets import *
from enum import Enum
import win32com.client
import time
import pythoncom
g_objCodeMgr = win32com.client.Dispatch("CpUtil.CpCodeMgr")
g_objCpStatus = win32com.client.Dispatch("CpUtil.CpCybos")
g_objElwMgr = win32com.client.Dispatch("CpUtil.CpElwCode")
g_objFutureMgr = win32com.client.Dispatch("CpUtil.CpFutureCode")
g_objOptionMgr = win32com.client.Dispatch("CpUtil.CpOptionCode")
=== 감시 중인 현재가 정보 저장 구조체===
class stockPricedData:
def __init__(self):
self.dicEx = {ord('0'): "동시호가/장중 아님", ord('1'): "동시호가", ord('2'): "장중"}
self.code = ""
self.name = ""
===elf.cur = 0 # 현재가===
===elf.open = self.high = self.low = 0 # 시/고/저===
self.diff = 0
self.diffp = 0
self.objCur = None
self.objBid = None
#self.Zoffer = 0
#self.ZodfferDate = 0
===elf.vol = 0 # 거래량===
===elf.offer = [0 for _ in range(10)] # 매도호가===
===elf.bid = [0 for _ in range(10)] # 매수호가===
===elf.offervol = [0 for _ in range(10)] # 매도호가 잔량===
===elf.bidvol = [0 for _ in range(10)] # 매수호가 잔량===
=== 전일 대비 계산===
def makediffp(self, baseprice):
lastday = 0
if baseprice :
lastday =baseprice
else:
lastday = self.cur - self.diff
if lastday:
self.diffp = (self.diff / lastday) * 100
else:
self.diffp = 0
def debugPrint(self, type):
if type == 0 :
print("%s, %s %s, 현재가 %d 대비 %d, (%.2f), 1차매도 %d(%d) 1차매수 %d(%d)"
%(self.dicEx.get(self.exFlag), self.code,
self.name, self.cur, self.diff, self.diffp,
self.offer[0], self.offervol[0],self.bid[0], self.bidvol[0] ) )
else :
print("%s %s, 현재가 %.2f 대비 %.2f, (%.2f), 1차매도 %.2f(%d) 1차매수 %.2f(%d)"
% (self.code,
self.name, self.cur, self.diff, self.diffp,
self.offer[0], self.offervol[0], self.bid[0], self.bidvol[0]))
class CpMarketEye:
def __init__(self):
if (g_objCpStatus.IsConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return False
self.objRq = win32com.client.Dispatch("CpSysDib.MarketEye")
self.RpFiledIndex = 0
def Request(self, codes, dicCodes):
#rqField = [코드, 대비부호, 대비, 현재가, 시가, 고가, 저가, 매도호가, 매수호가, 거래량, 장구분, 매도잔량,매수잔량,
=== 공매도수량, 공매도날짜]===
=== rqField = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16, 127, 128] # 요청 필드===
===qField = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16] # 요청 필드===
===elf.objRq.SetInputValue(0, rqField) # 요청 필드===
===elf.objRq.SetInputValue(1, codes) # 종목코드 or 종목코드 리스트===
self.objRq.BlockRequest()
=== 현재가 통신 및 통신 에러 처리===
rqStatus = self.objRq.GetDibStatus()
print("통신상태", rqStatus, self.objRq.GetDibMsg1())
if rqStatus != 0:
return False
cnt = self.objRq.GetHeaderValue(2)
for i in range(cnt):
===ode = self.objRq.GetDataValue(0, i) # 코드===
record = None
if code in dicCodes:
record = dicCodes.get(code)
else:
record = stockPricedData()
record.code = code
record.name = g_objCodeMgr.CodeToName(code)
===ecord.diff = self.objRq.GetDataValue(2, i) # 전일대비===
===ecord.cur = self.objRq.GetDataValue(3, i) # 현재가===
===ecord.open = self.objRq.GetDataValue(4, i) # 시가===
===ecord.high = self.objRq.GetDataValue(5, i) # 고가===
===ecord.low = self.objRq.GetDataValue(6, i) # 저가===
===ecord.offer[0] = self.objRq.GetDataValue(7, i) # 매도호가===
===ecord.bid[0] = self.objRq.GetDataValue(8, i) # 매수호가===
===ecord.vol = self.objRq.GetDataValue(9, i) # 거래량===
===ecord.exFlag = self.objRq.GetDataValue(10, i) # 장구분===
===ecord.offervol[0] = self.objRq.GetDataValue(11, i) # 매도잔량===
===ecord.bidvol[0] = self.objRq.GetDataValue(12, i) # 매수잔량===
===record.Zoffer = self.objRq.GetDataValue(13, i) # 공매도수량===
===record.ZofferDate = self.objRq.GetDataValue(14, i) # 공매도날짜===
record.makediffp(0)
dicCodes[code] = record
return True
=== 샘플 코드 메인 클래스===
class testMain():
def __init__(self):
===elf.dicStockCodes = dict() # 주식 전 종목 시세 ===
===elf.dicElwCodes = dict() # ELW 전종목 시세 ===
===elf.dicFutreCodes = dict() # 선물 전종목 시세 ===
===elf.dicOptionCodes = dict() # 옵션 전종목 시세 ===
===elf.dicUpjongCodes = dict() # 업종 전종목 시세 ===
self.obj = CpMarketEye()
return
def ReqeustStockMst(self):
===odeList = g_objCodeMgr.GetStockListByMarket(1) # 거래소===
===odeList2 = g_objCodeMgr.GetStockListByMarket(2) # 코스닥===
allcodelist = codeList + codeList2
print("전체 종목 코드 #", len(allcodelist))
rqCodeList = []
for i, code in enumerate(allcodelist):
rqCodeList.append(code)
if len(rqCodeList) == 200:
self.obj.Request(rqCodeList, self.dicStockCodes)
rqCodeList = []
continue
if len(rqCodeList) > 0 :
self.obj.Request(rqCodeList, self.dicStockCodes)
print("거래소 + 코스닥 전 종목 ", len(self.dicStockCodes))
for key in self.dicStockCodes :
self.dicStockCodes[key].debugPrint(0)
def ReqeustElwMst(self):
allcodelist = []
for i in range(g_objElwMgr.GetCount()) :
allcodelist.append(g_objElwMgr.GetData(0,i))
print("전체 종목 코드 #", len(allcodelist))
rqCodeList = []
for i, code in enumerate(allcodelist):
rqCodeList.append(code)
if len(rqCodeList) == 200:
self.obj.Request(rqCodeList, self.dicElwCodes)
rqCodeList = []
continue
if len(rqCodeList) > 0 :
self.obj.Request(rqCodeList, self.dicElwCodes)
print("ELW 전종목", len(self.dicElwCodes))
for key in self.dicElwCodes :
self.dicElwCodes[key].debugPrint(0)
def ReqeustFutreMst(self):
allcodelist = []
for i in range(g_objFutureMgr.GetCount()) :
allcodelist.append(g_objFutureMgr.GetData(0,i))
print("전체 종목 코드 #", len(allcodelist))
rqCodeList = []
for i, code in enumerate(allcodelist):
rqCodeList.append(code)
if len(rqCodeList) == 200:
self.obj.Request(rqCodeList, self.dicFutreCodes)
rqCodeList = []
continue
if len(rqCodeList) > 0 :
self.obj.Request(rqCodeList, self.dicFutreCodes)
print("선물 전종목 ", len(self.dicFutreCodes))
for key in self.dicFutreCodes :
self.dicFutreCodes[key].debugPrint(1)
def ReqeustOptionMst(self):
allcodelist = []
for i in range(g_objOptionMgr.GetCount()) :
allcodelist.append(g_objOptionMgr.GetData(0,i))
print("전체 종목 코드 #", len(allcodelist))
rqCodeList = []
for i, code in enumerate(allcodelist):
rqCodeList.append(code)
if len(rqCodeList) == 200:
self.obj.Request(rqCodeList, self.dicOptionCodes)
rqCodeList = []
continue
if len(rqCodeList) > 0 :
self.obj.Request(rqCodeList, self.dicOptionCodes)
print("옵션 전종목 ", len(self.dicOptionCodes))
for key in self.dicOptionCodes :
self.dicOptionCodes[key].debugPrint(1)
def ReqeustUpjongMst(self):
===odeList = g_objCodeMgr.GetIndustryList() # 증권 산업 업종 리스트===
allcodelist = codeList
print("전체 종목 코드 #", len(allcodelist))
rqCodeList = []
for i, code in enumerate(allcodelist):
code2 = "U" + code
rqCodeList.append(code2)
if len(rqCodeList) == 200:
self.obj.Request(rqCodeList, self.dicUpjongCodes)
rqCodeList = []
continue
if len(rqCodeList) > 0 :
self.obj.Request(rqCodeList, self.dicUpjongCodes)
print("증권산업업종 리스트", len(self.dicUpjongCodes))
for key in self.dicUpjongCodes :
self.dicUpjongCodes[key].debugPrint(1)
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.main = testMain()
self.setWindowTitle("PLUS API TEST")
self.setGeometry(300, 500, 300, 500)
nHeight = 20
btnStock = QPushButton("주식 전 종목", self)
btnStock.move(20, nHeight)
btnStock.clicked.connect(self.btnStock_clicked)
nHeight += 50
btnElw = QPushButton("ELW 전 종목", self)
btnElw.move(20, nHeight)
btnElw.clicked.connect(self.btnElw_clicked)
nHeight += 50
btnFuture = QPushButton("선물 전 종목", self)
btnFuture.move(20, nHeight)
btnFuture.clicked.connect(self.btnFuture_clicked)
nHeight += 50
btnOption= QPushButton("옵션 전 종목", self)
btnOption.move(20, nHeight)
btnOption.clicked.connect(self.btnOption_clicked)
nHeight += 50
btnUpjong= QPushButton("업종 전 종목", self)
btnUpjong.move(20, nHeight)
btnUpjong.clicked.connect(self.btnUpjong_clicked)
nHeight += 50
btnExit = QPushButton("종료", self)
btnExit.move(20, nHeight)
btnExit.clicked.connect(self.btnExit_clicked)
def btnStock_clicked(self):
self.main.ReqeustStockMst()
return
def btnElw_clicked(self):
self.main.ReqeustElwMst()
return
def btnFuture_clicked(self):
self.main.ReqeustFutreMst()
return
def btnOption_clicked(self):
self.main.ReqeustOptionMst()
return
def btnUpjong_clicked(self):
self.main.ReqeustUpjongMst()
return
def btnExit_clicked(self):
exit()
return
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()