wumu
7 天以前 5a5fa5ab4c4f1af0d1aea6f4f09e7a1bb165bad4
250806
5个文件已修改
3个文件已添加
307 ■■■■■ 已修改文件
clientmainwindow.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
clientmainwindow.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
getstocklist.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
historydata.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
separateanalysis.cpp 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
separateanalysis.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
separateanalysis.ui 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
stock_plan.pro 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
clientmainwindow.cpp
@@ -48,6 +48,9 @@
    m_agileStrategy = new AgileStrategy(this);
    ui->tabWidget->addTab(m_agileStrategy,"灵动策略");
    m_separateAnalysis = new SeparateAnalysis(this);
    ui->tabWidget->addTab(m_separateAnalysis,"个股分析");
    // 关联一下2个界面的信号和槽,用来传递图表所需的数据及展示
    connect(m_getStockList,SIGNAL(sendChartData(QLineSeries*)),m_stockPolicy,SLOT(showNewStockData(QLineSeries*)));
@@ -63,4 +66,5 @@
    connect(m_history,SIGNAL(sendHistoryModel(QVector<QVector<QString>> &)),m_getStockList,SLOT(showHistoryModelData(QVector<QVector<QString>> &)));
    connect(m_history,SIGNAL(sendHistoryModel(QStandardItemModel*)),m_getStockList,SLOT(showHistoryModelData(QStandardItemModel*)));
    //connect(m_getStockList,SIGNAL(sendCodeNames(QMap<QString,QString>&)),m_separateAnalysis,SLOT(setNamesToCombo(QMap<QString,QString>&)));
}
clientmainwindow.h
@@ -10,6 +10,7 @@
#include "historydata.h"
#include "deepseekmainwindow.h"
#include "agilestrategy.h" // 灵动策略
#include "separateanalysis.h"
namespace Ui {
@@ -36,6 +37,7 @@
    HistoryData *m_history; // 历史相关
    DeepSeekMainWindow *m_deepSeek; // 个股深搜
    AgileStrategy *m_agileStrategy; // 灵动策略
    SeparateAnalysis *m_separateAnalysis; // 个股分析 单独分析
};
getstocklist.cpp
@@ -45,9 +45,9 @@
    // 模型及表格视图
    m_model = new QStandardItemModel(this);
    m_model->setColumnCount(10); // 设置10列
    m_model->setColumnCount(11); // 设置11列
    QStringList labels;
    labels<<"股票名字"<<"股票代号"<<"总市值(亿)"<<"流通市值(亿)"<<"涨跌幅(%)"<<"收盘价"<<"成交额(亿)"<<"成交量(手)"<<"换手率(%)"<<"市盈率";
    labels<<"股票名字"<<"股票代号"<<"总市值(亿)"<<"流通市值(亿)"<<"涨跌幅(%)"<<"收盘价"<<"成交额(亿)"<<"成交量(手)"<<"换手率(%)"<<"市盈率"<<"交易额排名";
    m_model->setHorizontalHeaderLabels(labels); // 设置模型的列标签名
    m_customModel = new CustomSortProxyModel;
    m_customModel->setSourceModel(m_model); // 设置源模型
historydata.cpp
@@ -38,7 +38,7 @@
    ui->tableView->setSortingEnabled(true);
    QStringList labels;
    labels<<"股票名字"<<"股票代号"<<"市值(亿)"<<"涨跌幅"<<"收盘价"<<"成交额(亿)"<<"成交量"<<"换手率"<<"PE_TTM";
    labels<<"股票名字"<<"股票代号"<<"市值(亿)"<<"涨跌幅"<<"收盘价"<<"成交额(亿)"<<"成交量"<<"换手率"<<"PE_TTM"<<"交易额排名";
    m_model->setHorizontalHeaderLabels(labels);
    initMySQL(); // 初始化MySQL
@@ -320,7 +320,7 @@
    QString searchTime = ui->dateEdit->text();
    qDebug()<<"查询的时间:"<<searchTime;
    QString sql = QString("select name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm from stock_day_info where time_trade = '%1'").arg(searchTime);
    QString sql = QString("select name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm,amount_rank from stock_day_info where time_trade = '%1'").arg(searchTime);
    qDebug()<<"sql:"<<sql;
    m_modelDatas.clear(); // 清空数组中的数据
@@ -341,8 +341,9 @@
            QString volume = que.value(6).toString();
            QString turnover_rate = que.value(7).toString();
            QString pe_ttm = que.value(8).toString();
            QString amount_rank = que.value(9).toString();
            m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm});
            m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm,amount_rank});
            QList<QStandardItem*> items;
            items.append(new QStandardItem(name));
@@ -366,6 +367,7 @@
            items.append(new QStandardItem(volume));
            items.append(new QStandardItem(turnover_rate));
            items.append(new QStandardItem(pe_ttm));
            items.append(new QStandardItem(amount_rank));
            m_model->appendRow(items);
            rows++;
        }
@@ -537,8 +539,8 @@
    QString time_trade = "2025-06-01";
    if(log_days.size() > 1){
        //time_trade = log_days.at(log_days.size() - 2); // 末尾倒数第二个更新
        time_trade = log_days.first(); // 从第一个开始更新
        time_trade = log_days.at(log_days.size() - 2); // 末尾倒数第二个更新
        //time_trade = log_days.first(); // 从第一个开始更新
    }
    qDebug()<<"time_trade:"<<time_trade;
separateanalysis.cpp
New file
@@ -0,0 +1,144 @@
#include "separateanalysis.h"
#include "ui_separateanalysis.h"
#include <QDateTime>
#include <QMessageBox>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
SeparateAnalysis::SeparateAnalysis(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::SeparateAnalysis)
{
    ui->setupUi(this);
    m_model = new QStandardItemModel(this);
    m_model->setColumnCount(11); // 设置10列
    QStringList labels;
    labels<<"股票名字"<<"股票代号"<<"总市值(亿)"<<"涨跌幅(%)"<<"收盘价"<<"成交额(亿)"<<"成交量(手)"<<"换手率(%)"<<"市盈率"<<"交易额排名"<<"交易时间"<<"排名趋势变化";
    m_model->setHorizontalHeaderLabels(labels); // 设置模型的列标签名
    ui->tableView->setModel(m_model);
    initMySQL(); // 初始化数据库
}
SeparateAnalysis::~SeparateAnalysis()
{
    delete ui;
}
void SeparateAnalysis::calcRankChange()
{
}
void SeparateAnalysis::initMySQL()
{
    //添加一个数据库
      db=QSqlDatabase::addDatabase("QMYSQL");    //括号内要写出数据库的类型
      //设置数据库
      db.setHostName("127.0.0.1"); //设置数据库的主机ip
      //设置数据库的用户名
      db.setUserName("root");
      //设置数据库的密码
      db.setPassword("root");    //这个就是安装MySQL时设置的密码
      //设置数据库的名字
      db.setDatabaseName("stock_plan");
      //打开数据库(已经安装过mysql驱动了)
      if(db.open()==false){
          QMessageBox::warning(this,"waring",db.lastError().text());
      }else{
          qDebug()<<"SeparateAnalysis mysql conn ok";
      }
}
void SeparateAnalysis::on_pushButton_search_clicked()
{
    ui->label_status->setText("正在查询,请稍等...");
    qint64 tt = QDateTime::currentMSecsSinceEpoch();
    QString name = ui->comboBox_name->currentText();
    QString sql = QString("select name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm,amount_rank,time_trade from stock_day_info where name = '%1'").arg(name);
    QSqlQuery que(db);
    int rows = 0;
    if(que.exec(sql)){
        qDebug()<<"select ok";
        m_model->setRowCount(0); // 重置模型行数
        //int rows = 0;
        int rank_val = 0;
        while (que.next()) {
            QString name = que.value(0).toString();
            QString code = que.value(1).toString();
            QString market_capital = QString::number(que.value(2).toDouble()/100000000);
            QString percent = que.value(3).toString();
            QString close = que.value(4).toString();
            QString amount = QString::number(que.value(5).toDouble()/100000000);
            QString volume = que.value(6).toString();
            QString turnover_rate = que.value(7).toString();
            QString pe_ttm = que.value(8).toString();
            QString amount_rank = que.value(9).toString();
            QString time_trade = que.value(10).toString();
            //m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm,amount_rank});
            QList<QStandardItem*> items;
            items.append(new QStandardItem(name));
            items.append(new QStandardItem(code));
            items.append(new QStandardItem(market_capital));
            //items.append(new QStandardItem(percent));
            QStandardItem *percentItem =  new QStandardItem(percent);
            if(percent.toDouble() > 0){
                percentItem->setData(QColor("red"),Qt::DecorationRole); // 添加一个装饰的颜色为红色
                percentItem->setData(QColor("red"),Qt::TextColorRole);  // 将字体颜色设置为红色
                items.at(0)->setData(QColor("red"),Qt::TextColorRole);  // 将股票名字设置为红色
             }
            else if(percent.toDouble() < 0){
                percentItem->setData(QColor("green"),Qt::BackgroundColorRole);
                items.at(0)->setData(QColor("green"),Qt::TextColorRole);
            }
            items.append(percentItem);
            items.append(new QStandardItem(close));
            items.append(new QStandardItem(amount));
            items.append(new QStandardItem(volume));
            items.append(new QStandardItem(turnover_rate));
            items.append(new QStandardItem(pe_ttm));
            items.append(new QStandardItem(amount_rank));
            items.append(new QStandardItem(time_trade));
            if(rank_val != 0){
                double rank_rate = 1 - (amount_rank.toDouble()/rank_val);
                //items.append(new QStandardItem(QString::number(rank_rate)));
                rank_val = amount_rank.toInt();
                QStandardItem * amount_rank_item = new QStandardItem(QString::number(rank_rate));
                if(rank_rate > 0.9){
                    amount_rank_item->setData(QColor("red"),Qt::BackgroundColorRole);
                }
                items.append(amount_rank_item);
            }
            if(rank_val == 0 && amount_rank.toInt() != 0){
                rank_val = amount_rank.toInt();
            }
            m_model->appendRow(items);
            rows++;
        }
        qDebug()<<"查询到行数:"<<rows;
    }else{
        qDebug()<<"select fail"<<que.lastError().text();
    }
    qint64 need = QDateTime::currentMSecsSinceEpoch()-tt;
    ui->label_status->setText(QString("耗时:%1 毫秒,查询完成.条数: %2").arg(QString::number(need)).arg(QString::number(rows)));
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
void SeparateAnalysis::setNamesToCombo(QMap<QString, QString> &names)
{
    // 会卡顿,需要研究一下
    ui->comboBox_name->clear();
    for(auto key:names.values()){
        ui->comboBox_name->addItem(key);
    }
}
separateanalysis.h
New file
@@ -0,0 +1,34 @@
#ifndef SEPARATEANALYSIS_H
#define SEPARATEANALYSIS_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QStandardItemModel>
namespace Ui {
class SeparateAnalysis;
}
class SeparateAnalysis : public QMainWindow
{
    Q_OBJECT
public:
    explicit SeparateAnalysis(QWidget *parent = 0);
    ~SeparateAnalysis();
    void calcRankChange(); // 统计排名变化情况,主要统计当天比前一天的变化情况,和1的差值,达到0.90+ 说明可以买入观察了
private slots:
    void on_pushButton_search_clicked();
    void setNamesToCombo(QMap<QString,QString> &names);
private:
    Ui::SeparateAnalysis *ui;
    void initMySQL();
    QSqlDatabase db;
    QStandardItemModel *m_model;
};
#endif // SEPARATEANALYSIS_H
separateanalysis.ui
New file
@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>SeparateAnalysis</class>
 <widget class="QMainWindow" name="SeparateAnalysis">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
       <string>查询条件</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QLabel" name="label">
           <property name="text">
            <string>个股列表:</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QComboBox" name="comboBox_name">
           <property name="editable">
            <bool>true</bool>
           </property>
           <item>
            <property name="text">
             <string>长江电力</string>
            </property>
           </item>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
         <item>
          <widget class="QPushButton" name="pushButton_search">
           <property name="text">
            <string>查询</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QLabel" name="label_status">
           <property name="text">
            <string>查询情况</string>
           </property>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer_2">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QTableView" name="tableView"/>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>
stock_plan.pro
@@ -36,7 +36,8 @@
    historydata.cpp \
    deepseekmainwindow.cpp \
    bargraphics.cpp \
    agilestrategy.cpp
    agilestrategy.cpp \
    separateanalysis.cpp
HEADERS += \
        clientmainwindow.h \
@@ -50,7 +51,8 @@
    historydata.h \
    deepseekmainwindow.h \
    bargraphics.h \
    agilestrategy.h
    agilestrategy.h \
    separateanalysis.h
FORMS += \
        clientmainwindow.ui \
@@ -61,4 +63,5 @@
    regularinvestment.ui \
    historydata.ui \
    deepseekmainwindow.ui \
    agilestrategy.ui
    agilestrategy.ui \
    separateanalysis.ui