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())
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_()
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_()
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_()
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()
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)
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)
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_()
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_()