Exemplo n.º 1
0
 def on_register_real_all_btn_clicked(self):
     MyLogger.instance().logger().info("")
     잔고_dic = kiwoom.data.잔고_dic
     종목코드_list = 잔고_dic.keys()
     종목코드_list_str = ";".join(종목코드_list)
     MyLogger.instance().logger().info("종목코드_list_str %s", 종목코드_list_str)
     kiwoom.set_real_reg(종목코드_list_str)
Exemplo n.º 2
0
 def on_register_real_all_btn_clicked(self):
     MyLogger.instance().logger().info("")
     잔고_dic = kiwoom.data.잔고_dic
     종목코드_list = 잔고_dic.keys()
     종목코드_list_str = ";".join(종목코드_list)
     MyLogger.instance().logger().info("종목코드_list_str %s", 종목코드_list_str)
     kiwoom.set_real_reg(종목코드_list_str)
Exemplo n.º 3
0
 def on_condition_apply_btn_clicked(self):
     MyLogger.instance().logger().info("")
     apply_str = self.ui.combo_apply.currentText()
     MyLogger.instance().logger().info("신호종류: %s", apply_str)
     for condition in self.selected_condition:
         condition.적용유무 = apply_str
     self.on_data_updated(["조건식_dic"])
Exemplo n.º 4
0
 def on_condition_apply_btn_clicked(self):
     MyLogger.instance().logger().info("")
     apply_str = self.ui.combo_apply.currentText()
     MyLogger.instance().logger().info("신호종류: %s", apply_str)
     for condition in self.selected_condition:
         condition.적용유무 = apply_str
     self.on_data_updated(["조건식_dic"])
Exemplo n.º 5
0
 def on_condition_signal_btn_clicked(self):
     MyLogger.instance().logger().info("")
     signal_str = self.ui.combo_signal.currentText()
     MyLogger.instance().logger().info("신호종류: %s", signal_str)
     for condition in self.selected_condition:
         condition.신호종류 = signal_str
     self.on_data_updated(["조건식_dic"])
Exemplo n.º 6
0
 def set_real_reg(self, the_종목코드_list_str):
     MyLogger.instance().logger().info("the_종목코드_list_str %s", the_종목코드_list_str)
     fid = "9001;10;13"  # 종목코드,업종코드;현재가;누적거래량
     ret = self.ocx.dynamicCall("SetRealReg(QString, QString, QString, QString)",
                                [constant.SN_실시간조회, the_종목코드_list_str, fid, "1"])  # "1" 종목 추가, "0" 기존 종목은 제외
     MyLogger.instance().logger().info("call SetRealReg(). ret: %d", ret)
     return ret
Exemplo n.º 7
0
    def _slot_btn_add(self):
        """点击Move button,将左侧列表中选中的控件信息以json的形式写入到右侧的TextEdit控件中
        """
        item_info_dict = {}
        # 添加节点属性
        for item in self.tableWidget.selectedItems():
            mlog.instance().logger.info(
                "Current column name is {}, and current item value is {}".
                format(
                    self.tableWidget.item(0, item.column()).text(),
                    item.text()))

            column_name = self.tableWidget.item(0, item.column()).text()
            item_value = item.text()
            item_info_dict[column_name] = item_value

        # 添加操作属性
        item_info_dict['Action'] = 'click'
        item_info_dict['Pre-wait'] = '0'
        item_info_dict['Post-wait'] = '5'
        # Dump成Json格式
        item_info_json = json.dumps(item_info_dict, sort_keys=False, indent=1)
        # 附加到TextEdit
        # self.jsonTextEdit.append(item_info_json)
        self.scriptVerticalLayout.addWidget(
            self._create_textEdit(item_info_json))
Exemplo n.º 8
0
    def _get_control_infos(self, seconds=3):
        """获取焦点所在应用的所有窗体控件,并便利输出控件信息

        Args:
            seconds (int, optional): 点击后n秒开始分析. Defaults to 3.

        Yields:
            [tuple]: 窗体上所有控件的信息
        """
        time.sleep(seconds)

        control = auto.GetFocusedControl()
        if control:
            for c, d in auto.WalkControl(control, True):
                mlog.instance().logger.info(c.ControlTypeName + " " + str(d))
                yield (
                    c.ControlType,
                    c.ClassName,
                    "[{},{},{},{}]".format(
                        c.BoundingRectangle.left,
                        c.BoundingRectangle.top,
                        c.BoundingRectangle.right,
                        c.BoundingRectangle.bottom,
                    ),
                    c.Name,
                    "0x{0:X}({0})".format(c.NativeWindowHandle),
                    str(d),
                )
Exemplo n.º 9
0
 def tr_multi_code(self, the_종목코드_list_str, the_종목수):
     MyLogger.instance().logger().debug("the_종목코드_list_str %s, the_종목수 %d",
                                        the_종목코드_list_str, the_종목수)
     ret = self.ocx.dynamicCall(
         "CommKwRqData(QString, int, int, int, QString, QString)",
         the_종목코드_list_str, 0, the_종목수, 0, "관심종목", constant.SN_관심종목조회)
     MyLogger.instance().logger().debug("ret %d", ret)
Exemplo n.º 10
0
    def solve(self):
        answer_file_name = "Answer_" + self._file_name
        with open(answer_file_name, 'w+') as fp_answer:
            with open(self._file_name, 'r') as fp:
                lines = fp.readlines()

                for index, line in enumerate(lines):
                    line = line.replace('\n', '')
                    items = self._clear_line(line.split(' '))
                    item_count = len(items)

                    if item_count < 4:
                        mlog.instance().logger.error(
                            f"{self.__class__.__name__} {sys._getframe().f_code.co_name}: line {index} is invalid"
                        )

                    answer = self._calc_answer(items)
                    answer_str = u"answer " + f"{answer}"

                    result_str = "    "

                    if item_count == 5:
                        # 带回答的情况
                        if int(items[4]) == answer:
                            result_str = u" right "
                            content = f"{line}\n"
                        else:
                            result_str = u" wrong "
                            content = f"{line}{result_str}{answer_str}\n"
                    fp_answer.write(content)
                    print(content)
Exemplo n.º 11
0
 def on_condition_signal_btn_clicked(self):
     MyLogger.instance().logger().info("")
     signal_str = self.ui.combo_signal.currentText()
     MyLogger.instance().logger().info("신호종류: %s", signal_str)
     for condition in self.selected_condition:
         condition.신호종류 = signal_str
     self.on_data_updated(["조건식_dic"])
Exemplo n.º 12
0
 def send_order(self, 주문유형, 종목코드, 주문수량, 주문단가, 거래구분):
     MyLogger.instance().logger().info("%d, %s, %d, %d, %s", 주문유형, 종목코드, 주문수량, 주문단가, 거래구분)
     sRQName = "주식주문"
     sScreenNo = constant.SN_주식주문
     ret = self.ocx.dynamicCall("SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",
                                [sRQName, sScreenNo, self.data.계좌번호, 주문유형, 종목코드, 주문수량, 주문단가, 거래구분, ""])
     MyLogger.instance().logger().info("call SendOrder(). ret: %d", ret)
     return ret
Exemplo n.º 13
0
 def _slot_btn_select(self):
     """slot of choose_button, 选择要分析的可执行程序
     """
     file_name, file_type = QFileDialog.getOpenFileName(
         self, "选取文件", os.getcwd(), "Exe Files (*.exe)")
     mlog.instance().logger.info("Choose File {}", file_name)
     if file_name != "":
         self.textBrowser.setText(file_name)
Exemplo n.º 14
0
 def on_sell_signal(self, 주문수량):
     MyLogger.instance().logger().info("종목명: %s, 주문수량: %d",
                                       self.balance.종목명, 주문수량)
     kiwoom = Kiwoom.instance()
     job = Job(kiwoom.send_order, 2, self.balance.종목코드, 주문수량, 0,
               "03")  # 시장가로 매도
     kiwoom.job_queue.put(job)
     self.is_queued = True
Exemplo n.º 15
0
    def collect_day_data(self):
        MyLogger.instance().logger().debug("")

        class DayData(threading.Thread):
            def __init__(self, the_ocx, the_condition_value):
                super().__init__()
                self.ocx = the_ocx
                self.condition_value = the_condition_value

            def run(self):
                kospi_code_list_str = self.ocx.dynamicCall(
                    "GetCodeListByMarket(QString)", ["0"])
                kospi_code_list = kospi_code_list_str.split(';')
                MyLogger.instance().logger().info("kospi_code_list. len: %d",
                                                  len(kospi_code_list))
                kosdaq_code_list_str = self.ocx.dynamicCall(
                    "GetCodeListByMarket(QString)", ["10"])
                kosdaq_code_list = kosdaq_code_list_str.split(';')
                MyLogger.instance().logger().info("kosdaq_code_list. len: %d",
                                                  len(kosdaq_code_list))
                code_list = kospi_code_list + kosdaq_code_list
                from datetime import datetime
                기준일자 = datetime.today().strftime("%Y%m%d")
                from glob import glob

                for code in code_list:
                    if len(code) < 3:
                        MyLogger.instance().logger().warning(
                            "unexpected code: %s", code)
                        continue

                    temp_list = glob('data/day/' + code + '*.csv')
                    if len(temp_list) >= 1:
                        MyLogger.instance().logger().warning(
                            "%s already exist", code)
                        continue

                    time.sleep(1)
                    self.condition_value.acquire()
                    self.ocx.dynamicCall("SetInputValue(QString, QString)",
                                         "종목코드", code)
                    self.ocx.dynamicCall("SetInputValue(QString, QString)",
                                         "기준일자", 기준일자)
                    self.ocx.dynamicCall("SetInputValue(QString, QString)",
                                         "수정주가구분", "1")
                    ret = self.ocx.dynamicCall(
                        "CommRqData(QString, QString, int, QString)", "주식일봉조회",
                        "opt10081", 0, constant.SN_데이터_일봉조회)
                    MyLogger.instance().logger().info(
                        "CommRqData. code: %s, ret: %d", code, ret)
                    self.condition_value.wait()

                self.condition_value.release()
                MyLogger.instance().logger().info("the end of run()")

        self.condition_value = threading.Condition()
        test_thread = DayData(self.ocx, self.condition_value)
        test_thread.start()
Exemplo n.º 16
0
 def on_save_balance_btn_clicked(self):
     MyLogger.instance().logger().info("")
     f = open("my_list.txt", "w", encoding='utf8')
     list_data = []
     for balance in kiwoom.data.잔고_dic.values():
         list_data.append(balance.get_dic())
     data = json.dumps(list_data, ensure_ascii=False, indent=4)
     f.write(data)
     f.close()
Exemplo n.º 17
0
 def perform_test(self):
     MyLogger.instance().logger().debug("")
     self.ocx.dynamicCall("SetInputValue(QString, QString)", "종목코드",
                          "005930")
     self.ocx.dynamicCall("SetInputValue(QString, QString)", "틱범위", "1")
     self.ocx.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")
     ret = self.ocx.dynamicCall(
         "CommRqData(QString, QString, int, QString)", "주식분봉조회", "opt10080",
         0, constant.SN_잔고조회)
Exemplo n.º 18
0
 def on_save_balance_btn_clicked(self):
     MyLogger.instance().logger().info("")
     f = open("my_list.txt", "w", encoding='utf8')
     list_data = []
     for balance in kiwoom.data.잔고_dic.values():
         list_data.append(balance.get_dic())
     data = json.dumps(list_data, ensure_ascii=False, indent=4)
     f.write(data)
     f.close()
Exemplo n.º 19
0
 def on_condition_result_add_btn_clicked(self):
     MyLogger.instance().logger().info("")
     code_text = self.ui.txt_condition_result.toPlainText()
     if len(code_text) > 4:
         code_list = (eval(code_text))
         code_list_str = ";".join(code_list)
         kiwoom.tr_multi_code(code_list_str, len(code_list))
     else:
         MyLogger.instance().logger().error("self.ui.txt_condition_result is too short.")
Exemplo n.º 20
0
 def tr_balance(self):
     MyLogger.instance().logger().debug("계좌번호 %s", self.data.계좌번호)
     self.ocx.dynamicCall("SetInputValue(QString, QString)", "계좌번호",
                          self.data.계좌번호)
     self.ocx.dynamicCall("SetInputValue(QString, QString)", "조회구분", 2)
     ret = self.ocx.dynamicCall(
         "CommRqData(QString, QString, int, QString)", "계좌평가잔고내역요청",
         "opw00018", 0, constant.SN_잔고조회)
     MyLogger.instance().logger().debug("ret %d", ret)
Exemplo n.º 21
0
 def on_condition_result_add_btn_clicked(self):
     MyLogger.instance().logger().info("")
     code_text = self.ui.txt_condition_result.toPlainText()
     if len(code_text) > 4:
         code_list = (eval(code_text))
         code_list_str = ";".join(code_list)
         kiwoom.tr_multi_code(code_list_str, len(code_list))
     else:
         MyLogger.instance().logger().error(
             "self.ui.txt_condition_result is too short.")
Exemplo n.º 22
0
 def on_sell_strategy_add_btn_clicked(self):
     strategy_str = self.ui.combo_sell.currentText()
     MyLogger.instance().logger().info("전략: %s", strategy_str)
     for balance in self.selected_balance:
         param = eval(self.ui.txt_sell_param.text())
         if not type(param) == dict:
             MyLogger.instance().logger().error("wrong param text: %s", self.ui.txt_sell_param.text())
             param = {}
         balance.add_sell_strategy(strategy_str, param)
     self.on_data_updated(["잔고_dic"])
Exemplo n.º 23
0
 def set_real_reg(self, the_종목코드_list_str):
     MyLogger.instance().logger().info("the_종목코드_list_str %s",
                                       the_종목코드_list_str)
     fid = "9001;10;13"  # 종목코드,업종코드;현재가;누적거래량
     ret = self.ocx.dynamicCall(
         "SetRealReg(QString, QString, QString, QString)",
         [constant.SN_실시간조회, the_종목코드_list_str, fid, "1"
          ])  # "1" 종목 추가, "0" 기존 종목은 제외
     MyLogger.instance().logger().info("call SetRealReg(). ret: %d", ret)
     return ret
Exemplo n.º 24
0
 def OnEventConnect(self, nErrCode):
     if nErrCode == 0:
         MyLogger.instance().logger().debug("로그인 성공")
         account_num = self.ocx.dynamicCall("GetLoginInfo(QString)", ["ACCNO"])
         account_num = account_num[:-1]
         account_list = account_num.split(";")
         self.data.계좌번호_list = account_list
         self.data.계좌번호 = account_list[0]
         self.callback.on_data_updated(["계좌번호"])
         self.callback.on_connected()
Exemplo n.º 25
0
 def refresh_interest_balance(self):
     MyLogger.instance().logger().debug("")
     code_list = []
     for balance in self.data.잔고_dic.values():
         if balance.보유수량 == 0:
             code_list.append(balance.종목코드)
     if len(code_list) > 0:
         code_list_str = ";".join(code_list)
         self.tr_multi_code(code_list_str, len(code_list))
     else:
         MyLogger.instance().logger().debug("code_list len: %d", len(code_list))
Exemplo n.º 26
0
 def on_sell_strategy_add_btn_clicked(self):
     strategy_str = self.ui.combo_sell.currentText()
     MyLogger.instance().logger().info("전략: %s", strategy_str)
     for balance in self.selected_balance:
         param = eval(self.ui.txt_sell_param.text())
         if not type(param) == dict:
             MyLogger.instance().logger().error(
                 "wrong param text: %s", self.ui.txt_sell_param.text())
             param = {}
         balance.add_sell_strategy(strategy_str, param)
     self.on_data_updated(["잔고_dic"])
Exemplo n.º 27
0
 def on_buy_strategy_changed(self, strategy):
     from kiwoom.strategy.just_buy import JustBuy
     from kiwoom.strategy.buy_on_opening import BuyOnOpening
     if strategy == "buy_just_buy":
         default_param = JustBuy.get_default_param()
     elif strategy == "buy_on_opening":
         default_param = BuyOnOpening.get_default_param()
     else:
         MyLogger.instance().logger().warning("unknown strategy. ignore %s", strategy)
     MyLogger.instance().logger().warning("strategy %s, default_param %s", strategy, str(default_param))
     self.ui.txt_buy_param.setText(str(default_param))
Exemplo n.º 28
0
 def OnEventConnect(self, nErrCode):
     if nErrCode == 0:
         MyLogger.instance().logger().debug("로그인 성공")
         account_num = self.ocx.dynamicCall("GetLoginInfo(QString)",
                                            ["ACCNO"])
         account_num = account_num[:-1]
         account_list = account_num.split(";")
         self.data.계좌번호_list = account_list
         self.data.계좌번호 = account_list[0]
         self.callback.on_data_updated(["계좌번호"])
         self.callback.on_connected()
Exemplo n.º 29
0
    def reload_condition(self):
        MyLogger.instance().logger().info("")

        # 잔고 갱신 요청
        job = Job(self.tr_balance)
        self.job_queue.put(job)

        for condition in self.data.조건식_dic.values():
            if condition.적용유무 == "1":
                # 조건식 실시간 재등록
                job = Job(self.send_condition, condition)
                self.job_queue.put(job)
Exemplo n.º 30
0
    def reload_condition(self):
        MyLogger.instance().logger().info("")

        # 잔고 갱신 요청
        job = Job(self.tr_balance)
        self.job_queue.put(job)

        for condition in self.data.조건식_dic.values():
            if condition.적용유무 == "1":
                # 조건식 실시간 재등록
                job = Job(self.send_condition, condition)
                self.job_queue.put(job)
Exemplo n.º 31
0
 def refresh_interest_balance(self):
     MyLogger.instance().logger().debug("")
     code_list = []
     for balance in self.data.잔고_dic.values():
         if balance.보유수량 == 0:
             code_list.append(balance.종목코드)
     if len(code_list) > 0:
         code_list_str = ";".join(code_list)
         self.tr_multi_code(code_list_str, len(code_list))
     else:
         MyLogger.instance().logger().debug("code_list len: %d",
                                            len(code_list))
Exemplo n.º 32
0
    def exec_path(self):
        """exec_path属性getter      
        """
        if self:
            self._exec_path = os.path.abspath(
                str.strip(self.textBrowser.toPlainText()))

            if len(self.textBrowser.toPlainText()) != 0:
                mlog.instance().logger.info(
                    "current execuable is " +
                    str.strip(self.textBrowser.toPlainText()))

        return self._exec_path
Exemplo n.º 33
0
 def on_buy_strategy_changed(self, strategy):
     from kiwoom.strategy.just_buy import JustBuy
     from kiwoom.strategy.buy_on_opening import BuyOnOpening
     if strategy == "buy_just_buy":
         default_param = JustBuy.get_default_param()
     elif strategy == "buy_on_opening":
         default_param = BuyOnOpening.get_default_param()
     else:
         MyLogger.instance().logger().warning("unknown strategy. ignore %s",
                                              strategy)
     MyLogger.instance().logger().warning("strategy %s, default_param %s",
                                          strategy, str(default_param))
     self.ui.txt_buy_param.setText(str(default_param))
Exemplo n.º 34
0
 def send_order(self, 주문유형, 종목코드, 주문수량, 주문단가, 거래구분):
     MyLogger.instance().logger().info("%d, %s, %d, %d, %s", 주문유형, 종목코드,
                                       주문수량, 주문단가, 거래구분)
     sRQName = "주식주문"
     sScreenNo = constant.SN_주식주문
     ret = self.ocx.dynamicCall(
         "SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",
         [
             sRQName, sScreenNo, self.data.계좌번호, 주문유형, 종목코드, 주문수량, 주문단가,
             거래구분, ""
         ])
     MyLogger.instance().logger().info("call SendOrder(). ret: %d", ret)
     return ret
Exemplo n.º 35
0
 def on_sell_strategy_changed(self, strategy):
     from kiwoom.strategy.stop_loss import StopLoss
     from kiwoom.strategy.condition_sell import ConditionSell
     from kiwoom.strategy.sell_on_closing import SellOnClosing
     if strategy == "sell_stop_loss":
         default_param = StopLoss.get_default_param()
     elif strategy == "sell_condition_sell":
         default_param = ConditionSell.get_default_param()
     elif strategy == "sell_on_closing":
         default_param = SellOnClosing.get_default_param()
     else:
         MyLogger.instance().logger().warning("unknown strategy. ignore %s", strategy)
     MyLogger.instance().logger().warning("strategy %s, default_param %s", strategy, str(default_param))
     self.ui.txt_sell_param.setText(str(default_param))
Exemplo n.º 36
0
 def _slot_btn_run(self):
     """slot of run_button, 运行要分析的可执行程序
     """
     # 判断可执行程序路径是否正确
     if (not os.path.exists(self.exec_path)) or (len(self.exec_path) == 0):
         QMessageBox.warning(self, r"警告", r"请输入有效的可执行程序路径!",
                             QMessageBox.Yes)
     else:
         try:
             # 打开可执行程序
             subprocess.Popen(self.exec_path)
         except Exception as e:
             QMessageBox.critical(self, r"错误", r"运行程序失败!", QMessageBox.Yes)
             mlog.instance().logger.error("运行程序识别,异常原因:{}", repr(e))
Exemplo n.º 37
0
    def save(self, playbook_name):
        """将当前playbook的内容保存到指定文件中

        Args:
            playbook_name (str): 制定的文件名称

        Returns:
            int: 0 失败;1 成功
        """
        if not self._playbook_content_dict:
            mlog.instance().logger.error(
                f"{self.__class__.__name__} {sys._getframe().f_code.co_name}: playbook content dict is empty."
            )
            return 0
        elif not self.validate(self._playbook_content_dict):
            mlog.instance().logger.error(
                f"{self.__class__.__name__} {sys._getframe().f_code.co_name}: validate playbook content failed."
            )
            return 0
        else:
            try:
                with open(playbook_name, "w+") as fp:
                    fp.writelines(
                        json.dumps(self._playbook_content_dict, indent=1))
                    mlog.instance().logger.info(
                        f"{self.__class__.__name__} {sys._getframe().f_code.co_name}: save into {playbook_name} successfully"
                    )
            except Exception as e:
                mlog.instance().logger.error(
                    f"{self.__class__.__name__} {sys._getframe().f_code.co_name}: save json_str into {playbook_name} error: {e}"
                )

            return 1
Exemplo n.º 38
0
    def OnReceiveRealCondition(self, strCode, strType, strConditionName, strConditionIndex):
        MyLogger.instance().logger().info("%s, %s, %s, %s, %s", strCode, self.get_master_code_name(strCode), strType, strConditionName, strConditionIndex)
        condition = self.data.get_condition(int(strConditionIndex))

        if condition.신호종류 == "매도신호" and strType == 'I':  # 매도 조건식 편입
            if strCode not in self.data.잔고_dic:
                MyLogger.instance().logger().warning("보유 종목 아님. %s", strCode)
                return
            balance = self.data.get_balance(strCode)
            for 매도전략 in balance.매도전략.values():
                매도전략.on_condition(int(strConditionIndex), strConditionName)

        elif condition.신호종류 == "매수신호" and strType == "I":  # 매수 조건식 편입
            pass
Exemplo n.º 39
0
 def OnReceiveConditionVer(self, lRet, sMsg):
     MyLogger.instance().logger().debug("%d %s", lRet, sMsg)
     condition_ret = self.ocx.dynamicCall("GetConditionNameList()")
     condition_ret = condition_ret[:-1]  # 마지막 ";" 제거
     condition_list_raw = condition_ret.split(";")
     self.data.조건식_dic.clear()
     for condition_with_index in condition_list_raw:
         if condition_with_index == "":
             continue
         cur = condition_with_index.split("^")
         인덱스 = int(cur[0])
         조건명 = cur[1]
         condition_instance = self.data.get_condition(인덱스)
         condition_instance.조건명 = 조건명
     self.callback.on_data_updated(["조건식_dic"])
Exemplo n.º 40
0
 def OnReceiveConditionVer(self, lRet, sMsg):
     MyLogger.instance().logger().debug("%d %s", lRet, sMsg)
     condition_ret = self.ocx.dynamicCall("GetConditionNameList()")
     condition_ret = condition_ret[:-1]  # 마지막 ";" 제거
     condition_list_raw = condition_ret.split(";")
     self.data.조건식_dic.clear()
     for condition_with_index in condition_list_raw:
         if condition_with_index == "":
             continue
         cur = condition_with_index.split("^")
         인덱스 = int(cur[0])
         조건명 = cur[1]
         condition_instance = self.data.get_condition(인덱스)
         condition_instance.조건명 = 조건명
     self.callback.on_data_updated(["조건식_dic"])
Exemplo n.º 41
0
    def on_condition(self, condition_index, condition_name):
        MyLogger.instance().logger().info("index: %d, name: %s", condition_index, condition_name)
        if self.is_done:
            MyLogger.instance().logger().info("is_done. do nothing")
            return

        if self.balance.보유수량 == 0:
            MyLogger.instance().logger().info("보유수량 == 0. do nothing")
            return

        수익률 = (self.balance.현재가 - self.balance.매입가) / self.balance.매입가
        MyLogger.instance().logger().debug("수익률: %f, 현재가: %d, 매입가: %d, 보유수량: %d", 수익률, self.balance.현재가, self.balance.매입가, self.balance.보유수량)

        if 수익률 > self.threshold:
            MyLogger.instance().logger().info("ConditionSell!!!! 보유수량: %d. 수익률: %f > threshold: %f", self.balance.보유수량, 수익률, self.threshold)
            self.on_sell_signal(self.balance.보유수량)
Exemplo n.º 42
0
    def on_real_data(self, sJongmokCode, sRealType, sRealData):
        MyLogger.instance().logger().debug("StopLoss. %s", self.balance.종목명)
        if self.is_queued:
            MyLogger.instance().logger().info("is_queued. do nothing")
            return

        if self.balance.보유수량 == 0:
            MyLogger.instance().logger().debug("보유수량 == 0. do nothing")
            return

        수익률 = self.balance.get_return_rate()
        MyLogger.instance().logger().debug("종목명: %s, 수익률: %f, 현재가: %d, 매입가: %d, 보유수량: %d", self.balance.종목명, 수익률, self.balance.현재가, self.balance.매입가, self.balance.보유수량)

        if 수익률 < self.threshold:
            MyLogger.instance().logger().info("StopLoss!!!! 종목명: %s, 보유수량: %d. 수익률: %f < threshold: %f", self.balance.종목명, self.balance.보유수량, 수익률, self.threshold)
            self.on_sell_signal(self.balance.보유수량)
Exemplo n.º 43
0
    def on_condition(self, condition_index, condition_name):
        MyLogger.instance().logger().info("index: %d, name: %s", condition_index, condition_name)
        if self.is_queued:
            MyLogger.instance().logger().info("is_queued. do nothing")
            return

        if self.balance.보유수량 == 0:
            MyLogger.instance().logger().info("보유수량 == 0. do nothing")
            return

        수익률 = self.balance.get_return_rate()
        MyLogger.instance().logger().debug("종목명: %s, 수익률: %f, 현재가: %d, 매입가: %d, 보유수량: %d", self.balance.종목명, 수익률, self.balance.현재가, self.balance.매입가, self.balance.보유수량)

        if 수익률 > self.threshold:
            MyLogger.instance().logger().info("ConditionSell!!!! %s 종목명: %s, 보유수량: %d. 수익률: %f > threshold: %f", condition_name, self.balance.종목명, self.balance.보유수량, 수익률, self.threshold)
            self.on_sell_signal(self.balance.보유수량)
Exemplo n.º 44
0
 def on_sell_strategy_changed(self, strategy):
     from kiwoom.strategy.stop_loss import StopLoss
     from kiwoom.strategy.condition_sell import ConditionSell
     from kiwoom.strategy.sell_on_closing import SellOnClosing
     if strategy == "sell_stop_loss":
         default_param = StopLoss.get_default_param()
     elif strategy == "sell_condition_sell":
         default_param = ConditionSell.get_default_param()
     elif strategy == "sell_on_closing":
         default_param = SellOnClosing.get_default_param()
     else:
         MyLogger.instance().logger().warning("unknown strategy. ignore %s",
                                              strategy)
     MyLogger.instance().logger().warning("strategy %s, default_param %s",
                                          strategy, str(default_param))
     self.ui.txt_sell_param.setText(str(default_param))
Exemplo n.º 45
0
    def on_balance_item_changed(self, item):
        if not self.is_user_changing_balance:
            return
        row = item.row()
        col = item.column()
        value = item.text()
        MyLogger.instance().logger().info("row:%d, col:%d, val:%s", row, col, value)

        종목코드_item = self.ui.table_current.item(row, 0)
        종목코드 = 종목코드_item.text()
        balance = kiwoom.data.get_balance(종목코드)
        changed_key = Balance.get_table_header()[col]
        if changed_key == "목표보유수량":
            balance.목표보유수량 = int(value)
        else:
            return
Exemplo n.º 46
0
    def on_real_data(self, sJongmokCode, sRealType, sRealData):
        MyLogger.instance().logger().info("StopLoss. %s", self.balance.종목명)
        if self.is_done:
            MyLogger.instance().logger().info("is_done. do nothing")
            return

        if self.balance.보유수량 == 0:
            MyLogger.instance().logger().info("보유수량 == 0. do nothing")
            return

        수익률 = (self.balance.현재가 - self.balance.매입가) / self.balance.매입가
        MyLogger.instance().logger().debug("수익률: %f, 현재가: %d, 매입가: %d, 보유수량: %d", 수익률, self.balance.현재가, self.balance.매입가, self.balance.보유수량)

        if 수익률 < self.threshold:
            MyLogger.instance().logger().info("StopLoss!!!! 보유수량: %d. 수익률: %f < threshold: %f", self.balance.보유수량, 수익률, self.threshold)
            self.on_sell_signal(self.balance.보유수량)
Exemplo n.º 47
0
    def collect_day_data(self):
        MyLogger.instance().logger().debug("")

        class DayData(threading.Thread):
            def __init__(self, the_ocx, the_condition_value):
                super().__init__()
                self.ocx = the_ocx
                self.condition_value = the_condition_value

            def run(self):
                kospi_code_list_str = self.ocx.dynamicCall("GetCodeListByMarket(QString)", ["0"])
                kospi_code_list = kospi_code_list_str.split(';')
                MyLogger.instance().logger().info("kospi_code_list. len: %d", len(kospi_code_list))
                kosdaq_code_list_str = self.ocx.dynamicCall("GetCodeListByMarket(QString)", ["10"])
                kosdaq_code_list = kosdaq_code_list_str.split(';')
                MyLogger.instance().logger().info("kosdaq_code_list. len: %d", len(kosdaq_code_list))
                code_list = kospi_code_list + kosdaq_code_list
                from datetime import datetime
                기준일자 = datetime.today().strftime("%Y%m%d")
                from glob import glob

                for code in code_list:
                    if len(code) < 3:
                        MyLogger.instance().logger().warning("unexpected code: %s", code)
                        continue

                    temp_list = glob('data/day/' + code + '*.csv')
                    if len(temp_list) >= 1:
                        MyLogger.instance().logger().warning("%s already exist", code)
                        continue

                    time.sleep(1)
                    self.condition_value.acquire()
                    self.ocx.dynamicCall("SetInputValue(QString, QString)", "종목코드", code)
                    self.ocx.dynamicCall("SetInputValue(QString, QString)", "기준일자", 기준일자)
                    self.ocx.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", "1")
                    ret = self.ocx.dynamicCall("CommRqData(QString, QString, int, QString)", "주식일봉조회", "opt10081", 0, constant.SN_데이터_일봉조회)
                    MyLogger.instance().logger().info("CommRqData. code: %s, ret: %d", code, ret)
                    self.condition_value.wait()

                self.condition_value.release()
                MyLogger.instance().logger().info("the end of run()")

        self.condition_value = threading.Condition()
        test_thread = DayData(self.ocx, self.condition_value)
        test_thread.start()
Exemplo n.º 48
0
    def on_balance_item_changed(self, item):
        if not self.is_user_changing_balance:
            return
        row = item.row()
        col = item.column()
        value = item.text()
        MyLogger.instance().logger().info("row:%d, col:%d, val:%s", row, col,
                                          value)

        종목코드_item = self.ui.table_current.item(row, 0)
        종목코드 = 종목코드_item.text()
        balance = kiwoom.data.get_balance(종목코드)
        changed_key = Balance.get_table_header()[col]
        if changed_key == "목표보유수량":
            balance.목표보유수량 = int(value)
        else:
            return
Exemplo n.º 49
0
    def on_load_balance_btn_clicked(self):
        MyLogger.instance().logger().info("")
        f = open("my_list.txt", "r", encoding='utf8')
        data = json.load(f)
        print(data)

        for item in data:
            balance = kiwoom.data.get_balance(item['종목코드'])
            balance.종목명 = item['종목명']
            if not item['목표보유수량']:
                balance.목표보유수량 = item['목표보유수량']
            for k, v in item['매수전략_dic'].items():
                balance.add_buy_strategy(k, v)
            for k, v in item['매도전략_dic'].items():
                balance.add_sell_strategy(k, v)

        self.on_data_updated(["잔고_dic"])
        kiwoom.refresh_interest_balance()
Exemplo n.º 50
0
    def OnReceiveRealCondition(self, strCode, strType, strConditionName,
                               strConditionIndex):
        MyLogger.instance().logger().info("%s, %s, %s, %s, %s", strCode,
                                          self.get_master_code_name(strCode),
                                          strType, strConditionName,
                                          strConditionIndex)
        condition = self.data.get_condition(int(strConditionIndex))

        if condition.신호종류 == "매도신호" and strType == 'I':  # 매도 조건식 편입
            if strCode not in self.data.잔고_dic:
                MyLogger.instance().logger().warning("보유 종목 아님. %s", strCode)
                return
            balance = self.data.get_balance(strCode)
            for 매도전략 in balance.매도전략.values():
                매도전략.on_condition(int(strConditionIndex), strConditionName)

        elif condition.신호종류 == "매수신호" and strType == "I":  # 매수 조건식 편입
            pass
Exemplo n.º 51
0
    def on_load_balance_btn_clicked(self):
        MyLogger.instance().logger().info("")
        f = open("my_list.txt", "r", encoding='utf8')
        data = json.load(f)
        print(data)

        for item in data:
            balance = kiwoom.data.get_balance(item['종목코드'])
            balance.종목명 = item['종목명']
            if not item['목표보유수량']:
                balance.목표보유수량 = item['목표보유수량']
            for k, v in item['매수전략_dic'].items():
                balance.add_buy_strategy(k, v)
            for k, v in item['매도전략_dic'].items():
                balance.add_sell_strategy(k, v)

        self.on_data_updated(["잔고_dic"])
        kiwoom.refresh_interest_balance()
Exemplo n.º 52
0
    def on_real_data(self, sJongmokCode, sRealType, sRealData):
        MyLogger.instance().logger().info("JustBuy")
        if self.is_queued:
            MyLogger.instance().logger().info("is_queued. do nothing")
            return

        if self.balance.목표보유수량 == 0 or self.balance.목표보유수량 <= self.balance.보유수량:
            MyLogger.instance().logger().info("목표보유수량: %d, 보유수량: %d. do nothing", self.balance.목표보유수량, self.balance.보유수량)
            return
        else:
            MyLogger.instance().logger().info("JustBuy!!!! 주문수량: %d", self.balance.목표보유수량 - self.balance.보유수량)
            self.on_buy_signal(self.balance.목표보유수량 - self.balance.보유수량)
Exemplo n.º 53
0
    def OnReceiveRealData(self, sJongmokCode, sRealType, sRealData):
        MyLogger.instance().logger().info("%s, %s, %s", sJongmokCode, sRealType, sRealData)

        if sRealType == "장시작시간":
            MyLogger.instance().logger().info("장시작시간")
            현재시간_str = self.ocx.dynamicCall("GetCommRealData(QString, int)", "장시작시간", 20)  # 체결시간
            현재시간_str = 현재시간_str.strip()
            MyLogger.instance().logger().info("체결시간: %s", 현재시간_str)

            # TODO 현재는 시장가로 주문. 좀 더 나은 전략 필요
            if 현재시간_str == "085500":  ## 8시 55분. 31분터 신호 옴
                for balance in self.data.잔고_dic.values():
                    for 매수전략 in balance.매수전략.values():
                        매수전략.on_time(현재시간_str)

        if sJongmokCode in self.data.잔고_dic:
            if (sRealType == "주식체결"):
                현재가_str = self.ocx.dynamicCall("GetCommRealData(QString, int)", "주식체결", 10)
                현재가 = int(현재가_str.strip())
                현재가 = 현재가 if 현재가 >= 0 else 현재가 * (-1)

                balance = self.data.get_balance(sJongmokCode)
                balance.현재가 = 현재가

                for 매수전략 in balance.매수전략.values():
                    매수전략.on_real_data(sJongmokCode, sRealType, sRealData)

                for 매도전략 in balance.매도전략.values():
                    매도전략.on_real_data(sJongmokCode, sRealType, sRealData)
Exemplo n.º 54
0
    def on_balance_section_clicked(self, row):
        MyLogger.instance().logger().info("row: %d", row)
        rows = []
        for idx in self.ui.table_current.selectedIndexes():
            current_row = idx.row()
            if current_row not in rows:
                rows.append(current_row)

        self.selected_balance.clear()
        for row in rows:
            종목코드_item = self.ui.table_current.item(row, 0)
            if not 종목코드_item:  # 빈칸(None)인 경우
                continue
            종목코드 = 종목코드_item.text()
            balance = kiwoom.data.get_balance(종목코드)
            self.selected_balance.append(balance)

        종목명_list = []
        for balance in self.selected_balance:
            종목명_list.append(balance.종목명)
        selected_balance_str = ",".join(종목명_list)
        self.ui.txt_balance.setText(selected_balance_str)
Exemplo n.º 55
0
 def OnReceiveTrCondition(self, sScrNo, strCodeList, strConditionName, nIndex, nNext):
     MyLogger.instance().logger().info("%s, %s, %s, %d, %d", sScrNo, strCodeList, strConditionName, nIndex, nNext)
     code_list_str = strCodeList[:-1]  # 마지막 ";" 제거
     code_list = code_list_str.split(';')
     MyLogger.instance().logger().info("code_list: %s", code_list)
     for code in code_list:
         name = self.ocx.dynamicCall("GetMasterCodeName(QString)", [code])
         MyLogger.instance().logger().info("code: %s, name: %s", code, name)
Exemplo n.º 56
0
    def on_condition_section_clicked(self, row):
        MyLogger.instance().logger().info("row: %d", row)
        rows = []
        for idx in self.ui.table_condition.selectedIndexes():
            current_row = idx.row()
            if current_row not in rows:
                rows.append(current_row)

        self.selected_condition.clear()
        for row in rows:

            인덱스_item = self.ui.table_condition.item(row, 0)
            if not 인덱스_item:  # 빈칸(None)인 경우
                continue
            인덱스 = int(인덱스_item.text())
            condition = kiwoom.data.get_condition(인덱스)
            self.selected_condition.append(condition)

        조건식_list = []
        for condition in self.selected_condition:
            조건식_list.append(condition.조건명)
        selected_condition_str = ",".join(조건식_list)
        self.ui.txt_condition_select.setText(selected_condition_str)
Exemplo n.º 57
0
    def on_time(self, cur_time_str):
        MyLogger.instance().logger().info("SellOnClosing. time: %s. %s", cur_time_str, self.balance.종목명)
        if self.is_queued:
            MyLogger.instance().logger().info("is_queued. do nothing")
            return

        if self.balance.보유수량 > 0:
            MyLogger.instance().logger().info("SellOnClosing!!!! 주문수량: %d", self.balance.보유수량)
            self.on_sell_signal(self.balance.보유수량)
Exemplo n.º 58
0
    def on_time(self, cur_time_str):
        MyLogger.instance().logger().info("BuyOnOpening. time: %s. %s", cur_time_str, self.balance.종목명)
        if self.is_done:
            MyLogger.instance().logger().info("is_done. do nothing")
            return

        if not self.balance.목표보유수량:
            return

        주문수량 = self.balance.목표보유수량 - self.balance.보유수량

        if self.balance.목표보유수량 == 0 or 주문수량 <= 0:
            MyLogger.instance().logger().info("목표보유수량: %d, 보유수량: %d. do nothing", self.balance.목표보유수량, self.balance.보유수량)
            return

        else:
            MyLogger.instance().logger().info("BuyOnOpening!!!! 주문수량: %d", 주문수량)
            self.on_buy_signal(주문수량)
Exemplo n.º 59
0
 def on_register_real_all_btn_clicked(self):
     MyLogger.instance().logger().info("")
     종목코드_list = []
     for balance in kiwoom.data.잔고_dic.values():
         if len(balance.매도전략) or len(balance.매수전략):
             종목코드_list.append(balance.종목코드)
     if len(종목코드_list):
         종목코드_list_str = ";".join(종목코드_list)
         MyLogger.instance().logger().info("종목코드_list_str %s", 종목코드_list_str)
         kiwoom.set_real_reg(종목코드_list_str)
     else:
         MyLogger.instance().logger().error("전략 있는 종목 없음")
Exemplo n.º 60
0
Arquivo: data.py Projeto: enowy/kiwoom
 def add_sell_strategy(self, the_전략명):
     from kiwoom.strategy.stop_loss import StopLoss
     from kiwoom.strategy.condition_sell import ConditionSell
     if the_전략명 not in self.매도전략:
         if the_전략명 == "sell_stop_loss":
             sell_stop_loss = StopLoss(self)
             self.매도전략[the_전략명] = sell_stop_loss
             MyLogger.instance().logger().info("sell_stop_loss 추가됨. %s", self.종목명)
         elif the_전략명 == "sell_condition_sell":
             sell_condition_sell = ConditionSell(self)
             self.매도전략[the_전략명] = sell_condition_sell
             MyLogger.instance().logger().info("sell_condition_sell 추가됨. %s", self.종목명)
         else:
             MyLogger.instance().logger().wanning("unknown strategy. ignore %s. %s", the_전략명, self.종목명)