clientmainwindow.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
clientmainwindow.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
getstocklist.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
historydata.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
separateanalysis.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
separateanalysis.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
separateanalysis.ui | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
stock_plan.pro | ●●●●● 补丁 | 查看 | 原始文档 | 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