def tickets(): form = dict(request.form.lists()) for k, v in form.items(): content = [s for s in v if s != ''] if len(content) > 0: form[k] = content[0] else: form[k] = '' print('form:\n', form) preference = {} preference['num_tickets'] = safe_cast(form, 'num', 3, True) # cast to int preference['time'] = safe_cast(form, 'time', "13:00") preference['date'] = safe_cast(form, 'date', "2020-05-05") preference['zip'] = safe_cast(form, 'zip_code', "10003") preference['self_input'] = safe_cast(form, 'self_input', "4 star cinema") mname = safe_cast(session, 'mname', "Trolls World Tour") pprint(preference) update_purchase(conn, preference) showings = filter_shows(mname, preference, conn) return render_template("tickets.html", len=len(showings), showings=showings, mname=mname, mid=session['mid'])
def _opt10085(self, rqname, trcode): """계좌수익률요청 :param 계좌번호: 계좌번호 :param kwargs: :return: """ # list_item_name = ["종목코드", "종목명", "현재가", "매입가", "보유수량"] cnt = self._get_repeat_cnt(trcode, rqname) for i in range(cnt): code = self._comm_get_data(trcode, "", rqname, 0, "종목코드") name = self._comm_get_data(trcode, "", rqname, 0, "종목명") current_price = self._comm_get_data(trcode, "", rqname, 0, "현재가") buying_price = self._comm_get_data(trcode, "", rqname, 0, "매입가") chejan = self._comm_get_data(trcode, "", rqname, 0, "보유수량") profit_dict = {} profit_dict["code"] = code profit_dict["name"] = name profit_dict["buying_price"] = abs(util.safe_cast(buying_price, int, 0)) profit_dict["current_price"] = abs(util.safe_cast(current_price, int, 0)) profit_dict["chejan"] = abs(util.safe_cast(chejan, int, 0)) self.profit_dict[code] = profit_dict
def _receive_chejan_data(self, sGubun, nItemCnt, sFIdList, **kwargs): print("체결/잔고: %s %s %s" % (sGubun, nItemCnt, sFIdList)) if sGubun == '0': list_item_name = ["계좌번호", "주문번호", "관리자사번", "종목코드", "주문업무분류", "주문상태", "종목명", "주문수량", "주문가격", "미체결수량", "체결누계금액", "원주문번호", "주문구분", "매매구분", "매도수구분", "주문체결시간", "체결번호", "체결가", "체결량", "현재가", "매도호가", "매수호가", "단위체결가", "단위체결량", "당일매매수수료", "당일매매세금", "거부사유", "화면번호", "터미널번호", "신용구분", "대출일"] list_item_id = [9201, 9203, 9205, 9001, 912, 913, 302, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 10, 27, 28, 914, 915, 938, 939, 919, 920, 921, 922, 923] dict_contract = {item_name: self._get_chejan_data(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id)} # 종목코드에서 'A' 제거 item_code = dict_contract["종목코드"] if 'A' <= item_code[0] <= 'Z' or 'a' <= item_code[0] <= 'z': item_code = item_code[1:] dict_contract["종목코드"] = item_code # 종목을 대기 리스트에서 제거 if '종목코드' in self.set_stock_ordered: self.set_stock_ordered.remove('종목코드') # 매수 체결일 경우 보유종목에 빈 dict 추가 (키만 추가하기 위해) if "매수" in dict_contract["주문구분"]: self.dict_holding[item_code] = {} # 매도 체결일 경우 보유종목에서 제거 else: self.dict_holding.pop(item_code, None) print("체결: %s" % (dict_contract,)) if sGubun == '1': list_item_name = ["계좌번호", "종목코드", "신용구분", "대출일", "종목명", "현재가", "보유수량", "매입단가", "총매입가", "주문가능수량", "당일순매수량", "매도매수구분", "당일총매도손일", "예수금", "매도호가", "매수호가", "기준가", "손익율", "신용금액", "신용이자", "만기일", "당일실현손익", "당일실현손익률", "당일실현손익_신용", "당일실현손익률_신용", "담보대출수량", "기타"] list_item_id = [9201, 9001, 917, 916, 302, 10, 930, 931, 932, 933, 945, 946, 950, 951, 27, 28, 307, 8019, 957, 958, 918, 990, 991, 992, 993, 959, 924] dict_holding = {item_name: self._get_chejan_data(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id)} dict_holding["현재가"] = util.safe_cast(dict_holding["현재가"], int, 0) dict_holding["보유수량"] = util.safe_cast(dict_holding["보유수량"], int, 0) dict_holding["매입단가"] = util.safe_cast(dict_holding["매입단가"], int, 0) dict_holding["총매입가"] = util.safe_cast(dict_holding["총매입가"], int, 0) dict_holding["주문가능수량"] = util.safe_cast(dict_holding["주문가능수량"], int, 0) # 종목코드에서 'A' 제거 item_code = dict_holding["종목코드"] if 'A' <= item_code[0] <= 'Z' or 'a' <= item_code[0] <= 'z': item_code = item_code[1:] dict_holding["종목코드"] = item_code # 보유종목 리스트에 추가 self.dict_holding[item_code] = dict_holding print("잔고: %s" % (dict_holding,))
def kiwoom_OnReceiveChejanData(self, sGubun, nItemCnt, sFIdList, **kwargs): """주문접수, 체결, 잔고발생시 :param sGubun: 체결구분 접수와 체결시 '0'값, 국내주식 잔고전달은 '1'값, 파생잔고 전달은 '4" :param nItemCnt: :param sFIdList: "9201" : "계좌번호" "9203" : "주문번호" "9001" : "종목코드" "913" : "주문상태" "302" : "종목명" "900" : "주문수량" "901" : "주문가격" "902" : "미체결수량" "903" : "체결누계금액" "904" : "원주문번호" "905" : "주문구분" "906" : "매매구분" "907" : "매도수구분" "908" : "주문/체결시간" "909" : "체결번호" "910" : "체결가" "911" : "체결량" "10" : "현재가" "27" : "(최우선)매도호가" "28" : "(최우선)매수호가" "914" : "단위체결가" "915" : "단위체결량" "919" : "거부사유" "920" : "화면번호" "917" : "신용구분" "916" : "대출일" "930" : "보유수량" "931" : "매입단가" "932" : "총매입가" "933" : "주문가능수량" "945" : "당일순매수수량" "946" : "매도/매수구분" "950" : "당일총매도손일" "951" : "예수금" "307" : "기준가" "8019" : "손익율" "957" : "신용금액" "958" : "신용이자" "918" : "만기일" "990" : "당일실현손익(유가)" "991" : "당일실현손익률(유가)" "992" : "당일실현손익(신용)" "993" : "당일실현손익률(신용)" "397" : "파생상품거래단위" "305" : "상한가" "306" : "하한가" :param kwargs: :return: """ logger.debug("체결/잔고: %s %s %s" % (sGubun, nItemCnt, sFIdList)) if sGubun == '0': list_item_name = [ "계좌번호", "주문번호", "관리자사번", "종목코드", "주문업무분류", "주문상태", "종목명", "주문수량", "주문가격", "미체결수량", "체결누계금액", "원주문번호", "주문구분", "매매구분", "매도수구분", "주문체결시간", "체결번호", "체결가", "체결량", "현재가", "매도호가", "매수호가", "단위체결가", "단위체결량", "당일매매수수료", "당일매매세금", "거부사유", "화면번호", "터미널번호", "신용구분", "대출일" ] list_item_id = [ 9201, 9203, 9205, 9001, 912, 913, 302, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 10, 27, 28, 914, 915, 938, 939, 919, 920, 921, 922, 923 ] dict_contract = { item_name: self.kiwoom_GetChejanData(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id) } # 종목코드에서 'A' 제거 종목코드 = dict_contract["종목코드"] if 'A' <= 종목코드[0] <= 'Z' or 'a' <= 종목코드[0] <= 'z': 종목코드 = 종목코드[1:] dict_contract["종목코드"] = 종목코드 # 종목을 대기 리스트에서 제거 #if 종목코드 in self.set_stock_ordered: # self.set_stock_ordered.remove(종목코드) # 매수 체결일 경우 보유종목에 빈 dict 추가 (키만 추가하기 위해) if "매수" in dict_contract["주문구분"]: self.dict_holding[종목코드] = {} # 매도 체결일 경우 보유종목에서 제거 else: self.dict_holding.pop(종목코드, None) logger.debug("체결: %s" % (dict_contract, )) if sGubun == '1': list_item_name = [ "계좌번호", "종목코드", "신용구분", "대출일", "종목명", "현재가", "보유수량", "매입단가", "총매입가", "주문가능수량", "당일순매수량", "매도매수구분", "당일총매도손일", "예수금", "매도호가", "매수호가", "기준가", "손익율", "신용금액", "신용이자", "만기일", "당일실현손익", "당일실현손익률", "당일실현손익_신용", "당일실현손익률_신용", "담보대출수량", "기타" ] list_item_id = [ 9201, 9001, 917, 916, 302, 10, 930, 931, 932, 933, 945, 946, 950, 951, 27, 28, 307, 8019, 957, 958, 918, 990, 991, 992, 993, 959, 924 ] dict_holding = { item_name: self.kiwoom_GetChejanData(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id) } dict_holding["현재가"] = util.safe_cast(dict_holding["현재가"], int, 0) dict_holding["보유수량"] = util.safe_cast(dict_holding["보유수량"], int, 0) dict_holding["매입단가"] = util.safe_cast(dict_holding["매입단가"], int, 0) dict_holding["총매입가"] = util.safe_cast(dict_holding["총매입가"], int, 0) dict_holding["주문가능수량"] = util.safe_cast(dict_holding["주문가능수량"], int, 0) # 종목코드에서 'A' 제거 종목코드 = dict_holding["종목코드"] if 'A' <= 종목코드[0] <= 'Z' or 'a' <= 종목코드[0] <= 'z': 종목코드 = 종목코드[1:] dict_holding["종목코드"] = 종목코드 # 보유종목 리스트에 추가 self.dict_holding[종목코드] = dict_holding logger.debug("잔고: %s" % (dict_holding, ))
def kiwoom_OnReceiveTrData(self, sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg, **kwargs): """TR 요청에 대한 결과 수신 데이터 얻어오기 위해 내부에서 GetCommData() 호출 GetCommData( BSTR strTrCode, // TR 이름 BSTR strRecordName, // 레코드이름 long nIndex, // TR반복부 BSTR strItemName) // TR에서 얻어오려는 출력항목이름 :param sScrNo: 화면번호 :param sRQName: 사용자 구분명 :param sTRCode: TR이름 :param sRecordName: 레코드 이름 :param sPreNext: 연속조회 유무를 판단하는 값 0: 연속(추가조회)데이터 없음, 2:연속(추가조회) 데이터 있음 :param nDataLength: 사용안함 :param sErrorCode: 사용안함 :param sMessage: 사용안함 :param sSPlmMsg: 사용안함 :param kwargs: :return: """ if sRQName == "예수금상세현황요청": self.int_주문가능금액 = int( self.kiwoom_GetCommData(sTRCode, sRQName, 0, "주문가능금액")) logger.debug("예수금상세현황요청: %s" % (self.int_주문가능금액, )) if "예수금상세현황요청" in self.dict_callback: self.dict_callback["예수금상세현황요청"](self.int_주문가능금액) elif sRQName == "주식기본정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락율", "거래량"] 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() dict_stock = self.dict_stock.get(종목코드, {}) for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value self.dict_stock[종목코드] = dict_stock logger.debug("주식기본정보: %s, %s" % (종목코드, dict_stock)) if "주식기본정보" in self.dict_callback: self.dict_callback["주식기본정보"](dict_stock) elif sRQName == "시세표성정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락률", "거래량"] dict_stock = {} for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value if "시세표성정보" in self.dict_callback: self.dict_callback["시세표성정보"](dict_stock) elif sRQName == "주식분봉차트조회" or sRQName == "주식일봉차트조회": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() done = False # 파라미터 처리 플래그 result = self.result.get('result', []) cnt_acc = len(result) list_item_name = [] if sRQName == '주식분봉차트조회': # list_item_name = ["현재가", "거래량", "체결시간", "시가", "고가", # "저가", "수정주가구분", "수정비율", "대업종구분", "소업종구분", # "종목정보", "수정주가이벤트", "전일종가"] list_item_name = ["체결시간", "시가", "고가", "저가", "현재가", "거래량"] elif sRQName == '주식일봉차트조회': list_item_name = ["일자", "시가", "고가", "저가", "현재가", "거래량"] for nIdx in range(cnt): item = {'종목코드': 종목코드} for item_name in list_item_name: item_value = self.kiwoom_GetCommData( sTRCode, sRQName, nIdx, item_name) item_value = item_value.strip() item[item_name] = item_value # 범위조회 파라미터 date_from = int(self.params.get("date_from", "000000000000")) date_to = int(self.params.get("date_to", "999999999999")) # 결과는 최근 데이터에서 오래된 데이터 순서로 정렬되어 있음 date = None if sRQName == '주식분봉차트조회': date = int(item["체결시간"]) elif sRQName == '주식일봉차트조회': date = int(item["일자"]) if date > date_to: continue elif date < date_from: done = True break # 개수 파라미터처리 if cnt_acc + nIdx >= self.params.get('size', float("inf")): done = True break result.append(util.convert_kv(item)) # 차트 업데이트 self.result['result'] = result if not done and cnt > 0 and sPreNext == '2': self.result['nPrevNext'] = 2 self.result['done'] = False else: # 연속조회 완료 logger.debug("차트 연속조회완료") self.result['nPrevNext'] = 0 self.result['done'] = True elif sRQName == "업종일봉조회": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) 업종코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "업종코드") 업종코드 = 업종코드.strip() done = False # 파라미터 처리 플래그 result = self.result.get('result', []) cnt_acc = len(result) list_item_name = [] if sRQName == '업종일봉조회': list_item_name = ["일자", "시가", "고가", "저가", "현재가", "거래량"] for nIdx in range(cnt): item = {'업종코드': 업종코드} for item_name in list_item_name: item_value = self.kiwoom_GetCommData( sTRCode, sRQName, nIdx, item_name) item_value = item_value.strip() item[item_name] = item_value # 결과는 최근 데이터에서 오래된 데이터 순서로 정렬되어 있음 date = int(item["일자"]) # 범위조회 파라미터 처리 date_from = int(self.params.get("date_from", "000000000000")) date_to = int(self.params.get("date_to", "999999999999")) if date > date_to: continue elif date < date_from: done = True break # 개수 파라미터처리 if cnt_acc + nIdx >= self.params.get('size', float("inf")): done = True # break result.append(util.convert_kv(item)) # 차트 업데이트 self.result['result'] = result if not done and cnt > 0 and sPreNext == '2': self.result['nPrevNext'] = 2 self.result['done'] = False else: # 연속조회 완료 logger.debug("차트 연속조회완료") self.result['nPrevNext'] = 0 self.result['done'] = True elif sRQName == "계좌수익률요청": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) assert self.dict_holding is None # The request will set this to None. result = {} for nIdx in range(cnt): list_item_name = ["종목코드", "종목명", "현재가", "매입가", "보유수량"] dict_holding = { item_name: self.kiwoom_GetCommData(sTRCode, sRQName, nIdx, item_name).strip() for item_name in list_item_name } dict_holding["현재가"] = util.safe_cast(dict_holding["현재가"], int, 0) # 매입가를 총매입가로 키변경 dict_holding["총매입가"] = util.safe_cast(dict_holding["매입가"], int, 0) dict_holding["보유수량"] = util.safe_cast(dict_holding["보유수량"], int, 0) dict_holding["수익"] = ( dict_holding["현재가"] - dict_holding["총매입가"]) * dict_holding["보유수량"] 종목코드 = dict_holding["종목코드"] result[종목코드] = dict_holding logger.debug("계좌수익: %s" % (dict_holding, )) self.dict_holding = result if '계좌수익률요청' in self.dict_callback: self.dict_callback['계좌수익률요청'](self.dict_holding) elif sRQName.startswith("RQ_"): logger.debug("RQ handler") result = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "") logger.debug("result: {}".format(result)) else: logger.debug("Unknown sRQName: {}".format(sRQName)) if self.event is not None: self.event.exit()
def kiwoom_OnReceiveTrData(self, sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg, **kwargs): """TR 요청에 대한 결과 수신 데이터 얻어오기 위해 내부에서 GetCommData() 호출 GetCommData( BSTR strTrCode, // TR 이름 BSTR strRecordName, // 레코드이름 long nIndex, // TR반복부 BSTR strItemName) // TR에서 얻어오려는 출력항목이름 :param sScrNo: 화면번호 :param sRQName: 사용자 구분명 :param sTRCode: TR이름 :param sRecordName: 레코드 이름 :param sPreNext: 연속조회 유무를 판단하는 값 0: 연속(추가조회)데이터 없음, 2:연속(추가조회) 데이터 있음 :param nDataLength: 사용안함 :param sErrorCode: 사용안함 :param sMessage: 사용안함 :param sSPlmMsg: 사용안함 :param kwargs: :return: """ if sRQName == "예수금상세현황요청": self.int_주문가능금액 = int( self.kiwoom_GetCommData(sTRCode, sRQName, 0, "주문가능금액")) logger.debug("예수금상세현황요청: %s" % (self.int_주문가능금액, )) if "예수금상세현황요청" in self.dict_callback: self.dict_callback["예수금상세현황요청"](self.int_주문가능금액) elif sRQName == "주식기본정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락율", "거래량"] 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() dict_stock = self.dict_stock.get(종목코드, {}) for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value self.dict_stock[종목코드] = dict_stock logger.debug("주식기본정보: %s, %s" % (종목코드, dict_stock)) if "주식기본정보" in self.dict_callback: self.dict_callback["주식기본정보"](dict_stock) elif sRQName == "시세표성정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락률", "거래량"] dict_stock = {} for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value if "시세표성정보" in self.dict_callback: self.dict_callback["시세표성정보"](dict_stock) elif sRQName == "주식분봉차트조회": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() dict_chart_tmp = {} # 임시로 현재 조회된 차트만 저장 done_범위조회 = False # 파라미터 처리 플래그 for nIdx in range(cnt): # list_item_name = ["현재가", "거래량", "체결시간", "시가", "고가", # "저가", "수정주가구분", "수정비율", "대업종구분", "소업종구분", # "종목정보", "수정주가이벤트", "전일종가"] list_item_name = ["체결시간", "시가", "고가", "저가", "현재가", "거래량"] dict_item = {} for item_name in list_item_name: item_value = self.kiwoom_GetCommData( sTRCode, sRQName, nIdx, item_name) item_value = item_value.strip() dict_item[item_name] = item_value date_last = int(dict_item["체결시간"]) # 범위조회 파라미터 처리 dict_param = self.dict_param.get("주식분봉차트조회", {}) date_from = int(dict_param.get("date_from", "000000000000")) date_to = int(dict_param.get("date_to", "999999999999")) if date_last > date_to: continue elif date_last < date_from: done_범위조회 = True break # 아이템을 리스트에 추가 for item_name, item_value in dict_item.items(): if item_name not in dict_chart_tmp: dict_chart_tmp[item_name] = [item_value] else: dict_chart_tmp[item_name].append(item_value) # 이전에 조회된 차트 불러오기 # 없으면 새로운 딕셔너리 저장 if sPreNext == '0': dict_chart = {} else: dict_chart = self.dict_chart_minute.get(종목코드, {}) # 조회 결과 차트에 추가 for k, v in dict_chart_tmp.items(): if type(v) is list: dict_chart[k] = dict_chart.get(k, []) + v else: dict_chart[k] = dict_chart.get(k, []) + [v] # 개수 파라미터처리 dict_chart['cnt'] = cnt + dict_chart.get('cnt', 0) if dict_chart['cnt'] >= dict_param.get('size', float("inf")): done_범위조회 = True # 차트 업데이트 self.dict_chart_minute[종목코드] = dict_chart if not done_범위조회 and cnt > 0: # 분봉차트 추가요청 self.kiwoom_TR_OPT10080_주식분봉차트조회(종목코드, nPrevNext=2) else: # 연속조회 완료 logger.debug("분봉차트 연속조회완료") self.dict_chart_minute[종목코드]["연속조회완료"] = True if '주식분봉차트조회' in self.dict_callback: self.dict_callback['주식분봉차트조회'](dict_chart) elif sRQName == "계좌수익률요청": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) for nIdx in range(cnt): list_item_name = ["종목코드", "종목명", "현재가", "매입가", "보유수량"] dict_holding = { item_name: self.kiwoom_GetCommData(sTRCode, sRQName, nIdx, item_name).strip() for item_name in list_item_name } dict_holding["현재가"] = util.safe_cast(dict_holding["현재가"], int, 0) # 매입가를 총매입가로 키변경 dict_holding["총매입가"] = util.safe_cast(dict_holding["매입가"], int, 0) dict_holding["보유수량"] = util.safe_cast(dict_holding["보유수량"], int, 0) dict_holding["수익"] = ( dict_holding["현재가"] - dict_holding["총매입가"]) * dict_holding["보유수량"] 종목코드 = dict_holding["종목코드"] self.dict_holding[종목코드] = dict_holding logger.debug("계좌수익: %s" % (dict_holding, )) if '계좌수익률요청' in self.dict_callback: self.dict_callback['계좌수익률요청'](self.dict_holding)
def kiwoom_OnReceiveTrData(self, sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg, **kwargs): """TR 요청에 대한 결과 수신 데이터 얻어오기 위해 내부에서 GetCommData() 호출 GetCommData( BSTR strTrCode, // TR 이름 BSTR strRecordName, // 레코드이름 long nIndex, // TR반복부 BSTR strItemName) // TR에서 얻어오려는 출력항목이름 :param sScrNo: 화면번호 :param sRQName: 사용자 구분명 :param sTRCode: TR이름 :param sRecordName: 레코드 이름 :param sPreNext: 연속조회 유무를 판단하는 값 0: 연속(추가조회)데이터 없음, 2:연속(추가조회) 데이터 있음 :param nDataLength: 사용안함 :param sErrorCode: 사용안함 :param sMessage: 사용안함 :param sSPlmMsg: 사용안함 :param kwargs: :return: """ if sRQName == "예수금상세현황요청": self.int_주문가능금액 = int(self.kiwoom_GetCommData(sTRCode, sRQName, 0, "주문가능금액")) logger.debug("주문가능금액: %s" % (self.int_주문가능금액,)) elif sRQName == "주식기본정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락율", "거래량"] 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() dict_stock = self.dict_stocks.get(종목코드, {}) for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value self.dict_stocks[종목코드] = dict_stock logger.debug("주식기본정보: %s, %s" % (종목코드, dict_stock)) elif sRQName == "시세표성정보": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ["종목명", "현재가", "등락률", "거래량"] dict_stock = {} for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value elif sRQName == "주식분봉차트조회": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) # list_item_name = ["현재가", "거래량", "체결시간", "시가", "고가", # "저가", "수정주가구분", "수정비율", "대업종구분", "소업종구분", # "종목정보", "수정주가이벤트", "전일종가"] list_item_name = ["현재가", "거래량", "체결시간", "시가", "고가", "저가"] 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, "종목코드") 종목코드 = 종목코드.strip() dict_chart_tmp = {} # 임시로 현재 조회된 차트만 저장 for nIdx in range(cnt): for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, nIdx, item_name) item_value = item_value.strip() if item_name not in dict_chart_tmp: dict_chart_tmp[item_name] = [item_value] else: dict_chart_tmp[item_name].append(item_value) # 이전에 조회된 차트 불러오기 # 없으면 새로운 딕셔너리 저장 if sPreNext == '0': dict_chart = {} else: dict_chart = self.dict_charts_minute.get(종목코드, {}) # 조회 결과 차트에 추가 for k, v in dict_chart_tmp.items(): if type(v) is list: dict_chart[k] = dict_chart.get(k, []) + v else: dict_chart[k] = dict_chart.get(k, []) + [v] dict_chart['cnt'] = cnt + dict_chart.get('cnt', 0) # 차트 업데이트 self.dict_charts_minute[종목코드] = dict_chart if dict_chart['cnt'] < self.CHART_SIZE and sPreNext == '2': # 분봉차트 추가요청 self.kiwoom_TR_OPT10080_주식분봉차트조회(종목코드, nPrevNext=2) else: # 연속조회 완료 logger.debug("분봉차트 연속조회완료") self.dict_charts_minute[종목코드]["연속조회완료"] = True elif sRQName == "계좌수익률요청": cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) for nIdx in range(cnt): list_item_name = ["종목코드", "종목명", "현재가", "매입가", "보유수량"] dict_holding = {item_name: self.kiwoom_GetCommData(sTRCode, sRQName, nIdx, item_name).strip() for item_name in list_item_name} dict_holding["현재가"] = util.safe_cast(dict_holding["현재가"], int, 0) # 매입가를 총매입가로 키변경 dict_holding["총매입가"] = util.safe_cast(dict_holding["매입가"], int, 0) dict_holding["보유수량"] = util.safe_cast(dict_holding["보유수량"], int, 0) dict_holding["수익"] = (dict_holding["현재가"]-dict_holding["총매입가"])*dict_holding["보유수량"] 종목코드 = dict_holding["종목코드"] self.dict_holdings[종목코드] = dict_holding logger.debug("계좌수익: %s" % (dict_holding,))
def get_mean(self): if self.values.empty(): print("No elements in pollution queue") return None pm1_0_array = [] pm2_5_array = [] pm10_array = [] pm1_0_atm_array = [] pm2_5_atm_array = [] pm10_atm_array = [] gt0_3um_array = [] gt0_5um_array = [] gt1_0um_array = [] gt2_5um_array = [] gt5_0um_array = [] gt10um_array = [] for element in list(self.values.queue): pm1_0_array.append(element.pm1_0) pm2_5_array.append(element.pm2_5) pm10_array.append(element.pm10) pm1_0_atm_array.append(element.pm1_0_atm) pm2_5_atm_array.append(element.pm2_5_atm) pm10_atm_array.append(element.pm10_atm) gt0_3um_array.append(element.gt0_3um) gt0_5um_array.append(element.gt0_5um) gt1_0um_array.append(element.gt1_0um) gt2_5um_array.append(element.gt2_5um) gt5_0um_array.append(element.gt5_0um) gt10um_array.append(element.gt10um) return PollutionMeasure( safe_cast(sum(pm1_0_array) / len(pm1_0_array), int), safe_cast(sum(pm2_5_array) / len(pm2_5_array), int), safe_cast(sum(pm10_array) / len(pm10_array), int), safe_cast(sum(pm1_0_atm_array) / len(pm1_0_atm_array), int), safe_cast(sum(pm2_5_atm_array) / len(pm2_5_atm_array), int), safe_cast(sum(pm10_atm_array) / len(pm10_atm_array), int), safe_cast(sum(gt0_3um_array) / len(gt0_3um_array), int), safe_cast(sum(gt0_5um_array) / len(gt0_5um_array), int), safe_cast(sum(gt1_0um_array) / len(gt1_0um_array), int), safe_cast(sum(gt2_5um_array) / len(gt2_5um_array), int), safe_cast(sum(gt5_0um_array) / len(gt5_0um_array), int), safe_cast(sum(gt10um_array) / len(gt10um_array), int))
def read_pollution(self): print("read_pollution() started!") pms5003 = PMS5003() while True: try: measure = str(pms5003.read()).strip() lines = measure.splitlines() measurements = PollutionMeasure( safe_cast(lines[0].rpartition(':')[2], int), safe_cast(lines[1].rpartition(':')[2], int), safe_cast(lines[2].rpartition(':')[2], int), safe_cast(lines[3].rpartition(':')[2], int), safe_cast(lines[4].rpartition(':')[2], int), safe_cast(lines[5].rpartition(':')[2], int), safe_cast(lines[6].rpartition(':')[2], int), safe_cast(lines[7].rpartition(':')[2], int), safe_cast(lines[8].rpartition(':')[2], int), safe_cast(lines[9].rpartition(':')[2], int), safe_cast(lines[10].rpartition(':')[2], int), safe_cast(lines[11].rpartition(':')[2], int)) if self.values.full(): self.values.get() self.values.put(measurements) print(f"Elementi in coda Pollution: {self.values.qsize()}") time.sleep(self.seconds_interval) except Exception as ex: print(ex) exc_type, exc_value, exc_traceback = sys.exc_info() print(f"exception_type: {exc_type}") print(f"exception_value: {exc_value}") print( f"exception_traceback: {traceback.format_exc().splitlines()}" ) time.sleep(5) pms5003 = PMS5003()
def kiwoom_OnReceiveChejanData(self, sGubun, nItemCnt, sFIdList, **kwargs): '''주문접수, 체결, 잔고발생시 :param sGubun: 체결구분 접수와 체결시 '0'값, 국내주식 잔고전달은 '1'값, 파생잔고 전달은 '4' :param nItemCnt: :param sFIdList: '9201' : '계좌번호' '9203' : '주문번호' '9001' : '종목코드' '913' : '주문상태' '302' : '종목명' '900' : '주문수량' '901' : '주문가격' '902' : '미체결수량' '903' : '체결누계금액' '904' : '원주문번호' '905' : '주문구분' '906' : '매매구분' '907' : '매도수구분' '908' : '주문/체결시간' '909' : '체결번호' '910' : '체결가' '911' : '체결량' '10' : '현재가' '27' : '(최우선)매도호가' '28' : '(최우선)매수호가' '914' : '단위체결가' '915' : '단위체결량' '919' : '거부사유' '920' : '화면번호' '917' : '신용구분' '916' : '대출일' '930' : '보유수량' '931' : '매입단가' '932' : '총매입가' '933' : '주문가능수량' '945' : '당일순매수수량' '946' : '매도/매수구분' '950' : '당일총매도손일' '951' : '예수금' '307' : '기준가' '8019' : '손익율' '957' : '신용금액' '958' : '신용이자' '918' : '만기일' '990' : '당일실현손익(유가)' '991' : '당일실현손익률(유가)' '992' : '당일실현손익(신용)' '993' : '당일실현손익률(신용)' '397' : '파생상품거래단위' '305' : '상한가' '306' : '하한가' :param kwargs: :return: ''' logger.info('체결/잔고: %s %s %s' % (sGubun, nItemCnt, sFIdList)) if sGubun == '0': list_item_name = [ '계좌번호', '주문번호', '관리자사번', '종목코드', '주문업무분류', '주문상태', '종목명', '주문수량', '주문가격', '미체결수량', '체결누계금액', '원주문번호', '주문구분', '매매구분', '매도수구분', '주문체결시간', '체결번호', '체결가', '체결량', '현재가', '매도호가', '매수호가', '단위체결가', '단위체결량', '당일매매수수료', '당일매매세금', '거부사유', '화면번호', '터미널번호', '신용구분', '대출일' ] list_item_id = [ 9201, 9203, 9205, 9001, 912, 913, 302, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 10, 27, 28, 914, 915, 938, 939, 919, 920, 921, 922, 923 ] dict_contract = { item_name: self.kiwoom_GetChejanData(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id) } # 종목코드에서 'A' 제거 종목코드 = dict_contract['종목코드'] if 'A' <= 종목코드[0] <= 'Z' or 'a' <= 종목코드[0] <= 'z': 종목코드 = 종목코드[1:] dict_contract['종목코드'] = 종목코드 # 종목을 대기 리스트에서 제거 if 종목코드 in self.set_stock_ordered: self.set_stock_ordered.remove(종목코드) # 매수 체결일 경우 보유종목에 빈 dict 추가 (키만 추가하기 위해) if '매수' in dict_contract['주문구분']: self.dict_holding[종목코드] = {} # 매도 체결일 경우 보유종목에서 제거 else: self.dict_holding.pop(종목코드, None) logger.info('체결: %s' % (dict_contract, )) if sGubun == '1': list_item_name = [ '계좌번호', '종목코드', '신용구분', '대출일', '종목명', '현재가', '보유수량', '매입단가', '총매입가', '주문가능수량', '당일순매수량', '매도매수구분', '당일총매도손일', '예수금', '매도호가', '매수호가', '기준가', '손익율', '신용금액', '신용이자', '만기일', '당일실현손익', '당일실현손익률', '당일실현손익_신용', '당일실현손익률_신용', '담보대출수량', '기타' ] list_item_id = [ 9201, 9001, 917, 916, 302, 10, 930, 931, 932, 933, 945, 946, 950, 951, 27, 28, 307, 8019, 957, 958, 918, 990, 991, 992, 993, 959, 924 ] dict_holding = { item_name: self.kiwoom_GetChejanData(item_id).strip() for item_name, item_id in zip(list_item_name, list_item_id) } dict_holding['현재가'] = util.safe_cast(dict_holding['현재가'], int, 0) dict_holding['보유수량'] = util.safe_cast(dict_holding['보유수량'], int, 0) dict_holding['매입단가'] = util.safe_cast(dict_holding['매입단가'], int, 0) dict_holding['총매입가'] = util.safe_cast(dict_holding['총매입가'], int, 0) dict_holding['주문가능수량'] = util.safe_cast(dict_holding['주문가능수량'], int, 0) # 종목코드에서 'A' 제거 종목코드 = dict_holding['종목코드'] if 'A' <= 종목코드[0] <= 'Z' or 'a' <= 종목코드[0] <= 'z': 종목코드 = 종목코드[1:] dict_holding['종목코드'] = 종목코드 # 보유종목 리스트에 추가 self.dict_holding[종목코드] = dict_holding logger.info('잔고: %s' % (dict_holding, ))
def kiwoom_OnReceiveTrData(self, sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg, **kwargs): '''TR 요청에 대한 결과 수신 데이터 얻어오기 위해 내부에서 GetCommData() 호출 GetCommData( BSTR strTrCode, // TR 이름 BSTR strRecordName, // 레코드이름 long nIndex, // TR반복부 BSTR strItemName) // TR에서 얻어오려는 출력항목이름 :param sScrNo: 화면번호 :param sRQName: 사용자 구분명 :param sTRCode: TR이름 :param sRecordName: 레코드 이름 :param sPreNext: 연속조회 유무를 판단하는 값 0: 연속(추가조회)데이터 없음, 2:연속(추가조회) 데이터 있음 :param nDataLength: 사용안함 :param sErrorCode: 사용안함 :param sMessage: 사용안함 :param sSPlmMsg: 사용안함 :param kwargs: :return: ''' if sRQName == '예수금상세현황요청': self.int_주문가능금액 = int( self.kiwoom_GetCommData(sTRCode, sRQName, 0, '주문가능금액')) logger.info('예수금상세현황요청: %s' % (self.int_주문가능금액, )) if '예수금상세현황요청' in self.dict_callback: self.dict_callback['예수금상세현황요청'](self.int_주문가능금액) elif sRQName == '주식기본정보': cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = [ '종목코드', '종목명', '결산월', '액면가', '자본금', '상장주식', '신용비율', '연중최고', '연중최저', '시가총액', '시가총액비중', '외인소진률', '대용가', 'PER', 'EPS', 'ROE', 'PBR', 'EV', 'BPS', '매출액', '영업이익', '당기순이익', '250최고', '250최저', '시가', '고가', '저가', '상한가', '하한가', '기준가', '예상체결가', '예상체결수량', '250최고가일', '250최고가대비율', '250최저가일', '250최저가대비율', '현재가', '대비기호', '전일대비', '등락율', '거래량', '거래대비', '액면가단위' ] 종목코드 = self.kiwoom_GetCommData(sTRCode, sRQName, 0, '종목코드') 종목코드 = 종목코드.strip() dict_stock = self.dict_stock.get(종목코드, {}) for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value self.dict_stock[종목코드] = dict_stock logger.debug('주식기본정보: %s, %s' % (종목코드, dict_stock)) if '주식기본정보' in self.dict_callback: self.dict_callback['주식기본정보'](dict_stock) elif sRQName == '시세표성정보': cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) list_item_name = ['종목명', '현재가', '등락률', '거래량'] dict_stock = {} for item_name in list_item_name: item_value = self.kiwoom_GetCommData(sTRCode, sRQName, 0, item_name) item_value = item_value.strip() dict_stock[item_name] = item_value if '시세표성정보' in self.dict_callback: self.dict_callback['시세표성정보'](dict_stock) elif sRQName == '주식분봉차트조회': self.cb_주식분봉차트조회(sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg) elif sRQName == '주식일봉차트조회': self.cb_주식일봉차트조회(sScrNo, sRQName, sTRCode, sRecordName, sPreNext, nDataLength, sErrorCode, sMessage, sSPlmMsg) elif sRQName == '계좌수익률요청': cnt = self.kiwoom_GetRepeatCnt(sTRCode, sRQName) for nIdx in range(cnt): list_item_name = ['종목코드', '종목명', '현재가', '매입가', '보유수량'] dict_holding = { item_name: self.kiwoom_GetCommData(sTRCode, sRQName, nIdx, item_name).strip() for item_name in list_item_name } dict_holding['현재가'] = util.safe_cast(dict_holding['현재가'], int, 0) # 매입가를 총매입가로 키변경 dict_holding['총매입가'] = util.safe_cast(dict_holding['매입가'], int, 0) dict_holding['보유수량'] = util.safe_cast(dict_holding['보유수량'], int, 0) dict_holding['수익'] = ( dict_holding['현재가'] - dict_holding['총매입가']) * dict_holding['보유수량'] 종목코드 = dict_holding['종목코드'] self.dict_holding[종목코드] = dict_holding logger.info('계좌수익: %s' % (dict_holding, )) if '계좌수익률요청' in self.dict_callback: self.dict_callback['계좌수익률요청'](self.dict_holding)