Ejemplo n.º 1
0
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'])
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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,))
Ejemplo n.º 4
0
    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, ))
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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,))
Ejemplo n.º 8
0
    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))
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
    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, ))
Ejemplo n.º 11
0
    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)