Exemplo n.º 1
0
class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        #self.show()

        #########################################################################
        # Load Class
        self.kiwoom = Kiwoom()
        self.kiwoom.comm_connect()

        #self.holicAgent = holic_agent.HolicAgent()
        self.mholicstock = modelholicstock.ModelHolicStock()

        self.server = self.kiwoom.getLoginInfo("GetServerGubun")

        if len(self.server) == 0 or self.server != "1":
            self.serverGubun = "==== PROD ===="
        else:
            self.serverGubun = "DEV"

        #########################################################################
        #메인 타이머
        self.timer = QTimer(self)
        self.timer.start(1000)
        self.timer.timeout.connect(self.timeout)

        # Timer auto 실행
        self.timer_auto = QTimer(self)
        self.timer_auto.start(1000 * 10)
        self.timer_auto.timeout.connect(self.timer_auto_timeout)

        accouns_num = int(self.kiwoom.getLoginInfo("ACCOUNT_CNT"))
        accounts = self.kiwoom.getLoginInfo("ACCNO")
        accounts_list = accounts.split(';')[0:accouns_num]
        self.accountComboBox.addItems(accounts_list)

        #########################################################################
        # Event Callback connect
        self.pushButton.clicked.connect(self.send_order)
        self.lineEdit.textChanged.connect(self.code_changed)
        self.pushButton_2.clicked.connect(self.check_balance)

        self.btn_autoorder.clicked.connect(self.start_auto_order)
        self.btn_stopautoorder.clicked.connect(self.stop_auto_order)

        self.btn_start_mon.clicked.connect(self.automated_stock_mon)

        self.btn_start_analysis.clicked.connect(self.analysis_condition)

        #########################################################################
        # 메인 변수
        self.df_condition = pd.DataFrame()
        self.df_anaysis = pd.DataFrame()

    ##################################################################################################### Analisys

    def automated_stock_mon(self):
        '''
        DB에 저장된 항목 / 조건검색 항목 DB 저장.

        :return:
        '''
        print("[automated_stock_mon]")

        #df_minute_data = self.kiwoom.get_min_chart("039490", "5")
        #print(df_minute_data)

        # CONDITIN 종목에 대한 정보 확보
        self.kiwoom.get_condition()

        for idx in range(len(self.kiwoom.condition_name_list)):
            #print(self.kiwoom.condition_name_list[idx])
            if self.kiwoom.condition_name_list[idx] != '':
                self.kiwoom.send_condition(idx)
        print("#### total condition list : " + self.kiwoom.conditionStockItem)
        # 학습 대상 선정
        ''' 매수가 완료된 종목에 대한 변동이 필요함.  '''
        # stock list 획득
        #self.mystock_list = self.mholicstock.read_my_stock('buy')
        #print("#### total mystock list : " + self.mystock_list)
        # [0. 조건검색 결과 + 저장된 리스트 ]
        #for j in range(len(self.mystock_list)):
        #    self.kiwoom.conditionStockItem += str(self.mystock_list[j][0]) + ';'

        #print(self.kiwoom.conditionStockItem)

        # [1. kiwoom get DATA ]
        self.kiwoom.comm_kw_rq_data(self.kiwoom.conditionStockItem)

        # [2. 조회된 데이타에 대한 DATA 분석  ret=df ]
        self.df_condition = pd.DataFrame.from_dict(
            self.kiwoom.automatedStockDict, orient='index')
        print(self.df_condition)
        #print(self.df_main_list.loc[:, ['code']].to_dict() )

        # [3. Display Qt MainTableWidget ]
        dict_count = len(self.kiwoom.automatedStockDict)
        header_list = [
            'signal', 'weight', 'name', 'cprice', 'updown', 'rate', 'volume',
            'code', 'date'
        ]
        column_idx_lookup = {
            header_list[i]: i
            for i in range(0, len(header_list))
        }
        #column_idx_lookup = {'date': 0, 'code': 1, 'name': 2, 'cprice': 3, 'updown': 4, 'rate': 5, 'volume': 6}
        #print(column_idx_lookup)

        self.tableAutomatedStock.setColumnCount(len(header_list))
        self.tableAutomatedStock.setRowCount(dict_count)
        self.tableAutomatedStock.setHorizontalHeaderLabels(header_list)

        if not isinstance(self.kiwoom.automatedStockDict,
                          collections.Iterable):
            raise ParameterTypeError()

        #print("loop start ")
        for row, stocK_value in enumerate(
                self.kiwoom.automatedStockDict.items()):
            #print(stocK_value[1])

            for key, value in stocK_value[1].items():
                #print("key : {}, value: {}".format(key, value))
                col = column_idx_lookup[key]

                item = QTableWidgetItem(value)

                if key == 'name':
                    item.setTextAlignment(Qt.AlignVCenter | Qt.AlignLeft)
                else:
                    item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
                self.tableAutomatedStock.setItem(row, col, item)

        self.tableAutomatedStock.resizeRowsToContents()
        self.tableAutomatedStock.resizeColumnsToContents()

    def analysis_condition(self):
        # [3. 각종목에 대한 분봉 데이타 획득 1분 / 3분 / 5분 ]
        for index, row in self.df_condition.iterrows():
            print(row['name'], row['code'])
            self.df_anaysis = self.kiwoom.get_min_chart(row['code'], '5')
            self.df_anaysis['code'] = row['code']
            #print(self.df_anaysis)
            #sself.mholicstock.insert_stock_data(self.df_anaysis)

            prep_data = data_manager.preprocess(self.df_anaysis)

            print(prep_data)

    ###############################################################
    #   자동주문   및 수동 주문                                   #
    ###############################################################

    def init_auto_order(self):
        self.selectedCondition = ''  #선택된 조건식

        self.profit_Rate = ''  #이익률
        self.loss_Rate = ''  #손절률

        self.limit_Buying_Per_Stock = ''  #종목당 매수금액
        self.limit_Buying_Stock_Number = ''  #매입 제한 종목개수

        # 한번의 주문이 진행 되고 나면 다시 셋팅 하는 과정을 가져감.

        # 예수금상세현황요청을 하여야 하는지 종목 갯수에 대한 확인을 진행 해야 하는지

    def start_auto_order(self):
        # 자동 주문
        print("[ start_auto_order ]")
        print(self.df_machined_stock_item)

        # 시간에 따라 타임 아웃 나올때 마다 주문 프로세스를 호출함.
        self.isAutomaticOrder = True

    def stop_auto_order(self):
        print("[ stop_auto_order ] Finished Order... ")
        self.isAutomaticOrder = False

    def set_auto_order_stocks(self):
        fileList = ["buy_list.txt", "sell_list.txt"]
        automatedStocks = []

        try:
            for file in fileList:
                # utf-8로 작성된 파일을
                # cp949 환경에서 읽기위해서 encoding 지정
                with open(file, 'rt', encoding='utf-8') as f:
                    stocksList = f.readlines()
                    automatedStocks += stocksList
        except Exception as e:
            e.msg = "setAutomatedStocks() 에러"
            self.showDialog('Critical', e)
            return

        # 테이블 행수 설정
        cnt = len(automatedStocks)
        self.automatedStocksTable.setRowCount(cnt)

        # 테이블에 출력
        for i in range(cnt):
            stocks = automatedStocks[i].split(';')

            for j in range(len(stocks)):
                if j == 1:
                    name = self.kiwoom.getMasterCodeName(stocks[j].rstrip())
                    item = QTableWidgetItem(name)
                else:
                    item = QTableWidgetItem(stocks[j].rstrip())

                item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter)
                self.automatedStocksTable.setItem(i, j, item)

        self.automatedStocksTable.resizeRowsToContents()

    def send_order(self):
        order_type_lookup = {'신규매수': 1, '신규매도': 2, '매수취소': 3, '매도취소': 4}
        hoga_lookup = {'지정가': "00", '시장가': "03"}

        account = self.accountComboBox.currentText()
        order_type = self.comboBox_2.currentText()
        code = self.lineEdit.text()
        hoga = self.comboBox_3.currentText()
        num = self.spinBox.value()
        price = self.spinBox_2.value()

        self.kiwoom.send_order("send_order_req", "0101", account,
                               order_type_lookup[order_type], code, num, price,
                               hoga_lookup[hoga], "")

        # 성공 여부에 대한 확인도 필요
        self.reset_order()

    def reset_order(self):
        print("#### reset order ")
        self.accountComboBox.setCurrentIndex(0)
        self.comboBox_2.setCurrentIndex(0)
        self.lineEdit.setText('')
        self.comboBox_3.setCurrentIndex(0)
        self.spinBox.setValue(0)
        self.spinBox_2.setValue(0)

    ###############################################################
    #   예수금 및 보유 종목 정보
    ###############################################################
    def check_balance(self):
        print("#### cb_check_balance called.")

        self.kiwoom.reset_opw00018_output()
        account_number = self.kiwoom.getLoginInfo("ACCNO")
        account_number = account_number.split(';')[0]

        self.kiwoom.set_input_value("계좌번호", account_number)
        self.kiwoom.comm_rq_data("opw00018_req", "opw00018", 0, "2000")

        while self.kiwoom.remained_data:
            time.sleep(0.2)
            self.kiwoom.set_input_value("계좌번호", account_number)
            self.kiwoom.comm_rq_data("opw00018_req", "opw00018", 2, "2000")

        # opw00001
        self.kiwoom.set_input_value("계좌번호", account_number)
        self.kiwoom.comm_rq_data("opw00001_req", "opw00001", 0, "2000")

        # balance
        item = QTableWidgetItem(self.kiwoom.d2_deposit)
        item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.tableWidget.setItem(0, 0, item)

        for i in range(1, 6):
            item = QTableWidgetItem(self.kiwoom.opw00018_output['single'][i -
                                                                          1])
            item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
            self.tableWidget.setItem(0, i, item)

        self.tableWidget.resizeRowsToContents()
        self.tableWidget.resizeColumnsToContents()

        # Item list
        item_count = len(self.kiwoom.opw00018_output['multi'])
        self.tableWidget_2.setRowCount(item_count)

        for j in range(item_count):
            row = self.kiwoom.opw00018_output['multi'][j]
            for i in range(len(row)):
                item = QTableWidgetItem(row[i])
                item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
                self.tableWidget_2.setItem(j, i, item)

        self.tableWidget_2.resizeRowsToContents()
        self.tableWidget_2.resizeColumnsToContents()

    ###############################################################
    #   공통함수                                           #
    ###############################################################
    def code_changed(self):
        code = self.lineEdit.text()
        name = self.kiwoom.get_master_code_name(code)
        self.lineEdit_2.setText(name)

    def timeout(self):
        """ 타임아웃 이벤트가 발생하면 호출되는 메서드 """

        current_time = QTime.currentTime()
        text_time = current_time.toString("hh:mm:ss")
        time_msg = "현재시간: " + text_time

        state = self.kiwoom.GetConnectState()
        if state == 1:
            state_msg = "server connected"
        else:
            state_msg = "not connected"

        self.statusbar.showMessage(state_msg + " | " + time_msg)

    def timer_auto_timeout(self):
        print('time_auto ---- ')

        if self.checkBox.isChecked():
            self.check_balance()
Exemplo n.º 2
0
class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        #인스턴스 생성 후 로그인
        self.kiwoom = Kiwoom()
        self.kiwoom.comm_connect()

        #1초타이머
        self.timer = QTimer(self)
        self.timer.start(1000)
        self.timer.timeout.connect(self.timeout)

        #10초 타이머
        self.timer2 = QTimer(self)
        self.timer2.start(10000)
        self.timer2.timeout.connect(self.timeout2)

        #계좌수 및 계좌번호
        accounts_num = int(self.kiwoom.get_login_info("ACCOUNT_CNT"))
        accounts = self.kiwoom.get_login_info("ACCNO")
        accounts_list = accounts.split(';')[0:accounts_num]

        #UI에 기능추가
        self.comboBox.addItems(accounts_list)
        self.lineEdit.textChanged.connect(self.code_changed)
        self.pushButton.clicked.connect(self.send_order)
        self.pushButton_2.clicked.connect(self.check_balance)


    #라인에딧의 텍스트 받아와 라인에딧2에 종목명 출력
    def code_changed(self):
        code = self.lineEdit.text()
        name = self.kiwoom.get_master_code_name(code)
        self.lineEdit_2.setText(name)

    #주문요청
    def send_order(self):
        order_type_lookup = {'신규매수':1, '신규매도':2, '매수취소':3, '매도취소':4}
        hoga_lookup = {'지정가': "00", '시장가': "03"}

        account = self.comboBox.currentText()
        order_type = self.comboBox_2.currentText()
        code = self.lineEdit.text()
        hoga = self.comboBox_3.currentText()
        num = self.spinBox.Value()
        price = self.spinBox_2.value()

        self.kiwoom.send_order("send_order_req", "0101", account, order_type_lookup[order_type], code,
                               num, price, hoga_lookup[hoga], "")

    #현 계좌/투자정보 조회
    def check_balance(self):
        self.kiwoom.reset_opw00018_output()
        account_number = self.kiwoom.get_login_info("ACCNO")
        account_number = account_number.split(';')[0]

        self.kiwoom.set_input_value("계좌번호", account_number)
        self.kiwoom.comm_rq_data("opw00018_req", "opw00018", 0, "2000")

        while self.kiwoom.remained_data:
            time.sleep(0.2)
            self.kiwoom.set_input_value("계좌번호", account_number)
            self.kiwoom.comm_rq_data("opw00018_req", "opw00018", 2, "2000")

        # opw00001
        self.kiwoom.set_input_value("계좌번호", account_number)
        self.kiwoom.comm_rq_data("opw00001_req", "opw00001", 0, "2000")

        # balance
        item = QTableWidgetItem(self.kiwoom.d2_deposit)
        item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
        self.tableWidget.setItem(0, 0, item)

        for i in range(1, 6):
            item = QTableWidgetItem(self.kiwoom.opw00018_output['single'][i - 1])
            item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
            self.tableWidget.setItem(0, i, item)

        self.tableWidget.resizeRowsToContents()

        # Item list
        item_count = len(self.kiwoom.opw00018_output['multi'])
        self.tableWidget_2.setRowCount(item_count)

        for j in range(item_count):
            row = self.kiwoom.opw00018_output['multi'][j]
            for i in range(len(row)):
                item = QTableWidgetItem(row[i])
                item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
                self.tableWidget_2.setItem(j, i, item)

        self.tableWidget_2.resizeRowsToContents()


    def timeout(self):
        current_time = QTime.currentTime()
        text_time = current_time.toString("hh:mm:ss")
        time_msg = "현재시간: " + text_time

        state = self.kiwoom.get_connect_state()
        if state == 1:
            state_msg = "서버 연결 중"
        else:
            state_msg = "서버 미 연결 중"

        self.statusbar.showMessage(state_msg + " | " + time_msg)

    def timeout2(self):
        if self.checkBox.isChecked():
            self.check_balance()