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_() |
'증권사 api' 카테고리의 다른 글
상장주식수 구하기 -- 키움 api, 크레온 api 차이 (0) | 2019.07.09 |
---|---|
키움 openapi -- 실시간 주식체결 data 중에서 장구분 의미 (0) | 2019.07.03 |
creon plus -- C# 접속확인 초간단 예제 (2) | 2018.12.24 |
키움 openapi -- 자동로그인 실패시, 수동로그인으로 바꾸기 (0) | 2018.11.08 |
creon plus -- 실시간 체결데이터 받기 -- StockCur 사용 (0) | 2018.10.25 |