Example #1
0
class MainWindow(PageWindow):
    def __init__(self, dir):
        super().__init__()
        global temp_global
        self.storage = firebase.screening()

        try:
            self.ser = serial.Serial(port='COM3',
                                     baudrate=115200,
                                     bytesize=8,
                                     parity='N',
                                     stopbits=1)
        except Exception as ex:
            template = ''
            message = template.format(type(ex).__name__, ex.args)
            print(message)
        self.dirname = dir

        self.seperator_vertical = QVSeperationLine()
        self.seperator_horizontal = QHSeperationLine()
        self.initUI()

        self.setWindowTitle("MainWindow")
        self.overlay = Overlay(self.centralWidget())
        self.available_cameras = QCameraInfo.availableCameras()
        if not self.available_cameras:
            pass  #quit
        self.select_camera(0)

    def initUI(self):
        self.homeUI()

    def homeUI(self):
        self.preview_widget = QWidget()
        self.footer_widget = QWidget()
        self.grid_widget = QWidget()
        self.graph_widget = QWidget()
        self.home = True
        self.viewfinder = QCameraViewfinder()
        self.viewfinder.show()
        self.setCentralWidget(self.viewfinder)
        self.cap = None  #  -capture <-> +cap
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout2 = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout = QVBoxLayout()
        self.chartLayout = QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.image_label = QLabel()
        self.image_label.setText("")
        self.image_label.setObjectName("image_label")
        self.image_label.setStyleSheet("QLabel { margin-right:4px;  }")

        self.temp = QLabel()
        self.temp.setText("TEMPERATURE : ")
        self.temp.setObjectName("temp")
        self.temp.setFont(QFont("Gadugi", 20, weight=QFont.Bold))
        #self.temp.setAlignment(QtCore.Qt.AlignCenter)
        self.temp_reading = QLabel()
        self.temp_reading.setText("READING...")
        self.temp_reading.setObjectName("temp_reading")
        self.temp_reading.setFont(QFont("Gadugi", 20, weight=QFont.Bold))
        #self.temp_reading.setAlignment(QtCore.Qt.AlignCenter)

        self.temp2 = QLabel()
        self.temp2.setText("ROOM READING : ")
        self.temp2.setFont(QFont("Gadugi", 15, weight=QFont.Bold))
        self.temp2.setObjectName("temp2")
        #self.temp2.setAlignment(QtCore.Qt.AlignCenter)

        self.temp2_reading = QLabel()
        self.temp2_reading.setText("READING...")
        self.temp2_reading.setFont(QFont("Gadugi", 15, weight=QFont.Bold))
        #self.temp2_reading.setAlignment(QtCore.Qt.AlignCenter)
        self.temp2_reading.setObjectName("temp2_reading")

        self.image_label.setScaledContents(True)

        self.matplotlibWidget = MatplotlibWidget(self)
        self.threadSample = ThreadSample(self)
        self.threadSample.newSample.connect(self.on_threadSample_newSample)
        self.threadSample.finished.connect(self.on_threadSample_finished)

        self.gridLayout = QGridLayout(self)
        self.gridLayout.addWidget(self.temp, 0, 0, 1, 1)
        self.gridLayout.addWidget(self.temp_reading, 0, 1, 1, 3)
        # self.gridLayout.addWidget(self.temp2,2,0,1,1)
        # self.gridLayout.addWidget(self.temp2_reading,2,1,1,3)
        self.clock(self.gridLayout, 2, 0, 1, 3)

        self.grid_widget.setLayout(self.gridLayout)
        self.grid_widget.setMinimumHeight(250)
        self.grid_widget.setMaximumHeight(250)
        self.grid_widget.setMinimumWidth(600)
        self.grid_widget.setMaximumWidth(600)

        self.horizontalLayout.addWidget(self.image_label)
        #self.horizontalLayout.addWidget(self.seperator_vertical)
        self.horizontalLayout.addWidget(self.graph_widget)

        self.preview_widget.setLayout(self.horizontalLayout)
        self.preview_widget.setMinimumHeight(200)
        self.preview_widget.setMaximumHeight(200)
        self.preview_widget.setMinimumWidth(600)
        self.preview_widget.setMaximumWidth(600)

        # self.chartLayout.addWidget(self.matplotlibWidget)
        # self.graph_widget.setLayout(self.chartLayout)
        self.graph_widget.setMinimumHeight(250)
        self.graph_widget.setMaximumHeight(250)
        self.graph_widget.setMinimumWidth(250)
        self.graph_widget.setMaximumWidth(250)

        self.horizontalLayout2.addWidget(self.grid_widget)
        #         self.horizontalLayout2.addWidget(self.seperator_vertical)
        #self.horizontalLayout2.addWidget(self.clock)
        #self.clock(self.horizontalLayout2)

        self.footer_widget.setLayout(self.horizontalLayout2)
        self.footer_widget.setMinimumHeight(250)
        self.footer_widget.setMaximumHeight(250)
        self.footer_widget.setMinimumWidth(600)
        self.footer_widget.setMaximumWidth(600)

        self.verticalLayout.addWidget(self.preview_widget)
        self.verticalLayout.addWidget(self.seperator_horizontal)
        self.verticalLayout.addWidget(self.footer_widget)
        #self.verticalLayout.addWidget(self.image_label2)

        self.timer = QTimer(self, interval=5)
        self.timer.timeout.connect(self.update_frame)
        self._image_counter = 0
        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)
        self.centralWidget().setLayout(self.verticalLayout)
        self.start_webcam()
        self.update_frame()
        #         self.setCentralWidget(self.scroll)
        self.setGeometry(300, 300, 400, 700)
        thread = Thread(target=self.read_temp)
        thread.daemon = True
        thread.start()

    def select_camera(self, i):
        self.camera = QCamera(self.available_cameras[i])
        self.camera.setViewfinder(self.viewfinder)
        self.camera.setCaptureMode(QCamera.CaptureStillImage)
        self.camera.error.connect(
            lambda: self.alert(self.camera.errorString()))
        self.camera.start()

        self.capture = QCameraImageCapture(self.camera)
        self.capture.error.connect(lambda i, e, s: self.alert(s))
        self.capture.imageCaptured.connect(lambda d, i: self.statusmessage(
            "Image %04d captured" % self.save_seq))

        self.current_camera_name = self.available_cameras[i].description()
        self.save_seq = 0

    def read_temp(self):
        temp = []
        while True:
            self.ser.write(b'0x55,0xAA,5,1,4')
            response = self.ser.readline()
            print(str(response))
            if 'body' in str(response):
                temp.append(str(response))
                #print("temp-"+str(response))
                #print(temp)
            elif 'Vbat' in str(response):
                if len(temp) != 0:

                    temp[1] = temp[1].replace('b\'T body =', '')
                    temp[1] = temp[1].replace("\\r\\n'", '')
                    temp[0] = temp[0].replace('b\'T body =', '')
                    temp[0] = temp[0].replace("compensate\\r\\n'", '')
                    self.findFaces('-'.join(temp))
                    self.update_label(temp[0], temp[1], '12')
                temp = []
                time.sleep(1)

        # start = time.clock()
        # while True:
        # if True:
        #     if True:
        #         temp.append(str(random.randint(0,100)))
        #         temp.append(str(random.randint(0,100)))
        #         self.overlay.show()
        #         # self.findFaces('-'.join(temp))
        #         self.update_label(temp[0],temp[1],'12')
        #         self.overlay.hide()

        #         print("Done-"+ ' '.join(temp))

        #     temp = []
        #     time.sleep(1)

    def statusmessage(self, msg):
        self.statusBar().showMessage(msg)

    def update_label(self, temp1, temp2, time):
        print(temp1)
        global temp_global
        temp2 = self.getTemp(str(temp2))
        temp1 = self.getTemp(str(temp1))
        unit = " °C"
        constraint_1 = 36.1
        constraint_2 = 37.2
        if temp_global == 1:
            unit = " °F"
            constraint_1 = 97
            constraint_2 = 99
            temp2 = ((temp2 * (9 / 5)) + 32)

        if temp2 >= constraint_1 and temp2 <= constraint_2:
            pal = self.temp_reading.palette()
            pal.setColor(QPalette.WindowText, QColor("green"))
            self.temp_reading.setPalette(pal)
        else:
            pal = self.temp_reading.palette()
            pal.setColor(QPalette.WindowText, QColor("red"))
            self.temp_reading.setPalette(pal)

#         if temp2>=36.1 and temp2<=37.2:
#             pal = self.temp_reading.palette()
#             pal.setColor(QPalette.WindowText, QColor("black"))
#             self.temp2_reading.setPalette(pal)
#         else:
#             pal = self.temp_reading.palette()
#             pal.setColor(QPalette.WindowText, QColor("black"))
#             self.temp2_reading.setPalette(pal)

        self.temp_reading.setText(str(temp2) + unit)

        self.temp2_reading.setText(str(temp1) + unit)
        #self.temp2_reading.setColor(QPalette.WindowText, QtGui.QColor("red"))

    def getTemp(self, inp):
        temp = re.findall(r"[-+]?\d*\.\d+|\d+", inp)
        temp = ''.join(temp)
        if temp == '':
            return 0
        else:
            return round(float(temp), 1)

    def filter(self, text):

        text = text.replace('bTbody', 'body')
        text = text.replace('\'', '')

        text = text.replace('\\r\n\'b\'Tbody', '-')
        text = text.replace('\\r', '')
        text = text.replace('\r', '')
        text = text.replace('\\xa8', '')
        text = text.replace('\\xa1\\xe6', '')
        text = text.replace('\\n', '-')
        text = text.replace(' ', '')
        text = text.replace(', ', ',')
        text = text.replace('=', '_')
        text = text.replace(',', '-')
        return text

    def alert(self, s):
        """
        Handle errors coming from QCamera dn QCameraImageCapture by displaying alerts.
        """
        err = QErrorMessage(self)
        err.showMessage(s)

    @QtCore.pyqtSlot()
    def start_webcam(self):
        if self.cap is None:
            self.cap = cv2.VideoCapture(0)
            self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
            self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        self.timer.start()

    def start_cam(self):
        self.cap.open(0)

    def stop_webcam(self):
        self.cap.release()

    def closeEvent(self, event):
        print("closing PyQtTest")
        self.cap.close()

    @QtCore.pyqtSlot()
    def update_frame(self):
        if self.cap.isOpened():
            ret, image = self.cap.read()
            #self.face_detect(image,file_name)
            simage = cv2.flip(image, 1)
            self.displayImage(image, True)

    def findFaces(self, file_name):
        face_detect = True
        while face_detect:
            if self.cap.isOpened():
                ret, frame = self.cap.read()
                face_locations = fl(frame)

                print("I found {} face(s) in this photograph.".format(
                    len(face_locations)))
                #self.statusmessage("I found {} face(s) in this photograph.".format(len(face_locations)))
                for face_location in face_locations:
                    face_detect = False
                    # Print the location of each face in this image
                    top, right, bottom, left = face_location
                    print(
                        "A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}"
                        .format(top, left, bottom, right))
                    # ts = time.time()
                    # You can access the actual face itself like this:
                    face_image = frame[top - 100:bottom + 100,
                                       left - 100:right + 100]
                    ts = datetime.now().strftime('%Y_%m_%d-%H_%M_%S')
                    cv2.imwrite(
                        os.path.abspath(
                            os.path.join(self.dirname,
                                         (ts + '-' + file_name + '.jpg'))),
                        face_image)
                    self.storage.upload(self.dirname,
                                        (ts + '-' + file_name + '.jpg'))

    def face_detect(self, file_name):

        face_locations = []
        face_encodings = []
        face_names = []
        process_this_frame = True
        i = 0
        face_detect = True
        # Resize frame of video to 1/4 size for faster face recognition processing
        while face_detect:
            ret, frame = self.cap.read()
            #self.face_detect(image,file_name)
            #simage     = cv2.flip(image, 1)
            small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

            # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
            rgb_small_frame = small_frame[:, :, ::-1]

            # Only process every other frame of video to save time
            if process_this_frame:
                # Find all the faces and face encodings in the current frame of video
                face_locations = face_recognition.face_locations(
                    rgb_small_frame)
                face_encodings = face_recognition.face_encodings(
                    rgb_small_frame, face_locations)

                face_names = []
                for face_encoding in face_encodings:
                    # See if the face is a match for the known face(s)
                    face_detect = False
                    name = "Unknown"
                    cv2.imwrite(
                        os.path.abspath(
                            os.path.join(
                                self.dirname,
                                (datetime.today().strftime('%Y-%m-%d') + '-' +
                                 file_name + '-' + str(++i) + '.png'))), frame)
                    #self.storage.upload(self.dirname,(datetime.today().strftime('%Y-%m-%d')+'-'+file_name+'-'+str(i)+'.png'))

                    i = i + 1

                    print("I see someone named {}!".format(name))
                    # # If a match was found in known_face_encodings, just use the first one.
                    # if True in matches:
                    #     first_match_index = matches.index(True)
                    #     name = known_face_names[first_match_index]

                    # Or instead, use the known face with the smallest distance to the new face

                    process_this_frame = not process_this_frame

    @QtCore.pyqtSlot()
    def capture_image(self):
        if self.cap.isOpened():
            flag, frame = self.cap.read()
            timestamp = time.strftime("%d-%b-%Y-%H_%M_%S")

            self.save_seq += 1

            path = self.dirname  #
            if flag:
                QtWidgets.QApplication.beep()
                name = "my_image.jpg"
                cv2.imwrite(
                    os.path.join(
                        self.dirname, "%s-%04d-%s.jpg" %
                        (self.current_camera_name, self.save_seq, timestamp)),
                    frame)
                self.alert('Image Store Successfully.')
                self._image_counter += 1

    def displayImage(self, img, window=True):
        qformat = QImage.Format_Indexed8
        if len(img.shape) == 3:
            if img.shape[2] == 4:
                qformat = QImage.Format_RGBA8888
            else:
                qformat = QImage.Format_RGB888
        outImage = QImage(img, img.shape[1], img.shape[0], img.strides[0],
                          qformat)
        outImage = outImage.rgbSwapped()
        if window:
            self.image_label.setStyleSheet("""
        QLabel {
            height:300px !important;
            
            }
        """)

            self.image_label.setPixmap(QPixmap.fromImage(outImage))

    def clock(self, layout, row, col, row_span, col_span):
        self.verticalLayoutClock = QVBoxLayout(self)
        self.dateEdit = QDateEdit(self)
        self.dateEdit.setDisplayFormat("MMM dd yyyy")
        self.dateEdit.setFont(QFont("Gadugi", 18, weight=QFont.Bold))
        self.dateEdit.setDisabled(True)
        self.verticalLayoutClock.addWidget(self.dateEdit)
        self.timeEdit = QTimeEdit(self)
        self.timeEdit.setFont(QFont("Gadugi", 18, weight=QFont.Bold))
        self.timeEdit.setDisplayFormat("hh:mm:ss AP")
        self.timeEdit.setDisabled(True)
        self.verticalLayoutClock.addWidget(self.timeEdit)
        self.updateTime()
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.updateTime)
        self.timer.start(1000)
        layout.addLayout(self.verticalLayoutClock, row, col, row_span,
                         col_span)

    @QtCore.pyqtSlot(list)
    def on_threadSample_newSample(self, sample):
        self.matplotlibWidget.axis.plot(sample)
        self.matplotlibWidget.canvas.draw()

    @QtCore.pyqtSlot()
    def on_threadSample_finished(self):
        self.samples += 1
        if self.samples <= 2:
            self.threadSample.start()

    @QtCore.pyqtSlot()
    def on_pushButtonPlot_clicked(self):
        self.samples = 0
        self.matplotlibWidget.axis.clear()
        self.threadSample.start()

    def updateTime(self):
        current = QtCore.QDateTime.currentDateTime()
        self.dateEdit.setDate(current.date())
        self.timeEdit.setTime(current.time())
Example #2
0
class MACDBackTest(QDialog):
    def __init__(self):
        super(MACDBackTest, self).__init__()
        self.codepool = [
            "000001",
            "000002",
            "000004",
        ]
        self.initUI()

    def initUI(self):
        self.resize(900, 600)
        self.setWindowTitle("QUANT XH 金融终端——MACD金叉死叉回测")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.poollabel = QLabel()
        self.poollabel.setText("股票池")
        self.poollabel.setFont(QFont("仿宋", 15))
        self.pooledit = QTextEdit()
        self.pooledit.setFont(QFont("仿宋", 12))
        self.pooledit.setFixedSize(120, 30)
        self.pooladdbtn = QPushButton()
        self.pooladdbtn.setText("添加股票")
        self.pooladdbtn.setFont(QFont("仿宋", 12))
        self.pooladdbtn.setFixedSize(100, 30)
        self.pooladdbtn.clicked.connect(self.addCode)
        self.poolclbtn = QPushButton()
        self.poolclbtn.setText("清空")
        self.poolclbtn.setFont(QFont("仿宋", 12))
        self.poolclbtn.setFixedSize(80, 30)
        self.poolclbtn.clicked.connect(self.clearPool)
        self.pooltb = QTextBrowser()
        self.pooltb.setFixedSize(300, 300)
        self.pooltb.setFont(QFont("仿宋", 12))

        self.shortlabel = QLabel()
        self.shortlabel.setText("SHORT")
        self.shortlabel.setFont(QFont("仿宋", 15))
        self.shortedit = QTextEdit()
        self.shortedit.setText("12")
        self.shortedit.setFont(QFont("仿宋", 12))
        self.shortedit.setFixedSize(50, 30)
        self.longlabel = QLabel()
        self.longlabel.setText("LONG")
        self.longlabel.setFont(QFont("仿宋", 15))
        self.longedit = QTextEdit()
        self.longedit.setText("26")
        self.longedit.setFont(QFont("仿宋", 12))
        self.longedit.setFixedSize(50, 30)
        self.mlabel = QLabel()
        self.mlabel.setText("M")
        self.mlabel.setFont(QFont("仿宋", 15))
        self.medit = QTextEdit()
        self.medit.setText("9")
        self.medit.setFont(QFont("仿宋", 12))
        self.medit.setFixedSize(50, 30)

        self.texttb = QTextBrowser()
        self.texttb.setFont(QFont("仿宋", 10))
        self.texttb.setFixedSize(300, 150)
        self.texttb.setText(
            "当DIFF和DEA均为正值,DIFF线向上突破DEA线,在0轴上方形成金叉,表示市场上买盘非常踊跃,上涨行情仍将继续。\n\n"
            "当DIFF和DEA均为负值,DIFF线向上突破DEA线,在0轴下方形成金叉表示市场上的做空气氛有所缓解,股价可能止跌反弹。")

        self.ckfromtimelabel = QLabel()
        self.ckfromtimelabel.setText("窗口开始时间")
        self.ckfromtimelabel.setFont(QFont("仿宋", 15))
        self.ckfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date()
        self.ckfromtimeedit.setDate(datefrom)
        self.ckfromtimeedit.setFont(QFont("仿宋", 12))
        self.ckfromtimeedit.setFixedSize(200, 30)

        self.cktotimelabel = QLabel()
        self.cktotimelabel.setText("窗口结束时间")
        self.cktotimelabel.setFont(QFont("仿宋", 15))
        self.cktotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date()
        self.cktotimeedit.setDate(dateto)
        self.cktotimeedit.setFont(QFont("仿宋", 12))
        self.cktotimeedit.setFixedSize(200, 30)

        self.ycfromtimelabel = QLabel()
        self.ycfromtimelabel.setText("预测开始时间")
        self.ycfromtimelabel.setFont(QFont("仿宋", 15))
        self.ycfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date()
        self.ycfromtimeedit.setDate(datefrom)
        self.ycfromtimeedit.setFont(QFont("仿宋", 12))
        self.ycfromtimeedit.setFixedSize(200, 30)

        self.yctotimelabel = QLabel()
        self.yctotimelabel.setText("预测结束时间")
        self.yctotimelabel.setFont(QFont("仿宋", 15))
        self.yctotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date()
        self.yctotimeedit.setDate(dateto)
        self.yctotimeedit.setFont(QFont("仿宋", 12))
        self.yctotimeedit.setFixedSize(200, 30)

        self.cashlabel = QLabel()
        self.cashlabel.setText("初始资金")
        self.cashlabel.setFont(QFont("仿宋", 15))
        self.cashedit = QTextEdit()
        self.cashedit.setText("1000000")
        self.cashedit.setFont(QFont("仿宋", 12))
        self.cashedit.setFixedSize(200, 30)

        self.amountlabel = QLabel()
        self.amountlabel.setText("单笔交易股数")
        self.amountlabel.setFont(QFont("仿宋", 15))
        self.amountedit = QTextEdit()
        self.amountedit.setText("3000")
        self.amountedit.setFont(QFont("仿宋", 12))
        self.amountedit.setFixedSize(200, 30)

        self.selectbtn = QPushButton()
        self.selectbtn.setText("开始回测")
        self.selectbtn.setFixedSize(120, 40)
        self.selectbtn.setFont(QFont("仿宋", 12))
        self.selectbtn.clicked.connect(self.backTest)

        # self.resultbtn = QPushButton()
        # self.resultbtn.setText("回测结果")
        # self.resultbtn.setFixedSize(120,40)
        # self.resultbtn.setFont(QFont("仿宋", 12))
        # self.resultbtn.setEnabled(False)

        self.h11box = QHBoxLayout()
        self.h11box.addWidget(self.pooledit)
        self.h11box.addWidget(self.pooladdbtn)
        self.h11box.addWidget(self.poolclbtn)
        self.h12box = QHBoxLayout()
        self.h12box.addWidget(self.pooltb)
        self.h13box = QHBoxLayout()
        self.h13box.addStretch(1)
        self.h13box.addWidget(self.shortlabel)
        self.h13box.addWidget(self.shortedit)
        self.h13box.addStretch(1)
        self.h13box.addWidget(self.longlabel)
        self.h13box.addWidget(self.longedit)
        self.h13box.addStretch(1)
        self.h13box.addWidget(self.mlabel)
        self.h13box.addWidget(self.medit)
        self.h13box.addStretch(1)
        self.h14box = QHBoxLayout()
        self.h14box.addStretch(1)
        self.h14box.addWidget(self.texttb)
        self.h14box.addStretch(1)

        self.v1box = QVBoxLayout()
        self.v1box.addStretch(1)
        self.v1box.addWidget(self.poollabel)
        self.v1box.addLayout(self.h11box)
        self.v1box.addLayout(self.h12box)
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h13box)
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h14box)
        self.v1box.addStretch(1)

        self.h21box = QHBoxLayout()
        self.h21box.addWidget(self.selectbtn)
        # self.h21box.addWidget(self.resultbtn)

        self.v2box = QVBoxLayout()
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ckfromtimelabel)
        self.v2box.addWidget(self.ckfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cktotimelabel)
        self.v2box.addWidget(self.cktotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ycfromtimelabel)
        self.v2box.addWidget(self.ycfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.yctotimelabel)
        self.v2box.addWidget(self.yctotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cashlabel)
        self.v2box.addWidget(self.cashedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.amountlabel)
        self.v2box.addWidget(self.amountedit)
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h21box)
        self.v2box.addStretch(1)

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v1box)
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v2box)
        self.hbox.addStretch(1)

        self.setLayout(self.hbox)
        self.pooltb.setPlainText(' '.join(self.codepool))

    def addCode(self):
        f = FETCH()
        code = self.pooledit.toPlainText()
        if code in self.codepool:
            print(
                QMessageBox.information(self, "提示", "该股票已经存在于股票池中!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        elif code not in list(f.fetch_stock_list()['code']):
            print(
                QMessageBox.information(self, "提示", "该股票代码不存在!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.codepool.append(code)
            self.pooledit.clear()
        self.pooltb.setPlainText(' '.join(self.codepool))

    def clearPool(self):
        self.codepool = []
        self.pooltb.setPlainText(' '.join(self.codepool))

    def backTest(self):
        def change_name(s):
            l = s.split('/')
            if len(l[1]) == 1:
                l[1] = "0" + l[1]
            if len(l[2]) == 1:
                l[2] = "0" + l[2]
            return ("-".join(l))

        r = MACDTest(cash=int(self.cashedit.toPlainText()))
        r.MACD_backtest(code=self.codepool,
                        ckstart=change_name(self.ckfromtimeedit.text()),
                        ckend=change_name(self.cktotimeedit.text()),
                        ycstart=change_name(self.ycfromtimeedit.text()),
                        ycend=change_name(self.yctotimeedit.text()),
                        amount=int(self.amountedit.toPlainText()),
                        SHORT=int(self.shortedit.toPlainText()),
                        LONG=int(self.longedit.toPlainText()),
                        M=int(self.medit.toPlainText()))
        r.save_to_mongo()
        # self.resultbtn.clicked.connect(self.btResult(r.ACstr))
        # self.resultbtn.setEnabled(True)
        self.btResult(r.ACstr)

    def btResult(self, AC_id):
        dialog = BackTestResult(ACid=AC_id)
        dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
        dialog.show()
        dialog.exec_()
Example #3
0
class RSINBackTest(QDialog):
    def __init__(self):
        super(RSINBackTest,self).__init__()
        self.codepool = ["000001","000002","000004",]
        self.initUI()

    def initUI(self):
        self.resize(900,600)
        self.setWindowTitle("QUANT XH 金融终端——RSI N日回测")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.poollabel = QLabel()
        self.poollabel.setText("股票池")
        self.poollabel.setFont(QFont("仿宋", 15))
        self.pooledit = QTextEdit()
        self.pooledit.setFont(QFont("仿宋", 12))
        self.pooledit.setFixedSize(120, 30)
        self.pooladdbtn = QPushButton()
        self.pooladdbtn.setText("添加股票")
        self.pooladdbtn.setFont(QFont("仿宋", 12))
        self.pooladdbtn.setFixedSize(100, 30)
        self.pooladdbtn.clicked.connect(self.addCode)
        self.poolclbtn = QPushButton()
        self.poolclbtn.setText("清空")
        self.poolclbtn.setFont(QFont("仿宋", 12))
        self.poolclbtn.setFixedSize(80, 30)
        self.poolclbtn.clicked.connect(self.clearPool)
        self.pooltb = QTextBrowser()
        self.pooltb.setFixedSize(300, 300)
        self.pooltb.setFont(QFont("仿宋", 12))

        self.nlabel = QLabel()
        self.nlabel.setText("N:")
        self.nlabel.setFont(QFont("仿宋", 15))
        self.nedit = QTextEdit()
        self.nedit.setText("6")
        self.nedit.setFont(QFont("仿宋", 12))
        self.nedit.setFixedSize(50, 30)

        self.texttb = QTextBrowser()
        self.texttb.setFont(QFont("仿宋", 10))
        self.texttb.setFixedSize(300, 150)
        self.texttb.setText("RSI指标分为三个数值:20、50、80,其中,当指标运行到20下方时,预示价格进入超卖区域,短期警示风险来临,不可追空,价格可能出现反弹或上涨;当指标运行到80上方时,预示价格进入超买区域,短线百警示风险来临,不可追多,价格可能出现调整或下跌")

        self.ckfromtimelabel = QLabel()
        self.ckfromtimelabel.setText("窗口开始时间")
        self.ckfromtimelabel.setFont(QFont("仿宋", 15))
        self.ckfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date()
        self.ckfromtimeedit.setDate(datefrom)
        self.ckfromtimeedit.setFont(QFont("仿宋", 12))
        self.ckfromtimeedit.setFixedSize(200,30)

        self.cktotimelabel = QLabel()
        self.cktotimelabel.setText("窗口结束时间")
        self.cktotimelabel.setFont(QFont("仿宋", 15))
        self.cktotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date()
        self.cktotimeedit.setDate(dateto)
        self.cktotimeedit.setFont(QFont("仿宋", 12))
        self.cktotimeedit.setFixedSize(200,30)

        self.ycfromtimelabel = QLabel()
        self.ycfromtimelabel.setText("预测开始时间")
        self.ycfromtimelabel.setFont(QFont("仿宋", 15))
        self.ycfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date()
        self.ycfromtimeedit.setDate(datefrom)
        self.ycfromtimeedit.setFont(QFont("仿宋", 12))
        self.ycfromtimeedit.setFixedSize(200, 30)

        self.yctotimelabel = QLabel()
        self.yctotimelabel.setText("预测结束时间")
        self.yctotimelabel.setFont(QFont("仿宋", 15))
        self.yctotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date()
        self.yctotimeedit.setDate(dateto)
        self.yctotimeedit.setFont(QFont("仿宋", 12))
        self.yctotimeedit.setFixedSize(200, 30)

        self.cashlabel = QLabel()
        self.cashlabel.setText("初始资金")
        self.cashlabel.setFont(QFont("仿宋", 15))
        self.cashedit = QTextEdit()
        self.cashedit.setText("1000000")
        self.cashedit.setFont(QFont("仿宋", 12))
        self.cashedit.setFixedSize(200,30)

        self.amountlabel = QLabel()
        self.amountlabel.setText("单笔交易股数")
        self.amountlabel.setFont(QFont("仿宋", 15))
        self.amountedit = QTextEdit()
        self.amountedit.setText("3000")
        self.amountedit.setFont(QFont("仿宋", 12))
        self.amountedit.setFixedSize(200,30)

        self.selectbtn = QPushButton()
        self.selectbtn.setText("开始回测")
        self.selectbtn.setFixedSize(120,40)
        self.selectbtn.setFont(QFont("仿宋", 12))
        self.selectbtn.clicked.connect(self.backTest)

        # self.resultbtn = QPushButton()
        # self.resultbtn.setText("回测结果")
        # self.resultbtn.setFixedSize(120,40)
        # self.resultbtn.setFont(QFont("仿宋", 12))
        # self.resultbtn.setEnabled(False)

        self.h11box = QHBoxLayout()
        self.h11box.addWidget(self.pooledit)
        self.h11box.addWidget(self.pooladdbtn)
        self.h11box.addWidget(self.poolclbtn)
        self.h12box = QHBoxLayout()
        self.h12box.addWidget(self.pooltb)
        self.h14box = QHBoxLayout()
        self.h14box.addStretch(1)
        self.h14box.addWidget(self.texttb)
        self.h14box.addStretch(1)

        self.v1box = QVBoxLayout()
        self.v1box.addStretch(1)
        self.v1box.addWidget(self.poollabel)
        self.v1box.addLayout(self.h11box)
        self.v1box.addLayout(self.h12box)
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h14box)
        self.v1box.addStretch(1)

        self.h21box = QHBoxLayout()
        self.h21box.addWidget(self.selectbtn)
        # self.h21box.addWidget(self.resultbtn)
        self.h22box = QHBoxLayout()
        self.h22box.addStretch(1)
        self.h22box.addWidget(self.nlabel)
        self.h22box.addWidget(self.nedit)
        self.h22box.addStretch(1)

        self.v2box = QVBoxLayout()
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h22box)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ckfromtimelabel)
        self.v2box.addWidget(self.ckfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cktotimelabel)
        self.v2box.addWidget(self.cktotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ycfromtimelabel)
        self.v2box.addWidget(self.ycfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.yctotimelabel)
        self.v2box.addWidget(self.yctotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cashlabel)
        self.v2box.addWidget(self.cashedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.amountlabel)
        self.v2box.addWidget(self.amountedit)
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h21box)
        self.v2box.addStretch(1)

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v1box)
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v2box)
        self.hbox.addStretch(1)

        self.setLayout(self.hbox)
        self.pooltb.setPlainText(' '.join(self.codepool))

    def addCode(self):
        f = FETCH()
        code = self.pooledit.toPlainText()
        if code in self.codepool:
            print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes))
        elif code not in list(f.fetch_stock_list()['code']):
            print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.codepool.append(code)
            self.pooledit.clear()
        self.pooltb.setPlainText(' '.join(self.codepool))

    def clearPool(self):
        self.codepool = []
        self.pooltb.setPlainText(' '.join(self.codepool))

    def backTest(self):

        def change_name(s):
            l = s.split('/')
            if len(l[1]) == 1:
                l[1] = "0" + l[1]
            if len(l[2]) == 1:
                l[2] = "0" + l[2]
            return ("-".join(l))

        r = RSINtest(cash=int(self.cashedit.toPlainText()))
        r.RSIN_backtest(code=self.codepool,ckstart=change_name(self.ckfromtimeedit.text()),
                          ckend=change_name(self.cktotimeedit.text()),ycstart=change_name(self.ycfromtimeedit.text()),
                        ycend=change_name(self.yctotimeedit.text()), amount=int(self.amountedit.toPlainText()),
                        N=int(self.nedit.toPlainText()))
        r.save_to_mongo()
        # self.resultbtn.clicked.connect(self.btResult(r.ACstr))
        # self.resultbtn.setEnabled(True)
        self.btResult(r.ACstr)

    def btResult(self,AC_id):
        dialog = BackTestResult(ACid=AC_id)
        dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
        dialog.show()
        dialog.exec_()
Example #4
0
class RandomBackTest(QDialog):
    def __init__(self):
        super(RandomBackTest,self).__init__()
        self.codepool = ["000001","000002","000004",]
        self.initUI()

    def initUI(self):
        self.resize(900,600)
        self.setWindowTitle("QUANT XH 金融终端——随机买卖回测")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.poollabel = QLabel()
        self.poollabel.setText("股票池")
        self.poollabel.setFont(QFont("仿宋", 15))
        self.pooledit = QTextEdit()
        self.pooledit.setFont(QFont("仿宋", 12))
        self.pooledit.setFixedSize(120, 30)
        self.pooladdbtn = QPushButton()
        self.pooladdbtn.setText("添加股票")
        self.pooladdbtn.setFont(QFont("仿宋", 12))
        self.pooladdbtn.setFixedSize(100, 30)
        self.pooladdbtn.clicked.connect(self.addCode)
        self.poolclbtn = QPushButton()
        self.poolclbtn.setText("清空")
        self.poolclbtn.setFont(QFont("仿宋", 12))
        self.poolclbtn.setFixedSize(80, 30)
        self.poolclbtn.clicked.connect(self.clearPool)
        self.pooltb = QTextBrowser()
        self.pooltb.setFixedSize(300, 300)
        self.pooltb.setFont(QFont("仿宋", 12))

        self.fromtimelabel = QLabel()
        self.fromtimelabel.setText("开始时间")
        self.fromtimelabel.setFont(QFont("仿宋", 15))
        self.fromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date()
        self.fromtimeedit.setDate(datefrom)
        self.fromtimeedit.setFont(QFont("仿宋", 12))
        self.fromtimeedit.setFixedSize(200,30)

        self.totimelabel = QLabel()
        self.totimelabel.setText("结束时间")
        self.totimelabel.setFont(QFont("仿宋", 15))
        self.totimeedit = QDateEdit()
        dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
        self.totimeedit.setDate(dateto)
        self.totimeedit.setFont(QFont("仿宋", 12))
        self.totimeedit.setFixedSize(200,30)

        self.cashlabel = QLabel()
        self.cashlabel.setText("初始资金")
        self.cashlabel.setFont(QFont("仿宋", 15))
        self.cashedit = QTextEdit()
        self.cashedit.setText("1000000")
        self.cashedit.setFont(QFont("仿宋", 12))
        self.cashedit.setFixedSize(200,30)

        self.amountlabel = QLabel()
        self.amountlabel.setText("单笔交易股数")
        self.amountlabel.setFont(QFont("仿宋", 15))
        self.amountedit = QTextEdit()
        self.amountedit.setText("1000")
        self.amountedit.setFont(QFont("仿宋", 12))
        self.amountedit.setFixedSize(200,30)

        self.selectbtn = QPushButton()
        self.selectbtn.setText("开始回测")
        self.selectbtn.setFixedSize(120,40)
        self.selectbtn.setFont(QFont("仿宋", 12))
        self.selectbtn.clicked.connect(self.backTest)

        # self.resultbtn = QPushButton()
        # self.resultbtn.setText("回测结果")
        # self.resultbtn.setFixedSize(120,40)
        # self.resultbtn.setFont(QFont("仿宋", 12))
        # self.resultbtn.setEnabled(False)

        self.h11box = QHBoxLayout()
        self.h11box.addWidget(self.pooledit)
        self.h11box.addWidget(self.pooladdbtn)
        self.h11box.addWidget(self.poolclbtn)
        self.h12box = QHBoxLayout()
        self.h12box.addWidget(self.pooltb)

        self.v1box = QVBoxLayout()
        self.v1box.addStretch(1)
        self.v1box.addWidget(self.poollabel)
        self.v1box.addLayout(self.h11box)
        self.v1box.addLayout(self.h12box)
        self.v1box.addStretch(1)

        self.h21box = QHBoxLayout()
        self.h21box.addWidget(self.selectbtn)
        # self.h21box.addWidget(self.resultbtn)

        self.v2box = QVBoxLayout()
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.fromtimelabel)
        self.v2box.addWidget(self.fromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.totimelabel)
        self.v2box.addWidget(self.totimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cashlabel)
        self.v2box.addWidget(self.cashedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.amountlabel)
        self.v2box.addWidget(self.amountedit)
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h21box)
        self.v2box.addStretch(1)

        self.hbox = QHBoxLayout()
        self.hbox.addLayout(self.v1box)
        self.hbox.addLayout(self.v2box)

        self.setLayout(self.hbox)
        self.pooltb.setPlainText(' '.join(self.codepool))

    def addCode(self):
        f = FETCH()
        code = self.pooledit.toPlainText()
        if code in self.codepool:
            print(QMessageBox.information(self, "提示", "该股票已经存在于股票池中!", QMessageBox.Yes, QMessageBox.Yes))
        elif code not in list(f.fetch_stock_list()['code']):
            print(QMessageBox.information(self, "提示", "该股票代码不存在!", QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.codepool.append(code)
            self.pooledit.clear()
        self.pooltb.setPlainText(' '.join(self.codepool))

    def clearPool(self):
        self.codepool = []
        self.pooltb.setPlainText(' '.join(self.codepool))

    def backTest(self):

        def change_name(s):
            l = s.split('/')
            if len(l[1]) == 1:
                l[1] = "0" + l[1]
            if len(l[2]) == 1:
                l[2] = "0" + l[2]
            return ("-".join(l))

        r = RBTest(cash=int(self.cashedit.toPlainText()))
        r.simple_backtest(self.codepool,change_name(self.fromtimeedit.text()),
                          change_name(self.totimeedit.text()),int(self.amountedit.toPlainText()))
        r.save_to_mongo()
        # self.resultbtn.clicked.connect(self.btResult(r.ACstr))
        # self.resultbtn.setEnabled(True)
        self.btResult(r.ACstr)

    def btResult(self,AC_id):
        dialog = BackTestResult(ACid=AC_id)
        dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
        dialog.show()
        dialog.exec_()
Example #5
0
class HomeScreen(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Home Screen")
        self.resize(550, 461)
        self.setStyleSheet(Hariku_Style.get_window_stylesheet())
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.setupUI()

    def setupUI(self):
        self.setWindowIcon(Hariku_Style.getIcon())

        self.centralwidget = QWidget(self)
        self.setFocus()

        self.gridLayout = QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")

        self.topcenter_layout = QHBoxLayout()

        spacerItem = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Minimum)
        self.topcenter_layout.addItem(spacerItem)

        self.monthFilter = QDateEdit(self.centralwidget)
        self.monthFilter.setCurrentSection(QDateTimeEdit.MonthSection)
        self.monthFilter.setButtonSymbols(QSpinBox.NoButtons)
        self.monthFilter.setDate(datetime.now())
        self.monthFilter.setDisplayFormat("MMMM/yyyy")
        self.monthFilter.setFont(Hariku_Style.get_font(10))
        self.monthFilter.setStyleSheet(Hariku_Style.get_dateedit_stylesheet())
        self.monthFilter.dateChanged.connect(self.filterDiaryByMonth)
        self.topcenter_layout.addWidget(self.monthFilter)

        self.showAllBtn = QPushButton("Remove Filter", self.centralwidget)
        self.showAllBtn.setFont(Hariku_Style.get_font(8))
        self.showAllBtn.clicked.connect(self.getDiaries)
        self.showAllBtn.setStyleSheet(
            Hariku_Style.get_moodBtn_stylesheet("rgb(38, 160, 173)",
                                                "rgb(8, 102, 112)"))
        self.topcenter_layout.addWidget(self.showAllBtn)

        spacerItem1 = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding,
                                  QSizePolicy.Minimum)
        self.topcenter_layout.addItem(spacerItem1)

        self.gridLayout.addLayout(self.topcenter_layout, 1, 0, 1, 1)

        self.bottomLayout = QHBoxLayout()

        spacerItem2 = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                  QSizePolicy.Minimum)
        self.bottomLayout.addItem(spacerItem2)

        self.createBtn = QPushButton("+ Add New Diary", self.centralwidget)
        self.createBtn.setFont(Hariku_Style.get_font(10))
        self.createBtn.clicked.connect(self.addNewDiary)
        self.createBtn.setStyleSheet(
            Hariku_Style.get_moodBtn_stylesheet("rgb(40, 186, 130)",
                                                "rgb(207, 207, 188)"))
        self.bottomLayout.addWidget(self.createBtn)

        self.gridLayout.addLayout(self.bottomLayout, 4, 0, 1, 1)

        self.contentScrollArea = QScrollArea(self.centralwidget)
        self.contentScrollArea.setEnabled(True)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.contentScrollArea.sizePolicy().hasHeightForWidth())
        self.contentScrollArea.setSizePolicy(sizePolicy)
        self.contentScrollArea.setStyleSheet(
            Hariku_Style.get_scrollarea_stylesheet())
        self.contentScrollArea.setWidgetResizable(True)
        self.contentScrollArea.setAlignment(QtCore.Qt.AlignLeading
                                            | QtCore.Qt.AlignLeft
                                            | QtCore.Qt.AlignTop)

        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 487, 321))
        self.scrollAreaLayout = QVBoxLayout(self.scrollAreaWidgetContents)

        self.getDiaries()

        self.contentScrollArea.setWidget(self.scrollAreaWidgetContents)

        self.gridLayout.addWidget(self.contentScrollArea, 2, 0, 1, 1)

        self.judul = QLabel("\nWelcome Home:)\n", self)
        self.judul.setFont(Hariku_Style.get_font(18))
        self.judul.setAlignment(QtCore.Qt.AlignCenter)
        self.gridLayout.addWidget(self.judul, 0, 0, 1, 1)

        self.setCentralWidget(self.centralwidget)

    def addNewDiary(self):
        dialog = DiaryScreen(self)
        dialog.show()
        self.hide()

    def clearScrollAreaLayout(self):
        # delete the diaries currently showind
        for i in reversed(range(self.scrollAreaLayout.count())):
            try:
                self.scrollAreaLayout.itemAt(i).widget().setParent(None)
            except AttributeError:
                self.scrollAreaLayout.removeItem(
                    self.scrollAreaLayout.itemAt(i))

    def filterDiaryByMonth(self):
        self.clearScrollAreaLayout()

        year = self.monthFilter.date().year()
        month = self.monthFilter.date().month()

        diaries = getDiaryByMonth(year, month)

        for i, diary in enumerate(diaries):
            self.diaryItem = QWidget(self.scrollAreaWidgetContents)
            sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
            sizePolicy.setHeightForWidth(
                self.diaryItem.sizePolicy().hasHeightForWidth())
            self.diaryItem.setSizePolicy(sizePolicy)
            self.diaryItem.setMinimumSize(QtCore.QSize(0, 50))
            self.diaryItem.setStyleSheet(
                "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;"
            )
            self.diaryItem.setObjectName("diaryItem")
            self.itemLayout = QGridLayout(self.diaryItem)

            self.contentDateLayout = QVBoxLayout()
            self.contentDateLayout.setObjectName("contentDateLayout")

            self.content = QLabel(self.truncateString(diary.content),
                                  self.diaryItem)
            self.content.setFont(Hariku_Style.get_font(10))
            self.contentDateLayout.addWidget(self.content)

            self.date = QLabel(
                diary.date.strftime("%d %B %Y") +
                diary.time.strftime("  %I:%M %p"), self.diaryItem)
            self.date.setFont(Hariku_Style.get_font(8))
            self.contentDateLayout.addWidget(self.date)

            self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1)

            self.buttons.append(i)
            self.buttons[i] = [
                QPushButton("⋗", self.diaryItem),
                QPushButton("×", self.diaryItem)
            ]

            self.buttons[i][0].clicked.connect(
                lambda checked, i=diary.diary_id: self.viewDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][0].sizePolicy().hasHeightForWidth())
            self.buttons[i][0].setSizePolicy(sizePolicy)
            self.buttons[i][0].setFont(Hariku_Style.get_font(9))
            self.buttons[i][0].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)",
                                                    "rgb(235, 224, 157)"))
            self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1)

            # self.deleteBtn = QPushButton("×", self.diaryItem)
            self.buttons[i][1].clicked.connect(
                lambda checked, i=diary.diary_id: self.deleteDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][1].sizePolicy().hasHeightForWidth())
            self.buttons[i][1].setSizePolicy(sizePolicy)
            self.buttons[i][1].setFont(Hariku_Style.get_font(9))
            self.buttons[i][1].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)",
                                                    "rgb(235, 157, 157)"))
            self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1)

            self.scrollAreaLayout.addWidget(self.diaryItem,
                                            alignment=QtCore.Qt.AlignTop)

        spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                  QSizePolicy.MinimumExpanding)
        self.scrollAreaLayout.addItem(spacerItem2)

    def getDiaries(self):
        diaries = getAllDiaries()

        self.monthFilter.setDate(datetime.now())
        self.clearScrollAreaLayout()

        self.buttons = []

        for i, diary in enumerate(diaries):
            self.diaryItem = QWidget(self.scrollAreaWidgetContents)
            sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
            sizePolicy.setHeightForWidth(
                self.diaryItem.sizePolicy().hasHeightForWidth())
            self.diaryItem.setSizePolicy(sizePolicy)
            self.diaryItem.setMinimumSize(QtCore.QSize(0, 50))
            self.diaryItem.setStyleSheet(
                "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;"
            )
            self.diaryItem.setObjectName("diaryItem")
            self.itemLayout = QGridLayout(self.diaryItem)

            self.contentDateLayout = QVBoxLayout()
            self.contentDateLayout.setObjectName("contentDateLayout")

            self.content = QLabel(self.truncateString(diary.content),
                                  self.diaryItem)
            self.content.setFont(Hariku_Style.get_font(10))
            self.contentDateLayout.addWidget(self.content)

            self.date = QLabel(
                diary.date.strftime("%d %B %Y") +
                diary.time.strftime("  %I:%M %p"), self.diaryItem)
            self.date.setFont(Hariku_Style.get_font(8))
            self.contentDateLayout.addWidget(self.date)

            self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1)

            self.buttons.append(i)
            self.buttons[i] = [
                QPushButton("⋗", self.diaryItem),
                QPushButton("×", self.diaryItem)
            ]

            self.buttons[i][0].clicked.connect(
                lambda checked, i=diary.diary_id: self.viewDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][0].sizePolicy().hasHeightForWidth())
            self.buttons[i][0].setSizePolicy(sizePolicy)
            self.buttons[i][0].setFont(Hariku_Style.get_font(9))
            self.buttons[i][0].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)",
                                                    "rgb(235, 224, 157)"))
            self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1)

            # self.deleteBtn = QPushButton("×", self.diaryItem)
            self.buttons[i][1].clicked.connect(
                lambda checked, i=diary.diary_id: self.deleteDiaryById(i))
            sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(
                self.buttons[i][1].sizePolicy().hasHeightForWidth())
            self.buttons[i][1].setSizePolicy(sizePolicy)
            self.buttons[i][1].setFont(Hariku_Style.get_font(9))
            self.buttons[i][1].setStyleSheet(
                Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)",
                                                    "rgb(235, 157, 157)"))
            self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1)

            self.scrollAreaLayout.addWidget(self.diaryItem,
                                            alignment=QtCore.Qt.AlignTop)

        spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum,
                                  QSizePolicy.MinimumExpanding)
        self.scrollAreaLayout.addItem(spacerItem2)

    def truncateString(self, string):
        try:
            string = string.replace('\n', ' ')
            return string[:45] + '...'
        except IndexError:
            return string

    def viewDiaryById(self, id):
        dialog = DiaryScreen(self, edit=False, id=id)
        dialog.show()
        self.hide()

    def deleteDiaryById(self, id):
        deleteDiaryById(id)
        self.clearScrollAreaLayout()
        self.getDiaries()
Example #6
0
class WindowOption(QWidget):
    def __init__(self):
        super(WindowOption, self).__init__()
        self.initUI()

    def initUI(self):
        """# Global """
        self.setWindowTitle('Option')
        self.setFixedSize(800, 450)

        self.list_option = QListWidget(self)
        self.stack_window = QStackedWidget(self)

        self.style_list_option = "QListWidget{\
                                min-width: 120px;\
                                max-width: 120px;\
                                color: white;\
                                background: grey;}"

        self.style_groupbox = "QGroupBox{\
                               border: None;}"

        self.style_groupbox_font = "QGroupBox{\
                                    font-family: MonoxRegular;\
                                    font-size: 20px;}"

        layout_main = QHBoxLayout(spacing=0)
        layout_main.setContentsMargins(0, 0, 0, 0)

        layout_main.addWidget(self.list_option)
        layout_main.addWidget(self.stack_window)
        self.setLayout(layout_main)

        self.list_option.setStyleSheet(self.style_list_option)
        """# List Option"""
        self.list_option.setFrameShape(QListWidget.NoFrame)
        self.list_option.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.list_option.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.list_option.currentRowChanged.connect(
            self.stack_window.setCurrentIndex)

        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(20)

        item = QListWidgetItem()
        item.setFont(font)
        item.setText('DIY')
        item.setSizeHint(QSize(0, 60))
        item.setTextAlignment(Qt.AlignCenter)
        self.list_option.addItem(item)

        item = QListWidgetItem()
        item.setFont(font)
        item.setText('PRO')
        item.setSizeHint(QSize(0, 60))
        item.setTextAlignment(Qt.AlignCenter)
        self.list_option.addItem(item)

        self.page0_pre()
        self.page0tab0()
        self.page0tab1()
        self.page0global()
        self.page1_pre()
        self.page1tab0()
        self.page1tab1()
        self.page1global()

    def keyReleaseEvent(self, event):
        """DocString for pressKeyEwent"""
        #@todo: to be defined.
        if event.key() == Qt.Key_D:
            self.list_option.setCurrentRow(0)
            self.stack_window.setCurrentIndex(0)

        if event.key() == Qt.Key_P:
            self.list_option.setCurrentRow(1)
            self.stack_window.setCurrentIndex(1)

        if event.key() == Qt.Key_O:
            if self.stack_window.currentIndex() == 1:
                self.tabwidget_page1.setCurrentIndex(1)
            else:
                self.tabwidget_page0.setCurrentIndex(1)

        if event.key() == Qt.Key_I:
            if self.stack_window.currentIndex() == 1:
                self.tabwidget_page1.setCurrentIndex(0)
            else:
                self.tabwidget_page0.setCurrentIndex(0)

        if event.key() == Qt.Key_Return:
            if self.stack_window.currentIndex() == 1:
                self.pushbutton_ok_page1.click()
            else:
                self.pushbutton_ok_page0.click()

        if event.key() == Qt.Key_R:
            if self.stack_window.currentIndex() == 1:
                self.pushbutton_re_page1.click()
            else:
                self.pushbutton_re_page0.click()

        if event.key() == Qt.Key_Q:
            self.close()

    def page0_pre(self):
        """DocString for page0"""
        #@todo: to be defined.
        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(12)

        self.page0 = QWidget()

        self.tabwidget_page0 = QTabWidget(self.page0)

        self.tab0_page0 = QWidget(self.page0)
        self.tab1_page0 = QWidget(self.page0)

        self.tabwidget_page0.addTab(self.tab0_page0, 'Info')
        self.tabwidget_page0.addTab(self.tab1_page0, 'Option')

    def page0tab0(self):
        """DocString for page0tab0"""
        #@todo: to be defined.

        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(12)

        label_date_page0 = QLabel('Date      ')
        label_date_page0.setFont(font)

        label_time_page0 = QLabel('Time      ')
        label_time_page0.setFont(font)

        label_loc_page0 = QLabel('Location  ')
        label_loc_page0.setFont(font)

        label_users_name_page0 = QLabel('Name     ')
        label_users_name_page0.setFont(font)

        font_spe = QFont()
        font_spe.setFamily('MonoxRegular Bold')
        font_spe.setPointSize(12)
        label_users_gender_page0 = QLabel('Gender')
        label_users_gender_page0.setFont(font_spe)

        label_note_page0 = QLabel('Note')
        label_note_page0.setFont(font)

        self.dateedit_date_page0 = QDateEdit(QDate.currentDate())
        self.dateedit_date_page0.setDisplayFormat('yyyy/MM/dd')
        self.dateedit_date_page0.setCalendarPopup(True)
        self.dateedit_date_page0.setFont(font)
        self.timeedit_time_page0 = QTimeEdit(QTime.currentTime())
        self.timeedit_time_page0.setDisplayFormat('HH : mm')
        self.timeedit_time_page0.setFont(font)
        self.lineedit_loc_page0 = QLineEdit('Mars')
        self.lineedit_loc_page0.setFont(font)
        self.lineedit_users_name_page0 = QLineEdit('Object')
        self.lineedit_users_name_page0.setFont(font)

        self.radiobutton_users_gender_male_page0 = QRadioButton('Male')
        self.radiobutton_users_gender_female_page0 = QRadioButton('Female')
        self.radiobutton_users_gender_secret_page0 = QRadioButton('Secret')

        self.textedit_note_page0 = QTextEdit('None')
        self.textedit_note_page0.setFont(font)

        line_split_page0 = QFrame()
        line_split_page0.setFrameShape(QFrame.VLine)
        line_split_page0.setFrameShadow(QFrame.Sunken)

        groupbox_radio_button = QGroupBox()
        groupbox_radio_button.setStyleSheet(self.style_groupbox)

        layout_groupbox_radio_button = QHBoxLayout()
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_male_page0)
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_female_page0)
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_secret_page0)
        groupbox_radio_button.setLayout(layout_groupbox_radio_button)

        layout_tab0_page0_global = QVBoxLayout(self.tab0_page0)

        layout_info_page0 = QHBoxLayout()
        layout_note_page0 = QVBoxLayout()

        layout_time_page0 = QVBoxLayout()
        layout_user_page0 = QVBoxLayout()

        layout_date_page0 = QHBoxLayout()
        layout_date_page0.setAlignment(Qt.AlignLeft)
        layout_clock_page0 = QHBoxLayout()
        layout_clock_page0.setAlignment(Qt.AlignLeft)
        layout_loc_page0 = QHBoxLayout()
        layout_loc_page0.setAlignment(Qt.AlignLeft)
        layout_name_page0 = QHBoxLayout()
        layout_gender_page0 = QVBoxLayout()

        layout_date_page0.addWidget(label_date_page0)
        layout_date_page0.addWidget(self.dateedit_date_page0)
        layout_clock_page0.addWidget(label_time_page0)
        layout_clock_page0.addWidget(self.timeedit_time_page0)
        layout_loc_page0.addWidget(label_loc_page0)
        layout_loc_page0.addWidget(self.lineedit_loc_page0)
        layout_name_page0.addWidget(label_users_name_page0)
        layout_name_page0.addWidget(self.lineedit_users_name_page0)
        layout_gender_page0.addWidget(label_users_gender_page0)
        layout_gender_page0.addWidget(groupbox_radio_button)

        layout_time_page0.addLayout(layout_date_page0)
        layout_time_page0.addLayout(layout_clock_page0)
        layout_time_page0.addLayout(layout_loc_page0)
        layout_user_page0.addLayout(layout_name_page0)
        layout_user_page0.addLayout(layout_gender_page0)

        layout_info_page0.addLayout(layout_time_page0)
        layout_info_page0.addWidget(line_split_page0)
        layout_info_page0.addLayout(layout_user_page0)

        layout_note_page0.addWidget(label_note_page0)
        layout_note_page0.addWidget(self.textedit_note_page0)

        layout_tab0_page0_global.addLayout(layout_info_page0)
        layout_tab0_page0_global.addLayout(layout_note_page0)

        self.tab0_page0.setLayout(layout_tab0_page0_global)

    def page0tab1(self):
        """DocString for page0tab1"""
        #@todo: to be defined.
        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(12)

        layout_tab1_page0_global = QVBoxLayout()
        groupbox_text_style = 'QGroupBox{\
                               max-height: 60px;\
                               }'

        groupbox_info_style = 'QGroupBox{\
                               min-height: 120px;\
                               font-family: MonoxRegular;\
                               font-size: 20px;\
                               }'

        groupbox_radio_button = QGroupBox('Option')
        layout_groupbox_radio_button = QHBoxLayout()
        self.radiobutton_test1 = QRadioButton('TEST1')
        self.radiobutton_test2 = QRadioButton('TEST2')

        layout_groupbox_radio_button.addWidget(self.radiobutton_test1)
        layout_groupbox_radio_button.addWidget(self.radiobutton_test2)
        groupbox_radio_button.setLayout(layout_groupbox_radio_button)
        groupbox_radio_button.setStyleSheet(groupbox_text_style)

        layout_info_text = QVBoxLayout()
        groupbox_text_info = QGroupBox('Info')
        self.text_edit_info = QTextEdit()
        groupbox_text_info.setStyleSheet(groupbox_info_style)
        groupbox_text_info.setFont(font)
        layout_info_text.addWidget(groupbox_text_info)

        layout_group_text_info = QHBoxLayout(groupbox_text_info)
        layout_group_text_info.addWidget(self.text_edit_info)

        groupbox_tcpip_page1 = QGroupBox('TCP/IP')
        groupbox_tcpip_page1.setStyleSheet(self.style_groupbox_font)

        label_tcp_address = QLabel('TCP Address')
        label_tcp_address.setFont(font)

        label_tcp_port = QLabel('TCP Port')
        label_tcp_port.setFont(font)
        self.lineedit_tcp_address_page0 = QLineEdit()
        self.lineedit_tcp_port_page0 = QLineEdit()
        self.lineedit_tcp_address_page0.setFont(font)
        self.lineedit_tcp_port_page0.setFont(font)

        layout_tcpip_page1_global = QVBoxLayout()
        layout_tcpip_data = QHBoxLayout()
        layout_tcpip_button_reset = QHBoxLayout()

        layout_tcpip_data.addWidget(label_tcp_address)
        layout_tcpip_data.addWidget(self.lineedit_tcp_address_page0)
        layout_tcpip_data.addWidget(label_tcp_port)
        layout_tcpip_data.addWidget(self.lineedit_tcp_port_page0)

        layout_tcpip_page1_global.addLayout(layout_tcpip_data)

        layout_tab1_page0_global.addWidget(groupbox_radio_button)
        layout_tab1_page0_global.addLayout(layout_info_text)
        layout_tab1_page0_global.addLayout(layout_tcpip_page1_global)

        self.tab1_page0.setLayout(layout_tab1_page0_global)

    def page0global(self):
        """DocString for page0global"""
        #@todo: to be defined.
        self.pushbutton_ok_page0 = QPushButton('&Ok')
        self.pushbutton_re_page0 = QPushButton('&Reset')
        self.pushbutton_de_page0 = QPushButton('&Cancel')

        layout_page0_option = QHBoxLayout()
        layout_page0_option.addStretch(1)
        layout_page0_option.addWidget(self.pushbutton_ok_page0)
        layout_page0_option.addWidget(self.pushbutton_re_page0)
        layout_page0_option.addWidget(self.pushbutton_de_page0)

        layout_page0_global = QVBoxLayout(self.page0)
        layout_page0_global.addWidget(self.tabwidget_page0)
        layout_page0_global.addLayout(layout_page0_option)

        self.stack_window.addWidget(self.page0)

    def page1_pre(self):
        self.page1 = QWidget()

        self.tabwidget_page1 = QTabWidget(self.page1)

        self.tab0_page1 = QWidget(self.page1)
        self.tab1_page1 = QWidget(self.page1)

        self.tabwidget_page1.addTab(self.tab0_page1, 'Info')
        self.tabwidget_page1.addTab(self.tab1_page1, 'Option')

    def page1tab0(self):
        """DocString for page1tab0"""
        #@todo: to be defined.

        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(12)

        label_date_page1 = QLabel('Date      ')
        label_date_page1.setFont(font)

        label_time_page1 = QLabel('Time      ')
        label_time_page1.setFont(font)

        label_loc_page1 = QLabel('Location  ')
        label_loc_page1.setFont(font)

        label_users_name_page1 = QLabel('Name     ')
        label_users_name_page1.setFont(font)

        label_users_gender_page1 = QLabel('Gender')
        label_users_gender_page1.setFont(font)

        label_note_page1 = QLabel('Note')
        label_note_page1.setFont(font)

        line_split_page1 = QFrame()
        line_split_page1.setFrameShape(QFrame.VLine)
        line_split_page1.setFrameShadow(QFrame.Sunken)

        self.dateedit_date_page1 = QDateEdit(QDate.currentDate())
        self.dateedit_date_page1.setDisplayFormat('yyyy/MM/dd')
        self.dateedit_date_page1.setCalendarPopup(True)
        self.dateedit_date_page1.setFont(font)
        self.timeedit_time_page1 = QTimeEdit(QTime.currentTime())
        self.timeedit_time_page1.setDisplayFormat('HH : mm')
        self.timeedit_time_page1.setFont(font)
        self.lineedit_loc_page1 = QLineEdit('Mars')
        self.lineedit_loc_page1.setFont(font)
        self.lineedit_users_name_page1 = QLineEdit('Object')
        self.lineedit_users_name_page1.setFont(font)

        self.radiobutton_users_gender_male_page1 = QRadioButton('Male')
        self.radiobutton_users_gender_female_page1 = QRadioButton('Female')
        self.radiobutton_users_gender_secret_page1 = QRadioButton('Secret')

        self.textedit_note_page1 = QTextEdit('None')
        self.textedit_note_page1.setFont(font)

        groupbox_radio_button = QGroupBox()
        groupbox_radio_button.setStyleSheet(self.style_groupbox)

        layout_groupbox_radio_button = QHBoxLayout()
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_male_page1)
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_female_page1)
        layout_groupbox_radio_button.addWidget(
            self.radiobutton_users_gender_secret_page1)
        groupbox_radio_button.setLayout(layout_groupbox_radio_button)

        layout_tab0_page1_global = QVBoxLayout(self.tab0_page1)

        layout_info_page1 = QHBoxLayout()
        layout_note_page1 = QVBoxLayout()

        layout_time_page1 = QVBoxLayout()
        layout_user_page1 = QVBoxLayout()

        layout_date_page1 = QHBoxLayout()
        layout_date_page1.setAlignment(Qt.AlignLeft)
        layout_clock_page1 = QHBoxLayout()
        layout_clock_page1.setAlignment(Qt.AlignLeft)
        layout_loc_page1 = QHBoxLayout()
        layout_loc_page1.setAlignment(Qt.AlignLeft)
        layout_name_page1 = QHBoxLayout()
        layout_gender_page1 = QVBoxLayout()

        layout_date_page1.addWidget(label_date_page1)
        layout_date_page1.addWidget(self.dateedit_date_page1)
        layout_clock_page1.addWidget(label_time_page1)
        layout_clock_page1.addWidget(self.timeedit_time_page1)
        layout_loc_page1.addWidget(label_loc_page1)
        layout_loc_page1.addWidget(self.lineedit_loc_page1)
        layout_name_page1.addWidget(label_users_name_page1)
        layout_name_page1.addWidget(self.lineedit_users_name_page1)
        layout_gender_page1.addWidget(label_users_gender_page1)
        layout_gender_page1.addWidget(groupbox_radio_button)

        layout_time_page1.addLayout(layout_date_page1)
        layout_time_page1.addLayout(layout_clock_page1)
        layout_time_page1.addLayout(layout_loc_page1)
        layout_user_page1.addLayout(layout_name_page1)
        layout_user_page1.addLayout(layout_gender_page1)

        layout_info_page1.addLayout(layout_time_page1)
        layout_info_page1.addWidget(line_split_page1)
        layout_info_page1.addLayout(layout_user_page1)

        layout_note_page1.addWidget(label_note_page1)
        layout_note_page1.addWidget(self.textedit_note_page1)

        layout_tab0_page1_global.addLayout(layout_info_page1)
        layout_tab0_page1_global.addLayout(layout_note_page1)

        self.tab0_page1.setLayout(layout_tab0_page1_global)

    def page1tab1(self):
        """DocString for page1tab1"""
        #@todo: to be defined.

        font = QFont()
        font.setFamily('MonoxLight')
        font.setPointSize(12)

        label_filter_or_not = QLabel('Filter')
        label_filter_or_not.setFont(font)

        label_filter_hz1 = QLabel('Hz')
        label_filter_hz1.setFont(font)
        label_filter_hz2 = QLabel('Hz')
        label_filter_hz2.setFont(font)
        label_filter_hz3 = QLabel('Hz')
        label_filter_hz3.setFont(font)
        label_filter_hz4 = QLabel('Hz')
        label_filter_hz4.setFont(font)

        label_sampling_freq = QLabel('Sampling Frequency')
        label_sampling_freq.setFont(font)

        label_notch_filter = QLabel('Notch Filter')
        label_notch_filter.setFont(font)

        label_bandpass_filter = QLabel('Bandpass Filter')
        label_bandpass_filter.setFont(font)

        label_bandpass_filter_to = QLabel('to')
        label_bandpass_filter_to.setFont(font)

        label_set_num = QLabel('Set Number')
        label_set_num.setFont(font)

        label_set_time = QLabel('Set Time')
        label_set_time.setFont(font)

        label_set_interval = QLabel('Auto Restart')
        label_set_interval.setFont(font)

        label_set_interval_s = QLabel('s')
        label_set_interval_s.setFont(font)

        label_tcp_address = QLabel('TCP Address')
        label_tcp_address.setFont(font)

        label_tcp_port = QLabel('TCP Port')
        label_tcp_port.setFont(font)

        label_filetype_save = QLabel('Filetype')
        label_filetype_save.setFont(font)

        label_channel_num = QLabel('Channel Number')
        label_channel_num.setFont(font)

        self.spinbox_set_num = QSpinBox()
        self.spinbox_set_time = QSpinBox()

        self.combobox_bandpass_high = QComboBox()
        self.combobox_bandpass_high.addItem('1')
        self.combobox_bandpass_high.addItem('5')
        self.combobox_bandpass_high.addItem('10')
        self.combobox_bandpass_high.addItem('20')

        self.combobox_bandpass_low = QComboBox()
        self.combobox_bandpass_low.addItem('50')
        self.combobox_bandpass_low.addItem('100')
        self.combobox_bandpass_low.addItem('200')
        self.combobox_bandpass_low.addItem('450')

        self.combobox_sampling_freq = QComboBox()
        self.combobox_sampling_freq.addItem('250')
        self.combobox_sampling_freq.addItem('500')
        self.combobox_sampling_freq.addItem('1000')
        self.combobox_sampling_freq.addItem('2000')

        self.combobox_notch_filter = QComboBox()
        self.combobox_notch_filter.addItem('50')
        self.combobox_notch_filter.addItem('60')

        self.combobox_filetype_save = QComboBox()
        self.combobox_filetype_save.addItem('csv')
        self.combobox_filetype_save.addItem('npy')

        self.combobox_channel_num = QComboBox()
        self.combobox_channel_num.addItem('64')
        self.combobox_channel_num.addItem('128')
        self.combobox_channel_num.addItem('192')

        self.lineedit_tcp_address_page1 = QLineEdit()
        self.lineedit_tcp_address_page1.setFont(font)

        self.lineedit_tcp_port_page1 = QLineEdit()
        self.lineedit_tcp_port_page1.setFont(font)

        self.checkbox_notch_filter = QCheckBox('Notch Filter')
        self.checkbox_bandpass_filter = QCheckBox('Bandpass Filter')

        self.radiobutton_restart_auto = QRadioButton('Auto Restart')
        self.radiobutton_restart_press = QRadioButton('Manual Restart')

        self.spinbox_restart_auto = QSpinBox()

        groupbox_filter_page1 = QGroupBox('Filter')
        groupbox_filter_page1.setStyleSheet(self.style_groupbox_font)
        groupbox_data_page1 = QGroupBox('Data')
        groupbox_data_page1.setStyleSheet(self.style_groupbox_font)
        groupbox_tcpip_page1 = QGroupBox('TCP/IP')
        groupbox_tcpip_page1.setStyleSheet(self.style_groupbox_font)

        layout_filter_or_not = QHBoxLayout()
        layout_filter_notch = QHBoxLayout()
        layout_filter_bandpass = QHBoxLayout()
        layout_sampling_freq = QHBoxLayout()
        layout_button_filter_reset = QHBoxLayout()

        layout_filter_or_not.addWidget(label_filter_or_not)
        layout_filter_or_not.addWidget(self.checkbox_notch_filter)
        layout_filter_or_not.addWidget(self.checkbox_bandpass_filter)

        layout_filter_notch.addWidget(label_notch_filter)
        layout_filter_notch.addWidget(self.combobox_notch_filter)
        layout_filter_notch.addWidget(label_filter_hz1)

        layout_filter_bandpass.addWidget(label_bandpass_filter)
        layout_filter_bandpass.addWidget(self.combobox_bandpass_high)
        layout_filter_bandpass.addWidget(label_filter_hz2)
        layout_filter_bandpass.addWidget(label_bandpass_filter_to)
        layout_filter_bandpass.addWidget(self.combobox_bandpass_low)
        layout_filter_bandpass.addWidget(label_filter_hz3)

        layout_sampling_freq.addWidget(label_sampling_freq)
        layout_sampling_freq.addWidget(self.combobox_sampling_freq)
        layout_sampling_freq.addWidget(label_filter_hz4)

        layout_data_channel_num = QHBoxLayout()
        layout_data_set = QHBoxLayout()
        layout_data_interval = QVBoxLayout()
        layout_data_filetype = QHBoxLayout()
        layout_button_data_reset = QHBoxLayout()

        layout_data_channel_num.addWidget(label_channel_num)
        layout_data_channel_num.addWidget(self.combobox_channel_num)
        layout_data_interval_auto = QHBoxLayout()
        layout_data_interval_press = QHBoxLayout()
        layout_data_interval_auto.addWidget(self.radiobutton_restart_auto)
        layout_data_interval_auto.addWidget(self.spinbox_restart_auto)
        layout_data_interval_auto.addWidget(label_set_interval_s)
        layout_data_interval_press.addWidget(self.radiobutton_restart_press)

        layout_data_interval.addLayout(layout_data_interval_auto)
        layout_data_interval.addLayout(layout_data_interval_press)

        layout_data_set.addWidget(label_set_num)
        layout_data_set.addWidget(self.spinbox_set_num)
        layout_data_set.addWidget(label_set_time)
        layout_data_set.addWidget(self.spinbox_set_time)

        layout_data_filetype.addWidget(label_filetype_save)
        layout_data_filetype.addWidget(self.combobox_filetype_save)

        layout_filter_page1 = QVBoxLayout()
        layout_filter_page1.addLayout(layout_filter_or_not)
        layout_filter_page1.addLayout(layout_filter_notch)
        layout_filter_page1.addLayout(layout_filter_bandpass)
        layout_filter_page1.addLayout(layout_sampling_freq)

        layout_data_page1 = QVBoxLayout()
        layout_data_page1.addLayout(layout_data_channel_num)
        layout_data_page1.addLayout(layout_data_set)
        layout_data_page1.addLayout(layout_data_interval)
        layout_data_page1.addLayout(layout_data_filetype)

        layout_tcpip_page1_global = QVBoxLayout()
        layout_tcpip_data = QHBoxLayout()
        layout_tcpip_button_reset = QHBoxLayout()

        layout_tcpip_data.addWidget(label_tcp_address)
        layout_tcpip_data.addWidget(self.lineedit_tcp_address_page1)
        layout_tcpip_data.addWidget(label_tcp_port)
        layout_tcpip_data.addWidget(self.lineedit_tcp_port_page1)

        layout_tcpip_page1_global.addLayout(layout_tcpip_data)

        groupbox_filter_page1.setLayout(layout_filter_page1)
        groupbox_data_page1.setLayout(layout_data_page1)
        groupbox_tcpip_page1.setLayout(layout_tcpip_page1_global)

        layout_tab1_page1_up = QHBoxLayout()
        layout_tab1_page1_down = QHBoxLayout()

        layout_tab1_page1_up.addWidget(groupbox_filter_page1)
        layout_tab1_page1_up.addWidget(groupbox_data_page1)
        layout_tab1_page1_down.addWidget(groupbox_tcpip_page1)

        layout_tab1_page1_global = QVBoxLayout()
        layout_tab1_page1_global.addLayout(layout_tab1_page1_up)
        layout_tab1_page1_global.addLayout(layout_tab1_page1_down)

        self.tab1_page1.setLayout(layout_tab1_page1_global)

    def page1global(self):
        """DocString for page1global"""
        #@todo: to be defined.

        self.pushbutton_ok_page1 = QPushButton('&Ok')
        self.pushbutton_de_page1 = QPushButton('&Cancel')
        self.pushbutton_re_page1 = QPushButton('&Reset')

        layout_page1_option = QHBoxLayout()
        layout_page1_option.addStretch(1)
        layout_page1_option.addWidget(self.pushbutton_ok_page1)
        layout_page1_option.addWidget(self.pushbutton_re_page1)
        layout_page1_option.addWidget(self.pushbutton_de_page1)

        layout_page1_global = QVBoxLayout()
        layout_page1_global.addWidget(self.tabwidget_page1)
        layout_page1_global.addLayout(layout_page1_option)

        self.page1.setLayout(layout_page1_global)

        self.stack_window.addWidget(self.page1)
Example #7
0
class KlineSelect(QDialog):
    def __init__(self, code="000001", fromtime="2020-01-01", totime="2020-03-01"):
        super(KlineSelect,self).__init__()
        self.code = code
        self.fromtime = fromtime
        self.totime = totime
        self.initUI()

    def initUI(self):
        self.resize(800,600)
        self.setWindowTitle("QUANT XH 金融终端")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.h1box = QHBoxLayout()
        self.codelabel = QLabel()
        self.codelabel.setText("股票代码")
        self.codelabel.setFont(QFont("仿宋", 12))
        self.codeedit = QTextEdit()
        self.codeedit.setFont(QFont("仿宋", 12))
        self.codeedit.setFixedSize(120,25)
        self.codeedit.setText(self.code)

        self.fromtimelabel = QLabel()
        self.fromtimelabel.setText("起始时间")
        self.fromtimelabel.setFont(QFont("仿宋", 12))
        self.fromtimeedit = QDateEdit()
        self.fromtimeedit.setFixedSize(150, 25)
        self.fromtimeedit.setFont(QFont("仿宋", 12))
        datefrom = datetime.strptime(self.fromtime,"%Y-%m-%d").date()
        self.fromtimeedit.setDate(datefrom)

        self.totimelabel = QLabel()
        self.totimelabel.setText("终止时间")
        self.totimelabel.setFont(QFont("仿宋", 12))
        self.totimeedit = QDateEdit()
        self.totimeedit.setFixedSize(150, 25)
        self.totimeedit.setFont(QFont("仿宋", 12))
        dateto = datetime.strptime(self.totime, "%Y-%m-%d").date()
        self.totimeedit.setDate(dateto)

        self.selectbutton = QPushButton()
        self.selectbutton.setText("选择")
        self.selectbutton.setFont(QFont("仿宋", 12))
        self.selectbutton.clicked.connect(self.updateKlines)

        self.h1box.addStretch(1)
        self.h1box.addWidget(self.codelabel)
        self.h1box.addWidget(self.codeedit)
        self.h1box.addStretch(1)
        self.h1box.addWidget(self.fromtimelabel)
        self.h1box.addWidget(self.fromtimeedit)
        self.h1box.addStretch(1)
        self.h1box.addWidget(self.totimelabel)
        self.h1box.addWidget(self.totimeedit)
        self.h1box.addStretch(1)
        self.h1box.addWidget(self.selectbutton)
        self.h1box.addStretch(1)

        self.klineswindow = KlinesDialog(type="A",code=self.code,fromtime=self.fromtime,totime=self.totime)

        self.v1box = QVBoxLayout()
        self.v1box.addWidget(self.klineswindow)

        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.h1box)
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.v1box)
        self.vbox.addStretch(1)

        self.setLayout(self.vbox)

    def updateKlines(self):
        self.code = self.codeedit.toPlainText()

        def change_name(s):
            l = s.split('/')
            if len(l[1]) == 1:
                l[1] = "0" + l[1]
            if len(l[2]) == 1:
                l[2] = "0" + l[2]
            return ("-".join(l))

        self.fromtime = change_name(self.fromtimeedit.text())
        self.totime = change_name(self.totimeedit.text())

        f = FETCH()
        stock_list = list(f.fetch_stock_list()['code'])
        if self.code not in stock_list:
            print(QMessageBox.information(self, "提示", "您输入了不正确的或是已下架的代码!", QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.klineswindow.close()
            self.klineswindow = KlinesDialog(type="A",code=self.code,fromtime=self.fromtime,totime=self.totime)
            self.v1box.addWidget(self.klineswindow)
Example #8
0
class CCINBackTest(QDialog):
    def __init__(self):
        super(CCINBackTest, self).__init__()
        self.codepool = [
            "000001",
            "000002",
            "000004",
        ]
        self.initUI()

    def initUI(self):
        self.resize(900, 600)
        self.setWindowTitle("QUANT XH 金融终端——CCI N日回测")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.poollabel = QLabel()
        self.poollabel.setText("股票池")
        self.poollabel.setFont(QFont("仿宋", 15))
        self.pooledit = QTextEdit()
        self.pooledit.setFont(QFont("仿宋", 12))
        self.pooledit.setFixedSize(120, 30)
        self.pooladdbtn = QPushButton()
        self.pooladdbtn.setText("添加股票")
        self.pooladdbtn.setFont(QFont("仿宋", 12))
        self.pooladdbtn.setFixedSize(100, 30)
        self.pooladdbtn.clicked.connect(self.addCode)
        self.poolclbtn = QPushButton()
        self.poolclbtn.setText("清空")
        self.poolclbtn.setFont(QFont("仿宋", 12))
        self.poolclbtn.setFixedSize(80, 30)
        self.poolclbtn.clicked.connect(self.clearPool)
        self.pooltb = QTextBrowser()
        self.pooltb.setFixedSize(300, 300)
        self.pooltb.setFont(QFont("仿宋", 12))

        self.nlabel = QLabel()
        self.nlabel.setText("N:")
        self.nlabel.setFont(QFont("仿宋", 15))
        self.nedit = QTextEdit()
        self.nedit.setText("14")
        self.nedit.setFont(QFont("仿宋", 12))
        self.nedit.setFixedSize(50, 30)

        self.texttb = QTextBrowser()
        self.texttb.setFont(QFont("仿宋", 10))
        self.texttb.setFixedSize(300, 150)
        self.texttb.setText(
            "1.当CCI指标曲线从上向下突破+100线而重新进入常态区间时,表明市场价格的上涨阶段可能结束,将进入一个比较长时间的震荡整理阶段,应及时平多做空。\n\n"
            "2.当CCI指标曲线从上向下突破-100线而进入另一个非常态区间(超卖区)时,表明市场价格的弱势状态已经形成,将进入一个比较长的寻底过程,可以持有空单等待更高利润。"
        )

        self.ckfromtimelabel = QLabel()
        self.ckfromtimelabel.setText("窗口开始时间")
        self.ckfromtimelabel.setFont(QFont("仿宋", 15))
        self.ckfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2018-09-01", "%Y-%m-%d").date()
        self.ckfromtimeedit.setDate(datefrom)
        self.ckfromtimeedit.setFont(QFont("仿宋", 12))
        self.ckfromtimeedit.setFixedSize(200, 30)

        self.cktotimelabel = QLabel()
        self.cktotimelabel.setText("窗口结束时间")
        self.cktotimelabel.setFont(QFont("仿宋", 15))
        self.cktotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-20", "%Y-%m-%d").date()
        self.cktotimeedit.setDate(dateto)
        self.cktotimeedit.setFont(QFont("仿宋", 12))
        self.cktotimeedit.setFixedSize(200, 30)

        self.ycfromtimelabel = QLabel()
        self.ycfromtimelabel.setText("预测开始时间")
        self.ycfromtimelabel.setFont(QFont("仿宋", 15))
        self.ycfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date()
        self.ycfromtimeedit.setDate(datefrom)
        self.ycfromtimeedit.setFont(QFont("仿宋", 12))
        self.ycfromtimeedit.setFixedSize(200, 30)

        self.yctotimelabel = QLabel()
        self.yctotimelabel.setText("预测结束时间")
        self.yctotimelabel.setFont(QFont("仿宋", 15))
        self.yctotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-05-01", "%Y-%m-%d").date()
        self.yctotimeedit.setDate(dateto)
        self.yctotimeedit.setFont(QFont("仿宋", 12))
        self.yctotimeedit.setFixedSize(200, 30)

        self.cashlabel = QLabel()
        self.cashlabel.setText("初始资金")
        self.cashlabel.setFont(QFont("仿宋", 15))
        self.cashedit = QTextEdit()
        self.cashedit.setText("1000000")
        self.cashedit.setFont(QFont("仿宋", 12))
        self.cashedit.setFixedSize(200, 30)

        self.amountlabel = QLabel()
        self.amountlabel.setText("单笔交易股数")
        self.amountlabel.setFont(QFont("仿宋", 15))
        self.amountedit = QTextEdit()
        self.amountedit.setText("3000")
        self.amountedit.setFont(QFont("仿宋", 12))
        self.amountedit.setFixedSize(200, 30)

        self.selectbtn = QPushButton()
        self.selectbtn.setText("开始回测")
        self.selectbtn.setFixedSize(120, 40)
        self.selectbtn.setFont(QFont("仿宋", 12))
        self.selectbtn.clicked.connect(self.backTest)

        # self.resultbtn = QPushButton()
        # self.resultbtn.setText("回测结果")
        # self.resultbtn.setFixedSize(120,40)
        # self.resultbtn.setFont(QFont("仿宋", 12))
        # self.resultbtn.setEnabled(False)

        self.h11box = QHBoxLayout()
        self.h11box.addWidget(self.pooledit)
        self.h11box.addWidget(self.pooladdbtn)
        self.h11box.addWidget(self.poolclbtn)
        self.h12box = QHBoxLayout()
        self.h12box.addWidget(self.pooltb)
        self.h14box = QHBoxLayout()
        self.h14box.addStretch(1)
        self.h14box.addWidget(self.texttb)
        self.h14box.addStretch(1)

        self.v1box = QVBoxLayout()
        self.v1box.addStretch(1)
        self.v1box.addWidget(self.poollabel)
        self.v1box.addLayout(self.h11box)
        self.v1box.addLayout(self.h12box)
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h14box)
        self.v1box.addStretch(1)

        self.h21box = QHBoxLayout()
        self.h21box.addWidget(self.selectbtn)
        # self.h21box.addWidget(self.resultbtn)
        self.h22box = QHBoxLayout()
        self.h22box.addStretch(1)
        self.h22box.addWidget(self.nlabel)
        self.h22box.addWidget(self.nedit)
        self.h22box.addStretch(1)

        self.v2box = QVBoxLayout()
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h22box)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ckfromtimelabel)
        self.v2box.addWidget(self.ckfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cktotimelabel)
        self.v2box.addWidget(self.cktotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ycfromtimelabel)
        self.v2box.addWidget(self.ycfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.yctotimelabel)
        self.v2box.addWidget(self.yctotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cashlabel)
        self.v2box.addWidget(self.cashedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.amountlabel)
        self.v2box.addWidget(self.amountedit)
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h21box)
        self.v2box.addStretch(1)

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v1box)
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v2box)
        self.hbox.addStretch(1)

        self.setLayout(self.hbox)
        self.pooltb.setPlainText(' '.join(self.codepool))

    def addCode(self):
        f = FETCH()
        code = self.pooledit.toPlainText()
        if code in self.codepool:
            print(
                QMessageBox.information(self, "提示", "该股票已经存在于股票池中!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        elif code not in list(f.fetch_stock_list()['code']):
            print(
                QMessageBox.information(self, "提示", "该股票代码不存在!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.codepool.append(code)
            self.pooledit.clear()
        self.pooltb.setPlainText(' '.join(self.codepool))

    def clearPool(self):
        self.codepool = []
        self.pooltb.setPlainText(' '.join(self.codepool))

    def backTest(self):
        def change_name(s):
            l = s.split('/')
            if len(l[1]) == 1:
                l[1] = "0" + l[1]
            if len(l[2]) == 1:
                l[2] = "0" + l[2]
            return ("-".join(l))

        r = CCINtest(cash=int(self.cashedit.toPlainText()))
        r.CCIN_backtest(code=self.codepool,
                        ckstart=change_name(self.ckfromtimeedit.text()),
                        ckend=change_name(self.cktotimeedit.text()),
                        ycstart=change_name(self.ycfromtimeedit.text()),
                        ycend=change_name(self.yctotimeedit.text()),
                        amount=int(self.amountedit.toPlainText()),
                        N=int(self.nedit.toPlainText()))
        r.save_to_mongo()
        # self.resultbtn.clicked.connect(self.btResult(r.ACstr))
        # self.resultbtn.setEnabled(True)
        self.btResult(r.ACstr)

    def btResult(self, AC_id):
        dialog = BackTestResult(ACid=AC_id)
        dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
        dialog.show()
        dialog.exec_()
Example #9
0
class LSTMBacktest(QDialog):
    def __init__(self):
        super(LSTMBacktest, self).__init__()
        self.codepool = [
            "000001",
            "000004",
        ]
        self.initUI()

    def initUI(self):
        self.resize(900, 600)
        self.setWindowTitle("QUANT XH 金融终端——LSTM预测股价回测")
        self.setWindowIcon(QIcon("static/icon.png"))

        self.tcodelabel = QLabel()
        self.tcodelabel.setText("训练股票")
        self.tcodelabel.setFont(QFont("仿宋", 15))
        self.tcodeedit = QTextEdit()
        self.tcodeedit.setFont(QFont("仿宋", 12))
        self.tcodeedit.setFixedSize(150, 30)
        self.tcodeedit.setText("000002")

        self.tfromtimelabel = QLabel()
        self.tfromtimelabel.setText("开始时间")
        self.tfromtimelabel.setFont(QFont("仿宋", 15))
        self.tfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2001-01-01", "%Y-%m-%d").date()
        self.tfromtimeedit.setDate(datefrom)
        self.tfromtimeedit.setFont(QFont("仿宋", 12))
        self.tfromtimeedit.setFixedSize(200, 30)
        self.ttotimelabel = QLabel()
        self.ttotimelabel.setText("结束时间")
        self.ttotimelabel.setFont(QFont("仿宋", 15))
        self.ttotimeedit = QDateEdit()
        dateto = datetime.strptime("2020-04-30", "%Y-%m-%d").date()
        self.ttotimeedit.setDate(dateto)
        self.ttotimeedit.setFont(QFont("仿宋", 12))
        self.ttotimeedit.setFixedSize(200, 30)

        self.trainbtn = QPushButton()
        self.trainbtn.setText("开始训练")
        self.trainbtn.setFixedSize(120, 40)
        self.trainbtn.setFont(QFont("仿宋", 12))
        self.trainbtn.clicked.connect(self.con_model)

        self.acclabel = QLabel()
        self.acclabel.setFont(QFont("仿宋", 12))
        self.acclabel.setText("准确率:")
        self.accnlabel = QLabel()
        self.accnlabel.setFont(QFont("仿宋", 12))
        self.accnlabel.setText("")
        self.accnlabel.setFixedWidth(100)

        self.poollabel = QLabel()
        self.poollabel.setText("股票池")
        self.poollabel.setFont(QFont("仿宋", 15))
        self.pooledit = QTextEdit()
        self.pooledit.setFont(QFont("仿宋", 12))
        self.pooledit.setFixedSize(120, 30)
        self.pooladdbtn = QPushButton()
        self.pooladdbtn.setText("添加股票")
        self.pooladdbtn.setFont(QFont("仿宋", 12))
        self.pooladdbtn.setFixedSize(100, 30)
        self.pooladdbtn.clicked.connect(self.addCode)
        self.poolclbtn = QPushButton()
        self.poolclbtn.setText("清空")
        self.poolclbtn.setFont(QFont("仿宋", 12))
        self.poolclbtn.setFixedSize(80, 30)
        self.poolclbtn.clicked.connect(self.clearPool)
        self.pooltb = QTextBrowser()
        self.pooltb.setFixedSize(300, 200)
        self.pooltb.setFont(QFont("仿宋", 12))

        self.buylabel = QLabel()
        self.buylabel.setText("买入涨幅")
        self.buylabel.setFont(QFont("仿宋", 15))
        self.buyedit = QTextEdit()
        self.buyedit.setFont(QFont("仿宋", 12))
        self.buyedit.setFixedSize(120, 30)
        self.buyedit.setText("0.02")

        self.selllabel = QLabel()
        self.selllabel.setText("卖出跌幅")
        self.selllabel.setFont(QFont("仿宋", 15))
        self.selledit = QTextEdit()
        self.selledit.setFont(QFont("仿宋", 12))
        self.selledit.setFixedSize(120, 30)
        self.selledit.setText("0.02")

        self.ckfromtimelabel = QLabel()
        self.ckfromtimelabel.setText("窗口开始时间")
        self.ckfromtimelabel.setFont(QFont("仿宋", 15))
        self.ckfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2018-07-01", "%Y-%m-%d").date()
        self.ckfromtimeedit.setDate(datefrom)
        self.ckfromtimeedit.setFont(QFont("仿宋", 12))
        self.ckfromtimeedit.setFixedSize(200, 30)
        self.cktotimelabel = QLabel()
        self.cktotimelabel.setText("窗口结束时间")
        self.cktotimelabel.setFont(QFont("仿宋", 15))
        self.cktotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
        self.cktotimeedit.setDate(dateto)
        self.cktotimeedit.setFont(QFont("仿宋", 12))
        self.cktotimeedit.setFixedSize(200, 30)

        self.ycfromtimelabel = QLabel()
        self.ycfromtimelabel.setText("预测开始时间")
        self.ycfromtimelabel.setFont(QFont("仿宋", 15))
        self.ycfromtimeedit = QDateEdit()
        datefrom = datetime.strptime("2019-01-01", "%Y-%m-%d").date()
        self.ycfromtimeedit.setDate(datefrom)
        self.ycfromtimeedit.setFont(QFont("仿宋", 12))
        self.ycfromtimeedit.setFixedSize(200, 30)
        self.yctotimelabel = QLabel()
        self.yctotimelabel.setText("预测结束时间")
        self.yctotimelabel.setFont(QFont("仿宋", 15))
        self.yctotimeedit = QDateEdit()
        dateto = datetime.strptime("2019-12-31", "%Y-%m-%d").date()
        self.yctotimeedit.setDate(dateto)
        self.yctotimeedit.setFont(QFont("仿宋", 12))
        self.yctotimeedit.setFixedSize(200, 30)

        self.cashlabel = QLabel()
        self.cashlabel.setText("初始资金")
        self.cashlabel.setFont(QFont("仿宋", 15))
        self.cashedit = QTextEdit()
        self.cashedit.setText("1000000")
        self.cashedit.setFont(QFont("仿宋", 12))
        self.cashedit.setFixedSize(200, 30)

        self.amountlabel = QLabel()
        self.amountlabel.setText("单笔交易股数")
        self.amountlabel.setFont(QFont("仿宋", 15))
        self.amountedit = QTextEdit()
        self.amountedit.setText("1000")
        self.amountedit.setFont(QFont("仿宋", 12))
        self.amountedit.setFixedSize(200, 30)

        self.selectbtn = QPushButton()
        self.selectbtn.setText("开始回测")
        self.selectbtn.setFixedSize(120, 40)
        self.selectbtn.setFont(QFont("仿宋", 12))
        self.selectbtn.clicked.connect(self.backTest)
        self.selectbtn.setEnabled(False)

        self.h10box = QHBoxLayout()
        self.h10box.addWidget(self.tcodelabel)
        self.h10box.addWidget(self.tcodeedit)
        self.h105box = QHBoxLayout()
        self.h105box.addWidget(self.tfromtimelabel)
        self.h105box.addWidget(self.tfromtimeedit)
        self.h106box = QHBoxLayout()
        self.h106box.addWidget(self.ttotimelabel)
        self.h106box.addWidget(self.ttotimeedit)
        self.h107box = QHBoxLayout()
        self.h107box.addWidget(self.trainbtn)
        self.h107box.addWidget(self.acclabel)
        self.h107box.addWidget(self.accnlabel)
        self.h11box = QHBoxLayout()
        self.h11box.addWidget(self.pooledit)
        self.h11box.addWidget(self.pooladdbtn)
        self.h11box.addWidget(self.poolclbtn)
        self.h12box = QHBoxLayout()
        self.h12box.addWidget(self.pooltb)
        self.h13box = QHBoxLayout()
        self.h13box.addWidget(self.buylabel)
        self.h13box.addWidget(self.buyedit)
        self.h14box = QHBoxLayout()
        self.h14box.addWidget(self.selllabel)
        self.h14box.addWidget(self.selledit)

        self.v1box = QVBoxLayout()
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h10box)
        self.v1box.addLayout(self.h105box)
        self.v1box.addLayout(self.h106box)
        self.v1box.addLayout(self.h107box)
        self.v1box.addStretch(1)
        self.v1box.addWidget(self.poollabel)
        self.v1box.addLayout(self.h11box)
        self.v1box.addLayout(self.h12box)
        self.v1box.addStretch(1)
        self.v1box.addLayout(self.h13box)
        self.v1box.addLayout(self.h14box)
        self.v1box.addStretch(1)

        self.h21box = QHBoxLayout()
        self.h21box.addWidget(self.selectbtn)
        # self.h21box.addWidget(self.resultbtn)

        self.v2box = QVBoxLayout()
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ckfromtimelabel)
        self.v2box.addWidget(self.ckfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cktotimelabel)
        self.v2box.addWidget(self.cktotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.ycfromtimelabel)
        self.v2box.addWidget(self.ycfromtimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.yctotimelabel)
        self.v2box.addWidget(self.yctotimeedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.cashlabel)
        self.v2box.addWidget(self.cashedit)
        self.v2box.addStretch(1)
        self.v2box.addWidget(self.amountlabel)
        self.v2box.addWidget(self.amountedit)
        self.v2box.addStretch(1)
        self.v2box.addLayout(self.h21box)
        self.v2box.addStretch(1)

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v1box)
        self.hbox.addStretch(1)
        self.hbox.addLayout(self.v2box)
        self.hbox.addStretch(1)

        self.setLayout(self.hbox)
        self.pooltb.setPlainText(' '.join(self.codepool))

    def addCode(self):
        f = FETCH()
        code = self.pooledit.toPlainText()
        if code in self.codepool:
            print(
                QMessageBox.information(self, "提示", "该股票已经存在于股票池中!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        elif code not in list(f.fetch_stock_list()['code']):
            print(
                QMessageBox.information(self, "提示", "该股票代码不存在!",
                                        QMessageBox.Yes, QMessageBox.Yes))
        else:
            self.codepool.append(code)
            self.pooledit.clear()
        self.pooltb.setPlainText(' '.join(self.codepool))

    def clearPool(self):
        self.codepool = []
        self.pooltb.setPlainText(' '.join(self.codepool))

    def con_model(self):
        self.tcode = self.tcodeedit.toPlainText()
        try:
            lstm = LSTMpredict()
            lstm.get_data(self.tcodeedit.toPlainText(),
                          self.change_name(self.tfromtimeedit.text()),
                          self.change_name(self.ttotimeedit.text()))
            lstm.nomalize()
            lstm.cons_sets(cut=99)
            lstm.make_model()
            lstm.train_performance()
            lstm.test_performance()
            lstm.output_result()
            self.model = lstm.model
            self.accnlabel.setText(str(lstm.result * 100)[:4] + "%")
            self.selectbtn.setEnabled(True)
        except RuntimeError:
            self.accnlabel.setText("训练出错。")

    def backTest(self):
        r = LSTMtest(cash=int(self.cashedit.toPlainText()))
        print(self.codepool)

        r.LSTM_backtest(tcode=self.tcode,
                        codep=self.codepool,
                        ckstart=self.change_name(self.ckfromtimeedit.text()),
                        ckend=self.change_name(self.cktotimeedit.text()),
                        ycstart=self.change_name(self.ycfromtimeedit.text()),
                        ycend=self.change_name(self.yctotimeedit.text()),
                        amount=int(self.amountedit.toPlainText()),
                        model=self.model,
                        buy=float(self.buyedit.toPlainText()),
                        sell=float(self.selledit.toPlainText()))
        r.save_to_mongo()
        self.btResult(r.ACstr)

    def change_name(self, s):
        l = s.split('/')
        if len(l[1]) == 1:
            l[1] = "0" + l[1]
        if len(l[2]) == 1:
            l[2] = "0" + l[2]
        return ("-".join(l))

    def btResult(self, AC_id):
        dialog = BackTestResult(ACid=AC_id)
        dialog.setWindowFlags(Qt.WindowStaysOnTopHint)
        dialog.show()
        dialog.exec_()