Comercio cuantitativo de acciones de Python (11) --- Utilice pyqt5 para crear una página de inicio de software de comercio de acciones

Prefacio

En las 10 publicaciones anteriores del blog, presentamos en detalle el dibujo de varios gráficos de stock y algoritmos de predicción de stock, pero hay un punto que es muy inconveniente, es decir, cada vez que vemos los datos de un determinado stock, también necesitamos Reemplazar o cambiar el código. Esto inevitablemente causará una pérdida de tiempo adicional, entonces, ¿qué debemos hacer?

La respuesta es simple, nosotros mismos desarrollamos directamente un software de bolsa, obtenemos los datos y los comprobamos nosotros mismos. De esta manera, siempre que el código de existencias se cambie cada vez, los datos se pueden actualizar y mostrar de manera uniforme, lo cual es muy conveniente y conveniente. Y los bloggers de interfaz de construcción recomiendan usar pyqt5. Después de todo, la tecnología Qt se usa en la capa inferior. En la actualidad, el rendimiento del desarrollo de escritorio sigue siendo el mejor en Qt.

Construya el marco general de la interfaz

Primero, necesitamos construir el marco general del software de negociación de acciones, el código es el siguiente:

import sys
import qdarkstyle
from 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_())

Aquí, establecemos el nombre y el tema del software de stock y el tamaño de la interfaz del software. Pero todos sabemos que, de acuerdo con el gráfico de cotizaciones anterior, una sola interfaz ciertamente no puede acomodar tantos gráficos, entonces, ¿qué debo hacer?

De hecho, pyqt5 nos proporciona una página de pestañas. Al cambiar las pestañas anteriores, podemos cambiar la interfaz completamente sin saltar a la interfaz. Implementemos la pestaña general.

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)

Aquí, hemos creado la pestaña QTabWidget, configuramos el nombre de la subpestaña y configuramos la pestaña en la interfaz principal. Después de ejecutar, el efecto mostrado es como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

Parte superior de la página de inicio

El prototipo del marco general se completa básicamente con el código anterior. A continuación, debemos completar las páginas de estas subpestañas por turno.

Primero, necesitamos implementar nuestra página de inicio. Para el software bursátil general, existen varios índices de gran capitalización, como la visualización del índice de la Bolsa de Valores de Shanghai, las Bolsas de Valores de Shanghai y Shenzhen, y el Mercado de Empresas de Crecimiento, así como el gráfico de tendencias de una sola acción, así como como los detalles comerciales de la acción, etc. Entonces, aquí primero llegamos al modelo de diseño, aquí usamos QGridView para dividir la interfaz en cuadrículas para el diseño.

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 = 0
        for 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:zh
                    share_label.setStyleSheet("color:rgb(0, 255, 0)")
            else:
                share_label.setText(str(qlist))
            i += 1

    def plateThread_callbacklog(self, urlList):
        i = 0
        one_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

En cuanto a los elementos de la interfaz, el blogger no dirá mucho. Aquí hay 2 hilos, un usuario obtiene los datos básicos del stock, el otro usuario obtiene el índice del sector, la clase de hilo para obtener los datos del stock es la siguiente:

import time

from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import requests

from utils import LYJutils

#股票详细数据获取线程
class ShareThread(QtCore.QThread):
    _signal = pyqtSignal(list)

    def __init__(self):
        super(ShareThread, self).__init__()

    def setValue(self, shareNumber):
        self.share_num = shareNumber

    def run(self):
        list = []
        while True:
            list.clear()
            baseUrl = 'http://hq.sinajs.cn/list=' + self.share_num
            temp = 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.0
            list.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)

Esto devuelve la lista de lista de datos detallados de existencias y luego asigna el valor al texto QLabel a través de la función de devolución de llamada shareThread_callbacklog. Al mismo tiempo, aquí hay un hilo de bucle perpetuo, el propósito es obtener datos de transacciones en tiempo real cada 10 segundos.

A continuación, está nuestra clase de hilo de placa:

import time

from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import 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 = 'http://hq.sinajs.cn/list='
            for index in qListName:
                url = baseUrl + index
                temp = requests.get(url).text
                list.append(temp)
            self._signal.emit(list)
            time.sleep(10)

La clase de hilo de sección es muy simple, y también es un bucle inalámbrico para obtener el índice de sección. Después de todo, los datos de transacciones de acciones en tiempo real que queremos colocar en la página de inicio, si desea actualizar más rápido, puede cambiar el número de segundos por ti mismo.

Preste especial atención a la interfaz para obtener el índice del sector: "http://hq.sinajs.cn/list={block code}". La interfaz de adquisición de acciones es: "http://hq.sinajs.cn/list={stock code}". Como en la publicación anterior del blog, debe agregar sz o sh antes del código de acciones. Sin embargo, el código de la sección es independiente, puede verificar las reglas del código de la sección anterior usted mismo.

Después de ejecutar, el efecto es como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí

Se olvidó de mencionar que toda adquisición en tiempo real de datos de stock de la red requiere la creación de subprocesos. Los programadores con experiencia en desarrollo deben saber que las tareas que consumen mucho tiempo no se pueden realizar en el subproceso principal (es decir, la interfaz), de lo contrario se congelará.

Supongo que te gusta

Origin blog.csdn.net/liyuanjinglyj/article/details/113569709
Recomendado
Clasificación