From fcc4de01b336e73df6788fa6129ec15162ac6701 Mon Sep 17 00:00:00 2001
From: wumu <mayi@mayi.com>
Date: 星期四, 06 十一月 2025 23:40:51 +0800
Subject: [PATCH] 251106
---
etfstockinfo.cpp | 190 +++++++++++++++++++++++++++
analysisbyrediscache.ui | 40 ++--
etfstockinfo.h | 11 +
etfstockinfo.ui | 140 +++++++++++++++++++
agilestrategy.cpp | 1
stock_plan_251106_etf.sql | 36 +++++
6 files changed, 395 insertions(+), 23 deletions(-)
diff --git a/agilestrategy.cpp b/agilestrategy.cpp
index 6b72896..489af39 100644
--- a/agilestrategy.cpp
+++ b/agilestrategy.cpp
@@ -7,6 +7,7 @@
{
ui->setupUi(this);
+
m_widget = new QWidget(this);
m_gridLayout = new QGridLayout(m_widget);
diff --git a/analysisbyrediscache.ui b/analysisbyrediscache.ui
index 567c697..4c44ffa 100644
--- a/analysisbyrediscache.ui
+++ b/analysisbyrediscache.ui
@@ -82,26 +82,6 @@
</widget>
</item>
<item>
- <widget class="QDateEdit" name="dateEdit_end">
- <property name="dateTime">
- <datetime>
- <hour>0</hour>
- <minute>0</minute>
- <second>0</second>
- <year>2025</year>
- <month>1</month>
- <day>1</day>
- </datetime>
- </property>
- <property name="displayFormat">
- <string>yyyy-MM-dd</string>
- </property>
- <property name="calendarPopup">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
<widget class="QLabel" name="label_load">
<property name="text">
<string>缂撳瓨鏈姞杞�</string>
@@ -129,6 +109,26 @@
</widget>
</item>
<item>
+ <widget class="QDateEdit" name="dateEdit_end">
+ <property name="dateTime">
+ <datetime>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ <year>2025</year>
+ <month>1</month>
+ <day>1</day>
+ </datetime>
+ </property>
+ <property name="displayFormat">
+ <string>yyyy-MM-dd</string>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QPushButton" name="pushButton_analysisByRedis">
<property name="text">
<string>缂撳瓨鍒嗘瀽</string>
diff --git a/etfstockinfo.cpp b/etfstockinfo.cpp
index 417cef9..07e0d98 100644
--- a/etfstockinfo.cpp
+++ b/etfstockinfo.cpp
@@ -8,6 +8,8 @@
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
+#include <QMessageBox>
+#include <QDateTime>
ETFStockInfo::ETFStockInfo(QWidget *parent) :
QMainWindow(parent),
@@ -65,11 +67,34 @@
m_manager.get(m_request);
qDebug()<<"璇锋眰涓�...";
+ ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());
+ ui->dateTimeEdit_3->setDateTime(QDateTime::currentDateTime());
+
}
ETFStockInfo::~ETFStockInfo()
{
delete ui;
+}
+
+void ETFStockInfo::initMySQL()
+{
+ //娣诲姞涓�涓暟鎹簱
+ db=QSqlDatabase::addDatabase("QMYSQL"); //鎷彿鍐呰鍐欏嚭鏁版嵁搴撶殑绫诲瀷
+ //璁剧疆鏁版嵁搴�
+ db.setHostName("127.0.0.1"); //璁剧疆鏁版嵁搴撶殑涓绘満ip
+ //璁剧疆鏁版嵁搴撶殑鐢ㄦ埛鍚�
+ db.setUserName("root");
+ //璁剧疆鏁版嵁搴撶殑瀵嗙爜
+ db.setPassword("root"); //杩欎釜灏辨槸瀹夎MySQL鏃惰缃殑瀵嗙爜
+ //璁剧疆鏁版嵁搴撶殑鍚嶅瓧
+ db.setDatabaseName("stock_plan");
+ //鎵撳紑鏁版嵁搴擄紙宸茬粡瀹夎杩噈ysql椹卞姩浜嗭級
+ if(db.open()==false){
+ QMessageBox::warning(this,"waring",db.lastError().text());
+ }else{
+ qDebug()<<"mysql conn ok";
+ }
}
void ETFStockInfo::getEtfInfo(QByteArray &buffer)
@@ -151,6 +176,9 @@
// 娣诲姞涓�琛屾暟鎹」鍒版ā鍨嬩腑
//m_model->appendRow(rowItems);
m_model_market->appendRow(rowItems);
+
+ // 淇濆瓨etf鍩洪噾鐨勪唬鍙峰拰鍚嶅瓧
+ m_codeNamesEtf[symbol] = name;
}
}
@@ -210,6 +238,64 @@
}
}
+void ETFStockInfo::getStockOne(QByteArray &buffer)
+{
+ QJsonDocument jd = QJsonDocument::fromJson(buffer);
+ if(jd.isObject()){
+ QJsonObject jObject = jd.object();
+ QJsonArray jArr = jObject.value("data").toObject().value("item").toArray(); // 閫氳繃閿�煎鍙栧��
+ int cnt = jArr.count();
+ qDebug()<<"鏁扮粍size:"<<cnt;
+ QString symbol = jObject.value("data").toObject().value("symbol").toString();
+ QString code = symbol; // 鑲$エ浠e彿
+ QString name = m_codeNamesEtf[code];
+ qDebug()<<"鍘嗗彶:"<<code<<symbol;
+
+ // 浠ユ壒閲忓啓鍏ョ殑鏂瑰紡鏉ヨ幏鍙栧骞存暟鎹�
+ QString sql = "insert into etf_day_info (code,name,amount,chg,percent,volume,close,time_trade) values ";
+ //qDebug()<<"sql 1:"<<sql;
+ for(int i=0;i<cnt;++i){
+ qint64 timestamp = jArr.at(i).toArray().at(0).toVariant().toLongLong();
+// double open = jArr.at(i).toArray().at(2).toVariant().toDouble();
+// double high = jArr.at(i).toArray().at(3).toVariant().toDouble();
+// double low = jArr.at(i).toArray().at(4).toVariant().toDouble();
+ double close = jArr.at(i).toArray().at(5).toVariant().toDouble();
+ double percent = jArr.at(i).toArray().at(7).toVariant().toDouble();
+// double turnoverrate = jArr.at(i).toArray().at(8).toVariant().toDouble();
+ double amount = jArr.at(i).toArray().at(9).toVariant().toDouble();
+// double pe_ttm = jArr.at(i).toArray().at(16).toVariant().toDouble();
+// double market_capital = jArr.at(i).toArray().at(17).toVariant().toDouble();
+ long long volume = jArr.at(i).toArray().at(1).toVariant().toLongLong()/100;
+ double chg = jArr.at(i).toArray().at(6).toVariant().toDouble();
+
+ //long long amount = jArr.at(i).toArray().at(9).toVariant().toLongLong()/100000000; // 浜�
+ QString curDateTime = QDateTime::fromMSecsSinceEpoch(timestamp).toString("yyyy-MM-dd");
+// qDebug()<<timestamp<<curDateTime<<close<<volume<<amount;
+
+ // 澶勭悊鏁版嵁淇濆瓨鍒版ā鍨嬩腑
+ QString vals = QString("('%1','%2',%3,%4,%5,%6,%7,'%8')").arg(code).arg(name).arg(QString::number(amount))
+ .arg(QString::number(chg)).arg(QString::number(percent)).arg(QString::number(volume)).arg(QString::number(close))
+ .arg(curDateTime);
+ if(i != cnt - 1){
+ vals.append(",");
+ }
+ sql.append(vals);
+ //qDebug()<<"sql 3:"<<sql;
+
+ }
+ qDebug()<<"over:"<<sql.size();
+// qDebug()<<"sql 2:"<<sql; // 澶ぇ浜� 鏄剧ず涓嶅嚭鏉�
+
+ QSqlQuery que(db);
+ if(que.exec(sql)){
+ qDebug()<<"insert ok";
+ }else{
+ qDebug()<<"insert fail"<<que.lastError().text();
+ }
+ }
+
+}
+
void ETFStockInfo::showAplyData(QNetworkReply *reply)
{
qDebug()<<"鏀跺埌鍝嶅簲etf";
@@ -224,7 +310,7 @@
}else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/chart/kline.json") != -1){
qDebug()<<"鏌ョ湅涓偂鎯呭喌:";
-// getStockOne(buffer);
+ getStockOne(buffer);
}else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=100&order=desc&order_by=percent&market=CN&ind_code") != -1){
qDebug()<<"鏍规嵁琛屼笟鑾峰彇鑲$エ淇℃伅"<<reply->url();
@@ -290,3 +376,105 @@
}
}
+
+void ETFStockInfo::on_pushButton_search_date_clicked()
+{
+ // 鎸夋棩鏈熸煡璇㈡暟鎹簱锛屼簡瑙h秼鍔�
+ QString cur_date = ui->dateTimeEdit->date().toString("yyyy-MM-dd");
+ QString sql = QString("select * from etf_day_info where time_trade = '%1' order by percent desc").arg(cur_date);
+
+ QSqlQuery que(db);
+ if(que.exec(sql)){
+ qDebug()<<"select ok";
+
+ m_model_market->setRowCount(0); // 閲嶇疆妯″瀷琛屾暟
+ int rows = 0;
+ while (que.next()) {
+ QString code = que.value(1).toString();
+ QString name = que.value(2).toString();
+ QString amount = QString::number(que.value(3).toDouble()/100000000);
+ QString chg = QString::number(que.value(4).toDouble());
+ QString percent = que.value(5).toString();
+ QString volume = que.value(6).toString();
+ QString close = que.value(7).toString();
+ QString time_trade = que.value(8).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,amount_rank});
+
+ QList<QStandardItem*> items;
+ items.append(new QStandardItem(code));
+ items.append(new QStandardItem(name));
+ items.append(new QStandardItem(amount));
+ items.append(new QStandardItem(chg));
+ items.append(new QStandardItem("0"));
+ items.append(new QStandardItem("0"));
+ 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(volume));
+ items.append(new QStandardItem(close));
+ items.append(new QStandardItem(time_trade));
+
+// items.append(new QStandardItem(pe_ttm));
+// items.append(new QStandardItem(amount_rank));
+ m_model_market->appendRow(items);
+ rows++;
+ }
+ qDebug()<<"鏌ヨ鍒拌鏁�:"<<rows;
+
+
+ }else{
+ qDebug()<<"select fail"<<que.lastError().text();
+ }
+
+}
+
+void ETFStockInfo::on_pushButton_update_clicked()
+{
+ // 鏇存柊鍒版渶鏂帮紝榛樿鍏ㄦ洿
+ // 涔熷彲浠ユ寚瀹氬ぉ鏁扮殑鏁伴噺鏉ユ洿鏂�
+
+ // 鍏堜繚璇佽幏鍙栧埌褰撳墠鎵�鏈夌殑etf鍩洪噾鐨勪唬鐮佸拰鍚嶅瓧锛岀劧鍚庢牴鎹唬鐮佹潵鍙戣捣鏇存柊璇锋眰
+ m_days = ui->comboBox_days->currentText().toInt();
+
+ if(m_days == 0) return;
+
+ if(m_codeNamesEtf.size() > 0){
+ qint64 cur_time = QDateTime::currentMSecsSinceEpoch();
+
+ for(auto code:m_codeNamesEtf.keys()){
+ QString url = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=day&type=before&count=-%3&indicator=kline,pe,market_capital,ma")
+ .arg(code).arg(QString::number(cur_time)).arg(m_days);
+ m_request.setUrl(QUrl(url));
+ m_manager.get(m_request);
+
+ }
+ qDebug()<<"鍙戣捣璇锋眰瀹屾垚";
+ }else{
+ // 濡傛灉涓虹┖锛屽垯闇�瑕佸幓鍒锋柊涓�涓嬫渶鏂扮殑鎯呭喌锛岃幏鍙栧熀閲戜俊鎭�
+ on_pushButton_market_clicked();
+ }
+
+}
+
+void ETFStockInfo::on_checkBox_update_clicked()
+{
+
+ if(ui->checkBox_update->isChecked()){
+ ui->pushButton_update->setEnabled(true);
+ }else{
+ ui->pushButton_update->setEnabled(false);
+ }
+}
diff --git a/etfstockinfo.h b/etfstockinfo.h
index 10b993f..77d777b 100644
--- a/etfstockinfo.h
+++ b/etfstockinfo.h
@@ -23,8 +23,10 @@
explicit ETFStockInfo(QWidget *parent = 0);
~ETFStockInfo();
+ void initMySQL();
void getEtfInfo(QByteArray &buffer);
void getStockFundPosition(QByteArray &buffer,QString url); // 鑾峰彇涓偂瀵瑰簲鍩洪噾鎸佷粨鎯呭喌--鎬荤殑缁熻
+ void getStockOne(QByteArray &buffer); // 鑾峰彇鍗曞彧etf鑲$エ鐨勪俊鎭�
signals:
void sendSymbolNums(int); // 閫氳繃鏁伴噺鑾峰彇鎺掑悕鍓峃鍚嶇殑鑲$エ浠e彿杩囨潵
@@ -40,6 +42,12 @@
void getStockFundPosSlot(QString symbol); // 閫氳繃鑲$エ浠e彿鑾峰彇鍩洪噾鎸佷粨鎯呭喌
+ void on_pushButton_search_date_clicked();
+
+ void on_pushButton_update_clicked();
+
+ void on_checkBox_update_clicked();
+
private:
Ui::ETFStockInfo *ui;
@@ -50,10 +58,13 @@
QSqlDatabase db;
QMap<QString,QString> m_codeNames; // 鑲$エ浠e彿鍜屽悕瀛�
+ QMap<QString,QString> m_codeNamesEtf; // Etf浠e彿鍜屽悕瀛�
QNetworkRequest m_request; // 鐢ㄤ簬绠$悊璇锋眰澶寸殑
QString m_cookie; // 缂撳瓨
QNetworkAccessManager m_manager; // 鐢ㄤ簬绠$悊http璇锋眰鍙婂搷搴旂殑
+
+ int m_days = 0;
};
#endif // ETFSTOCKINFO_H
diff --git a/etfstockinfo.ui b/etfstockinfo.ui
index 1639fd6..154e743 100644
--- a/etfstockinfo.ui
+++ b/etfstockinfo.ui
@@ -18,7 +18,7 @@
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
- <number>1</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
@@ -35,7 +35,7 @@
<widget class="QComboBox" name="comboBox">
<item>
<property name="text">
- <string>绫诲瀷1</string>
+ <string>鏃堕棿</string>
</property>
</item>
<item>
@@ -46,9 +46,84 @@
</widget>
</item>
<item>
+ <widget class="QDateTimeEdit" name="dateTimeEdit">
+ <property name="date">
+ <date>
+ <year>2025</year>
+ <month>1</month>
+ <day>1</day>
+ </date>
+ </property>
+ <property name="displayFormat">
+ <string>yyyy-MM-dd HH:mm:ss</string>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_search_date">
+ <property name="text">
+ <string>鏌ヨ鎸囧畾鏃ユ湡</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QPushButton" name="pushButton_market">
<property name="text">
<string>鏌ヨ鏈�鏂�</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBox_update">
+ <property name="text">
+ <string>鏇存柊</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboBox_days">
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>0</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>3</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>澶�</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_update">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>鏇存柊</string>
</property>
</widget>
</item>
@@ -149,6 +224,67 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="tab_3">
+ <attribute name="title">
+ <string>ETF瓒嬪娍</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="0" column="0">
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>鏌ヨ鏉′欢</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QComboBox" name="comboBox_2">
+ <item>
+ <property name="text">
+ <string>鎺掑悕</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>鍏ㄩ儴</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDateTimeEdit" name="dateTimeEdit_3">
+ <property name="date">
+ <date>
+ <year>2025</year>
+ <month>1</month>
+ <day>1</day>
+ </date>
+ </property>
+ <property name="displayFormat">
+ <string>yyyy-MM-dd HH:mm:ss</string>
+ </property>
+ <property name="calendarPopup">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_2">
+ <property name="text">
+ <string>鏌ヨ</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QTableView" name="tableView_trend"/>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
</layout>
diff --git a/stock_plan_251106_etf.sql b/stock_plan_251106_etf.sql
new file mode 100644
index 0000000..65268f5
--- /dev/null
+++ b/stock_plan_251106_etf.sql
@@ -0,0 +1,36 @@
+-- --------------------------------------------------------
+-- 涓绘満: 127.0.0.1
+-- 鏈嶅姟鍣ㄧ増鏈�: 5.6.35-log - MySQL Community Server (GPL)
+-- 鏈嶅姟鍣ㄦ搷浣滅郴缁�: Win64
+-- HeidiSQL 鐗堟湰: 9.5.0.5196
+-- --------------------------------------------------------
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET NAMES utf8 */;
+/*!50503 SET NAMES utf8mb4 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+
+
+-- 瀵煎嚭 stock_plan 鐨勬暟鎹簱缁撴瀯
+CREATE DATABASE IF NOT EXISTS `stock_plan` /*!40100 DEFAULT CHARACTER SET utf8 */;
+USE `stock_plan`;
+
+-- 瀵煎嚭 琛� stock_plan.etf_day_info 缁撴瀯
+CREATE TABLE IF NOT EXISTS `etf_day_info` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `code` varchar(50) DEFAULT NULL COMMENT '浠g爜',
+ `name` varchar(50) DEFAULT NULL COMMENT '鍚嶅瓧',
+ `amount` bigint(20) DEFAULT NULL COMMENT '鎴愪氦棰�',
+ `chg` double DEFAULT NULL COMMENT '娑ㄨ穼棰�',
+ `percent` double DEFAULT NULL COMMENT '娑ㄨ穼骞�',
+ `volume` bigint(20) DEFAULT NULL COMMENT '鎴愪氦閲�',
+ `close` double DEFAULT NULL COMMENT '甯備环',
+ `time_trade` varchar(50) DEFAULT NULL COMMENT '浜ゆ槗鏃堕棿',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=640561 DEFAULT CHARSET=utf8 COMMENT='etf鍩洪噾鏃ョ嚎鏁版嵁';
+
+-- 鏁版嵁瀵煎嚭琚彇娑堥�夋嫨銆�
+/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
+/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
--
Gitblit v1.8.0