pystock
https://wikibook.co.kr/pystock/
https://github.com/programgarden
https://www.youtube.com/channel/UCq7fsrxP6oi6vnYgPkw92jg/videos
https://alongwaytogo.tistory.com/175
종가배팅
https://alongwaytogo.tistory.com/223?category=829941
급등 단타 조건식
https://alongwaytogo.tistory.com/175
키움 검색식 모음
https://m.blog.naver.com/ed3802/20054296035
https://junyeopbucketlist30.blogspot.com/2017/12/03.html
https://github.com/matplotlib/mplfinance#newapi
画k线图
https://github.com/matplotlib/mplfinance/blob/master/examples/addplot.ipynb
https://github.com/matplotlib/mplfinance/blob/master/examples/customization_and_styles.ipynb
QT disiner 路径
C:\ProgramData\Anaconda3\envs\py3-32\Lib\site-packages\pyqt5_tools\Qt\bin
pip install mplfinance
import mplfinance as mpf
mpf.plot(daily,volume=True,savefig=dict(fname='img/list005.png',dpi=100,pad_inches=0.25)) #显示并保存图片 不支持jpg 格式
pandas
df = pd.DataFrame(columns=('time' , 'open' , 'close' , 'high' , 'low')) #创建空的DataFrame
df = df.append([{'time':m_time, 'open':m_open , 'close':m_close , 'high':m_high , 'low':m_low}], ignore_index=True)#添加数据
df = df.rename(columns={"date":"Date","open":"Open","close":"Close","high":"High","low":"Low","volume":"Volume"})#改列名 第一个大写
df = df.set_index("Date") #设置index
df = df.drop(columns=['code']) #删除Code列
df = df[["Open", "High", "Low", "Close", "Volume"]] # 调整列顺序 dates,opens,highs,lows,closes,volumes
pycham 激活码
https://songzixian.com/windowstooluse/1187.html
QYYBAC9D3J-eyJsaWNlbnNlSWQiOiJRWVlCQUM5RDNKIiwibGljZW5zZWVOYW1lIjoi6LaF57qnIOeoi+W6j+WRmCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMC0wMS0wNCIsInBhaWRVcFRvIjoiMjAyMS0wMS0wMyJ9LHsiY29kZSI6IkFDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMC0wMS0wNCIsInBhaWRVcFRvIjoiMjAyMS0wMS0wMyJ9LHsiY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMjAtMDEtMDQiLCJwYWlkVXBUbyI6IjIwMjEtMDEtMDMifSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjAtMDEtMDQiLCJwYWlkVXBUbyI6IjIwMjEtMDEtMDMifSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjAtMDEtMDQiLCJwYWlkVXBUbyI6IjIwMjEtMDEtMDMifSx7ImNvZGUiOiJETSIsImZhbGxiYWNrRGF0ZSI6IjIwMjAtMDEtMDQiLCJwYWlkVXBUbyI6IjIwMjEtMDEtMDMifSx7ImNvZGUiOiJDTCIsImZhbGxiYWNrRGF0ZSI6IjIwMjAtMDEtMDQiLCJwYWlkVXBUbyI6IjIwMjEtMDEtMDMifSx7ImNvZGUiOiJSUzAiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiUkMiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiUkQiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiUEMiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiUk0iLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiV1MiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiREIiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiREMiLCJmYWxsYmFja0RhdGUiOiIyMDIwLTAxLTA0IiwicGFpZFVwVG8iOiIyMDIxLTAxLTAzIn0seyJjb2RlIjoiUlNVIiwiZmFsbGJhY2tEYXRlIjoiMjAyMC0wMS0wNCIsInBhaWRVcFRvIjoiMjAyMS0wMS0wMyJ9XSwiaGFzaCI6IjE2MDgwOTA5LzAiLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-I7c5mu4hUCMxcldrwZEJMaT+qkrzrF1bjJi0i5QHcrRxk2LO0jqzUe2fBOUR4L+x+7n6kCwAoBBODm9wXst8dWLXdq179EtjU3rfJENr1wXGgtef//FNow+Id5iRufJ4W+p+3s5959GSFibl35YtbELELuCUH2IbCRly0PUBjitgA0r2y+9jV5YD/dmrd/p4C87MccC74NxtQfRdeUEGx87vnhsqTFH/sP4C2VljSo/F/Ft9JqsSlGfwSKjzU8BreYt1QleosdMnMK7a+fkfxh7n5zg4DskdVlNbfe6jvYgMVE16DMXd6F1Zhwq+lrmewJA2jPToc+H5304rcJfa9w==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow== |
条件搜索
kiwoomStart.bat
1 @ECHO ON 2 title Kiwoom Start 3 4 cd C:\Users\USER\PycharmProjects\week1 5 6 call activate py37_32 7 python __init__.py 8 9 cmd.exe
__init__.py
1 import sys 2 from kiwoom.kiwoom import * 3 from PyQt5.QtWidgets import * 4 5 class Main(): 6 def __init__(self): 7 print("Main() start") 8 self.app = QApplication(sys.argv) 9 self.kiwoom = Kiwoom() 10 self.app.exec_() 11 12 if __name__ == "__main__": 13 Main()
config/logging.conf
1 [loggers] 2 keys=root, Kiwoom 3 4 [handlers] 5 keys=consoleHandler 6 7 [formatters] 8 keys=consoleFormatter 9 10 [logger_root] 11 level=DEBUG 12 handlers=consoleHandler 13 14 [logger_Kiwoom] 15 level=DEBUG 16 handlers=consoleHandler 17 qualname=Kiwoom 18 propagate=0 19 20 [handler_consoleHandler] 21 class=StreamHandler 22 level=DEBUG 23 formatter=consoleFormatter 24 args=(sys.stdout,) 25 26 [formatter_consoleFormatter] 27 format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s 28 datefmt=
config/errorCode.py
1 def errors(err_code): 2 err_dic = {0:('OP_ERR_NONE', '정상처리'), 3 -10:('OP_ERR_FAIL', '실패'), 4 -100:('OP_ERR_LOGIN', '사용자정보교환실패'), 5 -101:('OP_ERR_CONNECT', '서버접속실패'), 6 -102:('OP_ERR_VERSION', '버전처리실패'), 7 -103:('OP_ERR_FIREWALL', '개인방화벽실패'), 8 -104:('OP_ERR_MEMORY', '메모리보호실패'), 9 -105:('OP_ERR_INPUT', '함수입력값오류'), 10 -106:('OP_ERR_SOCKET_CLOSED', '통신연결종료'), 11 -200:('OP_ERR_SISE_OVERFLOW', '시세조회과부하'), 12 -201:('OP_ERR_RQ_STRUCT_FAIL', '전문작성초기화실패'), 13 -202:('OP_ERR_RQ_STRING_FAIL', '전문작성입력값오류'), 14 -203:('OP_ERR_NO_DATA', '데이터없음'), 15 -204:('OP_ERR_OVER_MAX_DATA', '조회가능한종목수초과'), 16 -205:('OP_ERR_DATA_RCV_FAIL', '데이터수신실패'), 17 -206:('OP_ERR_OVER_MAX_FID', '조회가능한FID수초과'), 18 -207:('OP_ERR_REAL_CANCEL', '실시간해제오류'), 19 -300:('OP_ERR_ORD_WRONG_INPUT', '입력값오류'), 20 -301:('OP_ERR_ORD_WRONG_ACCTNO', '계좌비밀번호없음'), 21 -302:('OP_ERR_OTHER_ACC_USE', '타인계좌사용오류'), 22 -303:('OP_ERR_MIS_2BILL_EXC', '주문가격이20억원을초과'), 23 -304:('OP_ERR_MIS_5BILL_EXC', '주문가격이50억원을초과'), 24 -305:('OP_ERR_MIS_1PER_EXC', '주문수량이총발행주수의1 % 초과오류'), 25 -306:('OP_ERR_MIS_3PER_EXC', '주문수량은총발행주수의3 % 초과오류'), 26 -307:('OP_ERR_SEND_FAIL', '주문전송실패'), 27 -308:('OP_ERR_ORD_OVERFLOW', '주문전송과부하'), 28 -309:('OP_ERR_MIS_300CNT_EXC', '주문수량300계약초과'), 29 -310:('OP_ERR_MIS_500CNT_EXC', '주문수량500계약초과'), 30 -340:('OP_ERR_ORD_WRONG_ACCTINFO', '계좌정보없음'), 31 -500:('OP_ERR_ORD_SYMCODE_EMPTY', '종목코드없음') 32 } 33 result = err_dic[err_code] 34 return result
config/kiwoomType.py
1 class RealType(object): 2 SENDTYPE = { 3 '거래구분': { 4 '지정가': '00', 5 '시장가': '03', 6 '조건부지정가': '05', 7 '최유리지정가': '06', 8 '최우선지정가': '07', 9 '지정가IOC': '10', 10 '시장가IOC': '13', 11 '최유리IOC': '16', 12 '지정가FOK': '20', 13 '시장가FOK': '23', 14 '최유리FOK': '26', 15 '장전시간외종가': '61', 16 '시간외단일가매매': '62', 17 '장후시간외종가': '81' 18 } 19 } 20 21 REALTYPE = { 22 '주식시세': { 23 '현재가': 10, 24 '전일대비': 11, 25 '등락율': 12, 26 '(최우선)매도호가': 27, 27 '(최우선)매수호가': 28, 28 '누적거래량': 13, 29 '누적거래대금': 14, 30 '시가': 16, 31 '고가': 17, 32 '저가': 18, 33 '전일대비기호': 25, 34 '전일거래량대비(계약,주)': 26, 35 '거래대금증감': 29, 36 '전일거래량대비(비율)': 30, 37 '거래회전율': 31, 38 '거래비용': 32, 39 '시가총액(억)': 311, 40 '상한가발생시간': 567, 41 '하한가발생시간': 568 42 }, 43 44 '주식체결': { 45 '체결시간': 20, 46 '현재가': 10, #체결가 47 '전일대비': 11, 48 '등락율': 12, 49 '(최우선)매도호가': 27, 50 '(최우선)매수호가': 28, 51 '거래량': 15, 52 '누적거래량': 13, 53 '누적거래대금': 14, 54 '시가': 16, 55 '고가': 17, 56 '저가': 18, 57 '전일대비기호': 25, 58 '전일거래량대비': 26, 59 '거래대금증감': 29, 60 '전일거래량대비': 30, 61 '거래회전율': 31, 62 '거래비용': 32, 63 '체결강도': 228, 64 '시가총액(억)': 311, 65 '장구분': 290, 66 'KO접근도': 691, 67 '상한가발생시간': 567, 68 '하한가발생시간': 568 69 }, 70 71 72 '주식호가잔량':{ 73 '호가시간':21, 74 '매도호가1':41, 75 '매도호가수량1':61, 76 '매수호가1':51, 77 '매수호가수량1':71, 78 '매도호가2':42, 79 '매도호가수량2':62, 80 '매수호가2':52, 81 '매수호가수량2':72, 82 '매도호가3':43, 83 '매도호가수량3':63, 84 '매수호가3':53, 85 '매수호가수량3':73, 86 '매도호가4':44, 87 '매도호가수량4':64, 88 '매수호가4':54, 89 '매수호가수량4':74, 90 '매도호가5':45, 91 '매도호가수량5':65, 92 '매수호가5':55, 93 '매수호가수량5':75, 94 '매도호가6':46, 95 '매도호가수량6':66, 96 '매수호가6':56, 97 '매수호가수량6':76, 98 '매도호가7':47, 99 '매도호가수량7':67, 100 '매수호가7':57, 101 '매수호가수량7':77, 102 '매도호가8':48, 103 '매도호가수량8':68, 104 '매수호가8':58, 105 '매수호가수량8':78, 106 '매도호가9':49, 107 '매도호가수량9':69, 108 '매수호가9':59, 109 '매수호가수량9':79, 110 '매도호가10':50, 111 '매도호가수량10':70, 112 '매수호가10':60, 113 '매수호가수량10':80, 114 '매도호가총잔량':121, 115 '매수호가총잔량':125, 116 # '순매수잔량':128, 117 # '순매도잔량':138, 118 # '매수비율':129, 119 # '매도비율':139 120 }, 121 122 # 장운영구분(FID 215번) 123 # 0: 장시작전 124 # 2: 장마감전 동시호가 125 # 3: 장시작 126 # 4: 장종료 예상지수종료 127 # 8: 장마감 128 # 9: 장종료 - 시간외종료 129 # a: 시간외 종가매매 시작 130 # b: 시간외 종가매매 종료 131 # c: 시간외 단일가 매매시작 132 # d: 시간외 단일가 매매종료 133 # s: 선옵 장마감전 동시호가 시작 134 # e: 선옵 장마감전 동시호가 종료 135 '장시작시간': { 136 '장운영구분': 215, 137 '시간': 20, #(HHMMSS) 138 '장시작예상잔여시간':214 139 }, 140 141 '주문체결': { 142 '계좌번호': 9201, 143 '주문번호': 9203, 144 '관리자사번': 9205, 145 '종목코드': 9001, 146 '주문업무분류': 912, #(jj:주식주문) 147 '주문상태': 913, #(접수, 확인, 체결) (10:원주문, 11:정정주문, 12:취소주문, 20:주문확인, 21:정정확인, 22:취소확인, 90,92:주문거부) #https://bbn.kiwoom.com/bbn.openAPIQnaBbsDetail.do 148 '종목명': 302, 149 '주문수량': 900, 150 '주문가격': 901, 151 '미체결수량': 902, 152 '체결누계금액': 903, 153 '원주문번호': 904, 154 '주문구분': 905, #(+매수, -매도, -매도정정, +매수정정, 매수취소, 매도취소) 155 '매매구분': 906, #(보통, 시장가등) 156 '매도수구분': 907, # 매도(매도정정, 매도취도 포함)인 경우 1, 매수(매수정정, 매수취소 포함)인 경우 2 157 '주문/체결시간': 908, #(HHMMSS) 158 '체결번호': 909, 159 '체결가': 910, 160 '체결량': 911, 161 '현재가': 10, 162 '(최우선)매도호가': 27, 163 '(최우선)매수호가': 28, 164 '단위체결가': 914, 165 '단위체결량': 915, 166 '당일매매수수료': 938, 167 '당일매매세금': 939, 168 '거부사유': 919, 169 '화면번호': 920, 170 '터미널번호': 921, 171 '신용구분(실시간 체결용)': 922, 172 '대출일(실시간 체결용)': 923, 173 }, 174 175 '매도수구분': { 176 '1': '매도', 177 '2': '매수' 178 }, 179 180 '잔고': { 181 '계좌번호': 9201, 182 '종목코드': 9001, 183 '종목명': 302, 184 '현재가': 10, 185 '보유수량': 930, 186 '매입단가': 931, 187 '총매입가': 932, 188 '주문가능수량': 933, 189 '당일순매수량': 945, 190 '매도매수구분': 946, 191 '당일총매도손익': 950, 192 '예수금': 951, 193 '(최우선)매도호가': 27, 194 '(최우선)매수호가': 28, 195 '기준가': 307, 196 '손익율': 8019 197 }, 198 }
config/log_class.py
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import logging.config 5 from datetime import datetime 6 7 class Logging(): 8 def __init__(self, config_path='config/logging.conf', log_path='log'): 9 self.config_path = config_path 10 self.log_path = log_path 11 12 logging.config.fileConfig(self.config_path) 13 self.logger = logging.getLogger('Kiwoom') 14 self.kiwoom_log() 15 16 #로그설정 17 def kiwoom_log(self): 18 fh = logging.FileHandler(self.log_path+'/{:%Y-%m-%d}.log'.format(datetime.now()), encoding="utf-8") 19 formatter = logging.Formatter('[%(asctime)s] I %(filename)s | %(name)s-%(funcName)s-%(lineno)04d I %(levelname)-8s > %(message)s') 20 21 fh.setFormatter(formatter) 22 self.logger.addHandler(fh)
kiwoom/kiwoom.py
1 from PyQt5.QAxContainer import * 2 from PyQt5.QtCore import * 3 from config.errorCode import * 4 from PyQt5.QtTest import * 5 from config.kiwoomType import * 6 from config.log_class import * 7 8 class Kiwoom(QAxWidget): 9 def __init__(self): 10 super().__init__() 11 self.realType = RealType() 12 self.logging = Logging() 13 14 self.logging.logger.debug("Kiwoom() class start.") 15 16 ####### event loop를 실행하기 위한 변수모음 17 self.login_event_loop = None #로그인을 이벤트 루프 안에서 실행하도록 만들기 위해 선언한 변수 18 ######################################### 19 20 ########### 전체 종목 관리 21 self.all_stock_dict = {} 22 ########################### 23 24 ####### 계좌 관련된 변수 25 self.account_stock_dict = {} 26 self.not_account_stock_dict = {} 27 ######################################## 28 29 ######## 종목 정보 가져오기 30 self.portfolio_stock_dict = {} 31 self.jango_dict = {} 32 ######################## 33 34 ########### 종목 분석 용 35 self.calcul_data = [] 36 ########################################## 37 38 ####### 요청 스크린 번호 39 self.screen_start_stop_real = "1000" #장 시작/종료 실시간 스크린번호 40 ######################################## 41 42 ######### 초기 셋팅 함수들 바로 실행 43 self.get_ocx_instance() #Ocx 방식을 파이썬에 사용할 수 있게 변환해 주는 함수 실행 44 self.event_slots() #키움과 연결하기 위한 signal / slot 모음 함수 실행 45 self.signal_login_commConnect() #로그인 시도 함수 실행 46 47 self.condition_event_slot() 48 self.condition_signal() 49 ######################################### 50 51 def get_ocx_instance(self): 52 self.setControl("KHOPENAPI.KHOpenAPICtrl.1") 53 54 def event_slots(self): 55 self.OnEventConnect.connect(self.login_slot) 56 self.OnReceiveMsg.connect(self.msg_slot) 57 58 def signal_login_commConnect(self): 59 self.dynamicCall("CommConnect()") 60 self.login_event_loop = QEventLoop() 61 self.login_event_loop.exec_() 62 63 def login_slot(self, err_code): 64 self.logging.logger.debug(errors(err_code)[1]) 65 self.login_event_loop.exit() 66 67 def stop_screen_cancel(self, sScrNo=None): 68 self.dynamicCall("DisconnectRealData(QString)", sScrNo) 69 70 #송수신 메세지 get 71 def msg_slot(self, sScrNo, sRQName, sTrCode, msg): 72 self.logging.logger.debug("스크린: %s, 요청이름: %s, tr코드: %s --- %s" %(sScrNo, sRQName, sTrCode, msg)) 73 74 #조건검색식 이벤트 모음 75 def condition_event_slot(self): 76 self.OnReceiveConditionVer.connect(self.condition_slot) 77 self.OnReceiveTrCondition.connect(self.condition_tr_slot) 78 self.OnReceiveRealCondition.connect(self.condition_real_slot) 79 80 # 어떤 조건식이 있는지 확인 81 def condition_slot(self, lRet, sMsg): 82 self.logging.logger.debug("호출 성공 여부 %s, 호출결과 메시지 %s" % (lRet, sMsg)) 83 condition_name_list = self.dynamicCall("GetConditionNameList()") 84 85 self.logging.logger.debug("HTS의 조건검색식 이름 가져오기 %s" % condition_name_list) 86 condition_name_list = condition_name_list.split(";")[:-1] 87 88 for unit_condition in condition_name_list: 89 index = unit_condition.split("^")[0] 90 index = int(index) 91 condition_name = unit_condition.split("^")[1] 92 self.logging.logger.debug("조건식 분리 번호: %s, 이름: %s" % (index, condition_name)) 93 ok = self.dynamicCall("SendCondition(QString, QString, int, int)", "0156", condition_name, index, 1) #조회요청 + 실시간 조회 94 self.logging.logger.debug("조회 성공여부 %s " % ok) 95 96 # 조건식 로딩 하기 97 def condition_signal(self): 98 self.dynamicCall("GetConditionLoad()") 99 100 # 나의 조건식에 해당하는 종목코드 받기 101 def condition_tr_slot(self, sScrNo, strCodeList, strConditionName, index, nNext): 102 self.logging.logger.debug("화면번호: %s, 종목코드 리스트: %s, 조건식 이름: %s, 조건식 인덱스: %s, 연속조회: %s" % (sScrNo, strCodeList, strConditionName, index, nNext)) 103 104 code_list = strCodeList.split(";")[:-1] 105 self.logging.logger.debug("코드 종목 \n %s" % code_list) 106 107 # 조건식 실시간으로 받기 108 def condition_real_slot(self, strCode, strType, strConditionName, strConditionIndex): 109 self.logging.logger.debug("종목코드: %s, 이벤트종류: %s, 조건식이름: %s, 조건명인덱스: %s" % (strCode, strType, strConditionName, strConditionIndex)) 110 111 if strType == "I": 112 self.logging.logger.debug("종목코드: %s, 종목편입: %s" % (strCode, strType)) 113 114 elif strType == "D": 115 self.logging.logger.debug("종목코드: %s, 종목이탈: %s" % (strCode, strType))