Skip to content

Instantly share code, notes, and snippets.

@kwakseonghun
Last active September 5, 2017 13:57
Show Gist options
  • Save kwakseonghun/430458892865c17171c8851c3481ed47 to your computer and use it in GitHub Desktop.
Save kwakseonghun/430458892865c17171c8851c3481ed47 to your computer and use it in GitHub Desktop.
import sys
from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *
import time
import pandas as pd
import sqlite3
class Kiwoom(QAxWidget):
def __init__(self):
super().__init__()
self._create_kiwoom_instance()
self._set_signal_slots()
def _create_kiwoom_instance(self):
self.setControl("KHOPENAPI.KHOpenAPICtrl.1")
def _set_signal_slots(self):
self.OnReceiveTrData.connect(self._receive_tr_data)
self.OnReceiveRealData.connect(self._receive_real_data)
self.OnReceiveMsg.connect(self._receive_msg)
self.OnReceiveChejanData.connect(self._receive_chejan_data)
self.OnEventConnect.connect(self._event_connect)
def _comm_connect(self):
self.dynamicCall("CommConnect()")
self.login_event_loop=QEventLoop()
self.login_event_loop.exec_()
def _event_connect(self,err_code):
if err_code==0:
print("connected")
else:
print("disconnected")
self.login_event_loop.exit()
def _get_connect_state(self):
ret=self.dynamicCall("GetConnectState()")
return ret
# 이벤트 처리하는곳
def _receive_tr_data(self, sScrNo, sRQName, sTrCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage,sSplmMsg):
pass
def _receive_real_data(self, sRealKey, sRealType, sRealData):
pass
def _receive_msg(self, sScrNo, sRQName, sTrCode, sMsg):
pass
def _receive_chejan_data(self, sGubun, nItemCnt, sFidList):
pass
# 이벤트 처리하는곳
#기본함수 정의
@staticmethod
def change_format(data):
strip_data = data.lstrip('-0')
if strip_data == '':
strip_data = '0'
format_data = strip_data
if data.startswith('-'):
format_data = '-' + format_data
return format_data
def _get_comm_data(self, strTrCode, strRecordName, nIndex, strItemName):
ret = self.dynamicCall("GetCommData(QString, QString, int, QString)", strTrCode,strRecordName, nIndex, strItemName)
return ret.strip()
def _comm_rq_data(self, sRQName, sTrCode, nPrevNext, sScreenNo):
ret=self.dynamicCall("CommRqData(QString, QString, int, QString)", sRQName, sTrCode, nPrevNext, sScreenNo)
return ret
def _set_input_value(self, sID, sValue):
self.dynamicCall("SetInputValue(QString, QString)", sID, sValue)
def _get_repeat_cnt(self, sTrCode, sRecordName):
ret = self.dynamicCall("GetRepeatCnt(QString, QString)", sTrCode, sRecordName)
return ret
def _get_comm_real_data(self,strRealType,nFid):
ret=self.dynamicCall("GetCommRealData(QString,int)",strRealType,nFid)
return ret.strip()
def _get_login_info(self,sTag):
ret=self.dynamicCall("GetLoginInfo(QString)",sTag)
return ret
def _send_order(self,sRQName,sScreenNo,sAccNo,nOrderType,sCode,nQty,nPrice,sHogaGb,sOrgOrderNo):
ret=self.dynamicCall("SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)", sRQName, sScreenNo, sAccNo, nOrderType, sCode, nQty, nPrice, sHogaGb, sOrgOrderNo)
return ret
def _get_chejan_data(self,nFid):
ret=self.dynamicCall("GetChejanData(int)",nFid)
return ret
def _set_real_reg(self, strScreenNo, strCodeList, strFidList, strRealType):
ret=self.dynamicCall("SetRealReg(QString,QString,QString,QString)", strScreenNo, strCodeList, strFidList,strRealType)
return ret
def _set_real_remove(self,strScrNo,strDelCode):
ret=self.dynamicCall("SetRealRemove(QString,QString)",strScrNo,strDelCode)
return ret
def _get_master_last_price(self,strCode):
ret=self.dynamicCall("GetMasterLastPrice(QString)",strCode)
ret=Kiwoom.change_format(ret)
return ret
def _get_master_code_name(self,strCode):
ret=self.dynamicCall("GetMasterCodeName(QString)",strCode)
return ret
def _get_code_list_by_market(self,sMarket):
ret = self.dynamicCall("GetCodeListByMarket(QString)", sMarket)
#0 장내 8 etf 10 코스닥
return ret
#기본함수 정의 끝
############# Tr 정의
def call_opw00001(self):
self._set_input_value("계좌번호","8091442811")
self._set_input_value("비밀번호","0000")
self._comm_rq_data("opw00001_req","opw00001",0,"2000")
def res_opw00001(self, strRecordName, strTrCode):
d2_deposit = self._get_comm_data(strTrCode, strRecordName, 0, "d+2추정예수금")
self.d2_deposit = Kiwoom.change_format(d2_deposit)
return self.d2_deposit
def call_opw00011(self):
self._set_input_value("계좌번호","8091442811")
self._set_input_value("비밀번호", "")
self._set_input_value("비밀번호입력매체구분", "00")
self._set_input_value("종목번호", "039490")
self._set_input_value("매수가격", "10000")
self._comm_rq_data("opw00011_req", "opw00011", 0, "2001")
def res_opw00011(self,strRecordName, strTrCode):
posimoney=str(abs(int(self._get_comm_data(strTrCode, strRecordName, 0, "미수불가주문가능금액"))))
self.posimoney=Kiwoom.change_format(posimoney)
return self.posimoney
def call_opw00018(self):
self._set_input_value("계좌번호","8091442811")
self._set_input_value("비밀번호", "")
self._set_input_value("비밀번호입력매체구분", "00")
self._set_input_value("조회구분", "1")
self._comm_rq_data("opw00018_req", "opw00018", 0, "2002")
def res_opw00018(self,strRecordName, strTrCode):
buyasset=str(abs(int(self._get_comm_data(strTrCode, strRecordName, 0, "총매입금액"))))
nowasset = str(abs(int(self._get_comm_data(strTrCode, strRecordName, 0, "총평가금액"))))
if buyasset=="":
buyasset=0
if nowasset=="":
nowasset=0
self.buyasset=Kiwoom.change_format(buyasset)
self.nowasset = Kiwoom.change_format(nowasset)
def call_opt10001(self,sRealKey):
self._set_input_value("종목코드",sRealKey)
self._comm_rq_data("opt10001_req","opt10001",0,"2003")
def res_opt10001(self, strRecordName, strTrCode):
self.opt1=self._get_comm_data(strTrCode, strRecordName, 0, "자본금")
self.opt2=self._get_comm_data(strTrCode, strRecordName, 0, "상장주식")
self.opt3=self._get_comm_data(strTrCode, strRecordName, 0, "신융비율")
self.opt4=self._get_comm_data(strTrCode, strRecordName, 0, "시가총액")
self.opt5=self._get_comm_data(strTrCode, strRecordName, 0, "외인소진율")
self.opt6=self._get_comm_data(strTrCode, strRecordName, 0, "PER")
self.opt7=self._get_comm_data(strTrCode, strRecordName, 0, "ROE")
self.opt8=self._get_comm_data(strTrCode, strRecordName, 0, "PBR")
self.opt9=self._get_comm_data(strTrCode, strRecordName, 0, "EV")
self.opt10=self._get_comm_data(strTrCode, strRecordName, 0, "BPS")
self.opt11= self._get_comm_data(strTrCode, strRecordName, 0, "매출액")
self.opt12=self._get_comm_data(strTrCode, strRecordName, 0, "영업이익")
self.opt13=self._get_comm_data(strTrCode, strRecordName, 0, "당기순이익")
def call_opt10085(self):
self._set_input_value("계좌번호", "8091442811")
self._comm_rq_data("opt10085_req","opt10085",0,"2004")
def res_opt10085(self, strRecordName, strTrCode):
self.opt85_1=[]
self.opt85_2 = []
self.opt85_3 = []
self.opt85_4 = []
self.opt85_r=self._get_repeat_cnt(strTrCode,strRecordName)
for i in range(0,self.opt85_r):
self.opt85_1.append(self._get_comm_data(strTrCode, strRecordName, i, "종목코드"))
self.opt85_2.append(str(abs(int(self._get_comm_data(strTrCode, strRecordName, i, "매입가")))))
self.opt85_3.append(str(abs(int(self._get_comm_data(strTrCode, strRecordName, i, "보유수량")))))
self.opt85_4.append(str(abs(int(self._get_comm_data(strTrCode, strRecordName, i, "현재가")))))
def call_opt10004(self,sRealKey):
self._set_input_value("종목코드", sRealKey)
self._comm_rq_data("opt10004_req", "opt10004", 0, "2005")
def res_opt10004(self, strRecordName, strTrCode):
self.opt04_1=self._get_comm_data(strTrCode,strRecordName,0,"매수최우선잔량")
self.opt04_2=self._get_comm_data(strTrCode, strRecordName, 0, "매도최우선잔량")
def call_opt10081(self,sRealKey):
self._set_input_value("종목코드", sRealKey)
self._set_input_value("기준일자", "20170807")
self._set_input_value("수정주가구분", "0")
self._comm_rq_data("opt10081_req", "opt10081", 0, "2006")
def res_opt10081(self, strRecordName, strTrCode):
self.opt81_r = self._get_repeat_cnt(strTrCode, strRecordName)
self.opt81_1=[]
self.opt81_2 = []
self.opt81_3 = []
self.opt81_4 = []
self.opt81_5 = []
self.opt81_6 = []
for i in range(0,self.opt81_r):
self.opt81_1.append(self._get_comm_data(strTrCode,strRecordName,i,"시가"))
self.opt81_2.append(self._get_comm_data(strTrCode, strRecordName, i, "고가"))
self.opt81_3.append(self._get_comm_data(strTrCode, strRecordName, i, "저가"))
self.opt81_4.append(self._get_comm_data(strTrCode, strRecordName, i, "현재가"))
self.opt81_5.append(self._get_comm_data(strTrCode, strRecordName, i, "거래량"))
self.opt81_6.append(self._get_comm_data(strTrCode, strRecordName, i, "일자"))
def res_set_real2(self,ScrNo):
ret=self._set_real_reg(ScrNo, "015760;161890;161390;000240;047810;060980;008930;128940;009240;020000;105630;014680;004710;018880;009420;003300;051600;052690;097230;000880;088350;009830;012450;000720;005440;086280;267250;064350;079430;012330;010620;069960;012630;017800;011210;004020;009540;005380;001450;057050;008770;004800;093370;069260", "13;20;27;28;23;930;931;951;901;904;9203;911;910;9001", "1")
return ret
def res_set_real3(self,ScrNo):
ret=self._set_real_reg(ScrNo, "006840;027410;138930;001040;079160;000120;097950;114090;078930;006360;007070;001060;096760;105560;002380;030200;033780;093050;003550;034220;001120;051900;032640;011070;066570;108670;051910;079550;006260;010120;035420;005940;010060;005490;064960;010950;034120;034730;011790;001740;096770;006120;017670;000660;005610;035250;000050;010130;002240;009290;011780;073240;000270;024110;003920;025860;002350;251270;006280;005250;004370;019680;008060;000210;001680;047040;069620;006650;003490;001230;000990;005830;026960;000640;170900;007340;001520;049770;014820;000150;042670;034020;115390;023530;004000;004990;005300;011170;002270;204320;008560;033920;006800;003850", "13;20;27;28;23;930;931;951;901;904;9203;911;910;9001", "1")
return ret
def res_set_real4(self,ScrNo):
ret=self._set_real_reg(ScrNo, "003000;005180;006400;028260;207940;032830;018260;028050;009150;005930;010140;016360;029780;000810;145990;000070;004490;001430;003030;029530;004170;055550;003410;003620;002790;090430;010780;001780;005850;012750;078520;036570;111770;003520;000670;007310;271560;001800;000030;014830;000100;214320;139480;007570;020150;030000;002620;185750;192820;120110;021240;192400;003240;036580;028670;047050;103140;086790;000080;036460;071050;025540;002960", "13;20;27;28;23;930;931;951;901;904;9203;911;910;9001", "1")
return ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment