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))

 

posted @ 2020-05-05 19:40  kingboy100  阅读(641)  评论(0编辑  收藏  举报