반응형

db api -- DB금융투자 api 기초 python 예제



참고 : https://www.db-fi.com/main/main.do

환경 : windows 10 64bit, python 3.6, anaconda 4.5.11 32bit



결론 : TR 제한이 심함.  --> 이전에 제공한 TR 들을 이제는 제공안하는듯함.


        DB증권투자 홈페이지에서 제공하는 visual basic 예제에 있는 candle data 요청 TR 함수들이 사라짐.

         --> compile 에러 발생하는 상황.

       

        제공해주는 api 설명서에있는 TR 사용못함..

        이건 뭐 너무 형편없는 수준... 설명서 업데이트가 아예 없는 수준..



< 홈페이지 제공 api 샘플 컴파일 결과 >


  --> visual basic 샘플코드 TR함수 없어서 컴파일 에러 발생. 

  --> visual basic 샘플코드 만들 당시에 있던 TR 함수들이 이제는 사라진듯.. 헐...


  --> 이런 TR 함수들 없는 c# 샘플코드는 잘 작동함.. ㅋㅋㅋ



*** 그래서 그냥 대충만 python 으로 구현함.. 어짜피 사용할 일 없는 api 인것같음.





< 사용가능한 api 함수들 >







** DB금융투자 비대면계좌 만들어 가입후 open api 설치하기


1. api 신청하기







 ---> 여기서 신청하면 아래 메세지 나오면서 안됨. 


 --> 상담 아가씨 연결하여, 관리지점, 관리자 등록후에야 다음 진행됨.




2. open api 설치하기 

   - PC용API예제다운로드 하여서, open api 설치한다. 

   - 반드시, 모든것은 관리자 권한으로 실행해야함.


    1) DBFIOpenAPI_custom.exe 실행함.


    2) DBFIOpenAPICom.ocx 를 레지스트리에 등록하기


        


 

3. 레지스트리 확인하기 



  --> DBFIOPENAPICOM.DBFIOpenAPIComCtrl.1 를 사용하여 프로그램 만들자. 




< 실행결과 >






< 소스 >

--

"""
DB금융투자
"""
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
import ctypes
ID_ADVICE_RT = -73 # 실시간 데이타 등록
ID_UNADVICE_RT = -74 # 실시간 데이타 등록해제
R_S31 = "S31" # 주식/ETF 현재가
R_X12 = "X12" # 주식/ETF 호가
class DBFI(QAxWidget):
def __init__(self):
super().__init__()
self.id = "myid" # HTS id
self.pwd = "mypwd" # HTS 비밀번호
self.certpwd = "certpwd" # 증권용 공인인증서 비밀번호
self.setControl("DBFIOPENAPICOM.DBFIOpenAPIComCtrl.1")
self.api_handle = -1
# print("---- create api ------")
hwnd = ctypes.windll.kernel32.GetModuleHandleA(None) # 현재 윈도우 핸들 구하기
# print("hwnd = {0}".format(hwnd))
result = self.dynamicCall("CreateDongbuAPICtrl(str, int, int,)", self.id, 0, hwnd) # 로그인 윈도우를 실행한다.
if result:
print("--- 로그인 윈도우 실행 성공------")
else:
print("--- 로그인 윈도우 실행 실패.....------")
self.stockcode = "005930" # 삼성전자 주식코드 -- default 설정함
self.Connected.connect(self._onconnected)
self.Disconnected.connect(self._ondisconnected)
self.ReceiveData.connect(self._receive_tr_data)
self.ReceiveRTData.connect(self._receive_real_data)
def login(self):
result = self.dynamicCall("Login(str, str, str, int)", self.id, self.pwd, self.certpwd, 1) # 로그인 윈도우를 실행한다.
return result
def logout(self):
result = self.dynamicCall("Logout()")
return result
def _onconnected(self, api_handle):
print("connected...." + str(api_handle))
self.api_handle = api_handle # 인증받은 DongbuAPI Handle 저장
def _ondisconnected(self):
print("disconnected....")
def _receive_tr_data(self, sender, data):
print("=============== tr data ===================")
print(type(sender), sender)
print(type(data), len(data), data)
def _receive_real_data(self, name, field, data):
print("======== real data ===========")
print(field)
print(name)
print(data)
def get_login_info(self):
print("----- info -----")
# 주식 계좌 구하기
bb = self.dynamicCall("GetAccountList(int)", 2)
print("주식계좌 : ", bb)
# 선물 계좌 구하기
cc = self.dynamicCall("GetAccountList(int)", 1)
print("선물계좌 : ", cc)
print("---------------")
result = self.dynamicCall("ReqStockHoga(str)", self.stockcode)
if result:
print("======== TR 요청 성공 ============")
def get_real_data(self):
result = self.dynamicCall("ReqRealtimeData(int, str, str)", ID_ADVICE_RT, R_X12, self.stockcode)
return result
def end_real_data(self):
result = self.dynamicCall("ReqRealtimeData(int, str, str)", ID_UNADVICE_RT, R_X12, self.stockcode)
return result
if __name__ == "__main__":
import sys
class MyMain(QWidget):
def __init__(self):
super().__init__()
self.dbfi = DBFI()
self.dbfi.stockcode = "068270" # 셀트리온 종목코드
vbox = QVBoxLayout()
self.qtxt = QTextEdit(self)
vbox.addWidget(self.qtxt)
hbox = QHBoxLayout()
self._btn1 = QPushButton("Login", self)
self._btn2 = QPushButton("Logout", self)
self._btn3 = QPushButton("사용자정보, tr 요청", self)
self._btn4 = QPushButton("real 요청", self)
self._btn5 = QPushButton("real 중단", self)
hbox.addWidget(self._btn1)
hbox.addWidget(self._btn2)
hbox.addWidget(self._btn3)
hbox.addWidget(self._btn4)
hbox.addWidget(self._btn5)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 150)
self._btn1.clicked.connect(self.btn1_clicked)
self._btn2.clicked.connect(self.btn2_clicked)
self._btn3.clicked.connect(self.__btn3_clicked)
self._btn4.clicked.connect(self.__btn4_clicked)
self._btn5.clicked.connect(self.__btn5_clicked)
self._btn2.setEnabled(False)
self._btn3.setEnabled(False)
self._btn4.setEnabled(False)
self._btn5.setEnabled(False)
@pyqtSlot()
def btn1_clicked(self):
if self.dbfi.login():
self.qtxt.append("로그인 성공")
self._btn1.setEnabled(False)
self._btn2.setEnabled(True)
self._btn3.setEnabled(True)
self._btn4.setEnabled(True)
self._btn5.setEnabled(True)
else:
self.qtxt.append("로그인 실패")
@pyqtSlot()
def btn2_clicked(self):
if self.dbfi.logout():
self.qtxt.append("로그아웃 성공")
else:
self.qtxt.append("로그아웃 실패")
@pyqtSlot()
def __btn3_clicked(self):
self.dbfi.get_login_info()
@pyqtSlot()
def __btn4_clicked(self):
if self.dbfi.get_real_data():
self.qtxt.append("실시간 요청 성공")
@pyqtSlot()
def __btn5_clicked(self):
if self.dbfi.end_real_data():
self.qtxt.append("실시간 중단 요청 성공")
app = QApplication(sys.argv)
myWindow = MyMain()
myWindow.show()
app.exec_()



 


반응형
Posted by 자유프로그램
,