900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > python股票量化交易(11)---使用pyqt5构建股票交易软件主页

python股票量化交易(11)---使用pyqt5构建股票交易软件主页

时间:2021-07-18 07:03:11

相关推荐

python股票量化交易(11)---使用pyqt5构建股票交易软件主页

目录

前言构建界面的整体框架主页顶部

前言

在前面10篇博文中,我们详细介绍了各种股票图形的绘制以及股票的预测算法,但是有一点非常的不方便,就是每次查看某个股票的数据,我们还需要将代码替换或者更改,这样势必造成额外的时间浪费,那么怎么办呢?

答案很简单,我们直接自己开发一个股票行情软件,自己获取数据自己查看。这样,每次只要更改股票的代码就能统一的刷新数据并展示出来,这样就非常便捷方便了。而构建界面博主推荐使用pyqt5,毕竟底层用的就是Qt技术,目前桌面的开发中,性能上还是Qt最好。

构建界面的整体框架

首先,我们需要构建股票交易软件的整体框架,代码如下所示:

import sysimport qdarkstylefrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *class MyFrom(QMainWindow):def __init__(self, parent=None):super(MyFrom, self).__init__(parent=parent)self.setWindowTitle('星辰股票行情软件')self.resize(1100, 100)if __name__ == '__main__':app = QApplication(sys.argv)app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())myUI = MyFrom()myUI.setWindowFlag(Qt.WindowMinimizeButtonHint) # 禁止放大界面myUI.setFixedSize(myUI.width(), myUI.height()) # 静止拖拽放大界面myUI.show()sys.exit(app.exec_())

这里,我们设置了股票软件的名称、主题以及软件界面的大小。、但是我们都知道,按照前面的各种股票走势图,单个界面肯定是容不下这么多图形的,那么怎么办?

其实,pyqt5给我们提供了标签页,通过上面标签的切换,就能完整的切换界面而不必跳转界面,下面我们来实现整体的标签。

class MyFrom(QMainWindow):def __init__(self, parent=None)://...代码在上面self.init()def init(self):self.qTableWidget = QTabWidget()self.homeTab = QWidget()self.kTab2 = QWidget()self.otherTab = QWidget()self.qTableWidget.addTab(self.homeTab, "主页")self.qTableWidget.addTab(self.kTab2, "K线图")self.qTableWidget.addTab(self.otherTab, "龙虎榜")self.setCentralWidget(self.qTableWidget)

这里,我们创建了QTabWidget标签页,同时设置了子标签页的名称,并将标签页设置到主界面之上。运行之后,显示的效果如下图所示:

主页顶部

整体框架雏形用上面的代码就基本就完成了。下面,我们就需要依次来填充这些子标签的页面。

首先,我们需要实现我们的主页。对于一般的股票软件来说,都有各种大盘的指数,比如上证,沪深,创业板块的指数显示,也有单个股票的走势图,还有该股票的交易详情数据等等等等。所以,这里我们先来布局模型,这里使用QGridView将界面划分成网格进行布局。

class MyFrom(QMainWindow):def init(self)://...上面的代码self.init_hometab()def init_hometab(self):self.grid = QGridLayout()self.grid.setSpacing(5)ft = QFont()ft.setPointSize(26)ft.setBold(True)self.share_params = [QLabel() for x in range(10)]self.grid.addWidget(self.share_params[0], 0, 0, 2, 3)self.share_params[0].setFont(ft)self.share_params[0].setStyleSheet("color:yellow")self.grid.addWidget(self.share_params[1], 0, 3, 1, 2)self.share_params[1].setFont(ft)self.grid.addWidget(self.share_params[2], 0, 5)self.grid.addWidget(self.share_params[3], 0, 6)self.grid.addWidget(self.share_params[4], 0, 7)self.grid.addWidget(self.share_params[5], 1, 3)self.grid.addWidget(self.share_params[6], 1, 4)self.grid.addWidget(self.share_params[7], 1, 5)self.grid.addWidget(self.share_params[8], 1, 6)self.grid.addWidget(self.share_params[9], 1, 7)self.shareThread = ShareThread()self.shareThread.setValue("sh600690")self.shareThread._signal.connect(self.shareThread_callbacklog)self.shareThread.start()self.qListOne = ['上证指数', '深证成指', '创业板指', '科创50', '上证50', '中证500', '沪深300'] # 添加的数组数据self.plateThread = plateThread()self.plateThread._signal.connect(self.plateThread_callbacklog)self.plateThread.start()self.homeTab.setLayout(self.grid)def shareThread_callbacklog(self, shareList):isloss = float(shareList[5])i = 0for share_label, qlist in zip(self.share_params, shareList):if i == 1:share_label.setText(str(qlist))if isloss >= 0:share_label.setStyleSheet("color:red")else:zhshare_label.setStyleSheet("color:rgb(0, 255, 0)")else:share_label.setText(str(qlist))i += 1def plateThread_callbacklog(self, urlList):i = 0one_QLabel = [QLabel() for x in range(7)]two_QLabel = [QLabel() for x in range(7)]for o_label, t_label, qlist, m_name in zip(one_QLabel, two_QLabel, urlList, self.qListOne):temp = qlist.split('"')[1].split(',')isloss = float(str(round(float(temp[2]), 2)))if isloss >= 0:o_label.setStyleSheet("color:red;font-size:14px")t_label.setStyleSheet("color:red;font-size:14px")else:o_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")t_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")o_label.setText(m_name)self.grid.addWidget(o_label, 0, 8 + i, 1, 1)t_label.setText(str(round(float(temp[1]), 2)))self.grid.addWidget(t_label, 1, 8 + i, 1, 1)i += 1

至于界面的元素,博主就不多说了。这里有2个线程,一个用户获取股票的基本数据,一个用户获取板块的指数,获取股票数据的线程类如下:

import timefrom PyQt5 import QtCorefrom PyQt5.QtCore import pyqtSignalimport requestsfrom utils import LYJutils#股票详细数据获取线程class ShareThread(QtCore.QThread):_signal = pyqtSignal(list)def __init__(self):super(ShareThread, self).__init__()def setValue(self, shareNumber):self.share_num = shareNumberdef run(self):list = []while True:list.clear()baseUrl = '/list=' + self.share_numtemp = requests.get(baseUrl).text.split('"')[1].split(',')list.append(temp[0])# 股票的名称list.append(round(float(temp[3]), 2))# 当前股票价格list.append("高 " + str(round(float(temp[4]), 2)))# 当前股票最高价格list.append("开 " + str(round(float(temp[1]), 2)))# 股票开盘价格list.append("量比 " + LYJutils.str_of_num(float(temp[8])))# 当前股票量比list.append(str(round(float(temp[3]) - float(temp[2]), 2))) # 当前股票涨跌幅m_flo = (float(temp[3]) - float(temp[2])) / float(temp[2]) * 100.0list.append(str(round(m_flo, 2)) + "%") # 当前股票涨跌幅百分比list.append("低 " + str(round(float(temp[5]), 2)))# 当前股票最低价格list.append(temp[30])#交易日期list.append("金额 " + LYJutils.str_of_num(float(temp[9]))) # 股票成交金额self._signal.emit(list)time.sleep(10)

这里返回了股票详情数据list列表,然后通过shareThread_callbacklog回调函数赋值给QLabel文本。同时,这里是一个永久循环的线程,目的就是实时交易数据每10秒获取一次。

接着,是我们的板块线程类:

import timefrom PyQt5 import QtCorefrom PyQt5.QtCore import pyqtSignalimport requests#板块指数详细数据线程class plateThread(QtCore.QThread):_signal = pyqtSignal(list)def __init__(self):super(plateThread, self).__init__()def run(self):list = []qListName = ['s_sh000001', 's_sz399001', 's_sz399006', 's_sh000688', 's_sh000016', 's_sh000905','s_sh000300', ] # 添加的数组数据while True:list.clear()baseUrl = '/list='for index in qListName:url = baseUrl + indextemp = requests.get(url).textlist.append(temp)self._signal.emit(list)time.sleep(10)

板块线程类很简单,也是无线循环获取板块指数,毕竟主页我们要放置的实时股票交易数据,如果你想更快的更新,可以自己更改秒数。

特别注意,板块获取指数的接口为:“/list={板块代码}”。股票获取接口为:“/list={股票代码}”,与前面博文一样,需要在股票代码前面加上sz或者sh等。不过,板块代码是独立的,可以自己看看上面的板块代码规律。

运行之后,效果如下图所示:

忘记说了,所有的网络股票数据实时获取都需要创建线程,有过开发经验的程序员都应该知道,主线程中(也就是界面),不能执行耗时的任务,不然会卡顿崩掉。

软件资源代码下载地址:点击下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。