#include "analysisbyrediscache.h"
|
#include "ui_analysisbyrediscache.h"
|
#include <QDateTime>
|
#include <QDebug>
|
#include <QElapsedTimer>
|
|
AnalysisByRedisCache::AnalysisByRedisCache(QWidget *parent) :
|
QMainWindow(parent),
|
ui(new Ui::AnalysisByRedisCache)
|
{
|
ui->setupUi(this);
|
|
ui->dateEdit->setDate(QDate::currentDate().addMonths(-1));
|
|
if(m_dbCache.initMySQL("127.0.0.1",3306,"root","root","stock_plan")){
|
qDebug()<<"mysql conn ok";
|
}else{
|
qDebug()<<"mysql conn fail";
|
}
|
|
if(m_dbCache.initRedis("127.0.0.1",6379)){
|
qDebug()<<"redis conn ok";
|
}else{
|
qDebug()<<"redis conn fail";
|
}
|
|
m_model = new QStandardItemModel(this);
|
ui->tableView->setModel(m_model);
|
|
m_modelResult = new QStandardItemModel(this);
|
ui->tableView_2->setModel(m_modelResult);
|
|
QStringList labels;
|
labels<<"股票名字"<<"市值"<<"收盘价"<<"涨跌幅"<<"排名"<<"交易时间"<<"排名变化"<<"底部反转时间"<<"一阳穿四线时间";
|
m_model->setHorizontalHeaderLabels(labels);
|
m_modelResult->setHorizontalHeaderLabels(labels);
|
}
|
|
AnalysisByRedisCache::~AnalysisByRedisCache()
|
{
|
delete ui;
|
}
|
|
void AnalysisByRedisCache::on_pushButton_loadDataSQLRedis_clicked()
|
{
|
ui->label_load->setText("缓存加载中...");
|
QString begin_date = ui->dateEdit->text();
|
QString limit_str = ui->comboBox->currentText();
|
QString sql = QString("select * from stock_day_info where time_trade > '%1' limit %2;").arg(begin_date).arg(limit_str);
|
qDebug()<<"sql:"<<sql;
|
QElapsedTimer timer;
|
timer.start();
|
|
auto result = m_dbCache.query(sql);
|
|
qDebug() << "Query executed in" << timer.elapsed() << "ms";
|
qDebug() << "Retrieved" << result.size() << "rows";
|
|
// 第二次查询应该从缓存获取
|
timer.restart();
|
result = m_dbCache.query(sql);
|
qint64 resTime = timer.elapsed();
|
qDebug() << "Cached query executed in" << resTime << "ms";
|
m_result = result;
|
ui->label_load->setText(QString("缓存加载%2条,耗时%1ms").arg(QString::number(resTime)).arg(QString::number(result.size())));
|
|
}
|
|
// 滑动窗口计算排名变化
|
void AnalysisByRedisCache::calcWindowRank(int start)
|
{
|
|
// 滑动窗口排名,6个要2+的前100
|
QVector<int> ranks;
|
for(int i=start;i<m_model->rowCount();++i){
|
ranks.append(m_model->item(i,4)->text().toInt());
|
if(i >= 6+start){
|
// 先统计排名计数
|
int cntBig=0, cntSmall=0;
|
for(int j=0;j<ranks.size();++j){
|
if(ranks.at(j) > 100){
|
cntBig++;
|
}else{
|
cntSmall++;
|
}
|
}
|
// 统计对比
|
if(cntSmall == 2 && ranks.back() <= 100){
|
// 将当前6个元素定为符合的窗口,背景色设置为紫色
|
for(int k=0;k<6;++k){
|
m_model->item(i-k,4)->setData(QColor("red"),Qt::BackgroundColorRole);
|
}
|
}
|
|
// 清除窗口第一个元素
|
ranks.pop_front();
|
}
|
|
}
|
|
}
|
void AnalysisByRedisCache::searchAndAnalysisData(QString name)
|
{
|
QElapsedTimer timer;
|
timer.start();
|
qDebug()<<"m_result size:"<<m_result.size()<<name;
|
|
int rank_val = 0;
|
int cnt = 0;
|
int bigFlag = false;
|
int bigRankUp = false; // 突然从很低的排名上升到大排名
|
bool big_3000 = false;
|
bool big_2000 = false;
|
for(auto it:m_result){
|
if(it["name"].toString() == name){
|
// qDebug()<<it["name"].toString()<<it["close"].toString()<<it["amount_rank"].toString()<<it["time_trade"].toString();
|
cnt++;
|
QList<QStandardItem*> items;
|
items.append(new QStandardItem(it["name"].toString()));
|
double market_capital = it["market_capital"].toDouble() / 100000000;
|
items.append(new QStandardItem(QString::number(market_capital)));
|
items.append(new QStandardItem(it["close"].toString()));
|
|
QStandardItem *percentItem = new QStandardItem(it["percent"].toString());
|
if(percentItem->text().toDouble() > 0){
|
percentItem->setData(QColor("red"),Qt::DecorationRole); // 添加装饰颜色为红色
|
percentItem->setData(QColor("red"),Qt::TextColorRole); // 添加文本颜色为红色
|
items.at(0)->setData(QColor("red"),Qt::TextColorRole); // 设置股票名字为红色
|
|
}else if(percentItem->text().toDouble() < 0){
|
percentItem->setData(QColor("green"),Qt::DecorationRole); // 添加装饰颜色为红色
|
percentItem->setData(QColor("green"),Qt::TextColorRole); // 设置背景颜色为绿色
|
items.at(0)->setData(QColor("green"),Qt::TextColorRole); // 设置股票名字为绿色
|
}
|
items.append(percentItem);
|
//items.append(new QStandardItem(it["percent"].toString()));
|
items.append(new QStandardItem(it["amount_rank"].toString()));
|
items.append(new QStandardItem(it["time_trade"].toString()));
|
QString amount_rank = it["amount_rank"].toString();
|
if(rank_val != 0){
|
double rank_rate = 1 - (amount_rank.toDouble()/rank_val);
|
//items.append(new QStandardItem(QString::number(rank_rate)));
|
|
QStandardItem * amount_rank_item = new QStandardItem(QString::number(rank_rate));
|
if(rank_rate > 0.9){
|
amount_rank_item->setData(QColor("red"),Qt::BackgroundColorRole);
|
bigFlag = true;
|
}
|
if(rank_rate > 0.7 && rank_val >= 1000 && amount_rank.toInt() < 1000){
|
bigRankUp = true;
|
bigFlag = true;
|
if(rank_rate > 0.9){
|
// 紫色
|
amount_rank_item->setData(QColor(170, 85, 255),Qt::BackgroundColorRole);
|
}else{
|
// 粉色
|
amount_rank_item->setData(QColor("pink"),Qt::BackgroundColorRole);
|
}
|
|
|
|
if(rank_val >= 3000){
|
amount_rank_item->setData(QColor(85,170,255),Qt::BackgroundColorRole);
|
big_3000 = true;
|
}
|
else if(rank_val >= 2000){
|
amount_rank_item->setData(QColor(85,255,255),Qt::BackgroundColorRole);
|
big_2000 = true;
|
}
|
|
|
|
|
}
|
items.append(amount_rank_item);
|
rank_val = amount_rank.toInt(); // 到后面再赋值
|
|
}
|
if(rank_val == 0 && amount_rank.toInt() != 0){
|
rank_val = amount_rank.toInt();
|
}
|
|
m_model->appendRow(items);
|
if(bigFlag){
|
QList<QStandardItem*> items_2;
|
for(int i=0;i<items.size();++i){
|
items_2.append(new QStandardItem(items.at(i)->text()));
|
if(i==6 && items.at(i)->text().toDouble() > 0.95){
|
items_2.back()->setData(QColor("red"),Qt::BackgroundColorRole);
|
}else if(i==6 && bigRankUp){
|
if(items.at(i)->text().toDouble() > 0.9){
|
items_2.back()->setData(QColor(170, 85, 255),Qt::BackgroundColorRole);
|
}else{
|
items_2.back()->setData(QColor("pink"),Qt::BackgroundColorRole);
|
}
|
|
if(big_3000){
|
items_2.back()->setData(QColor(85,170,255),Qt::BackgroundColorRole);
|
}
|
if(big_2000){
|
items_2.back()->setData(QColor(85,255,255),Qt::BackgroundColorRole);
|
}
|
|
}
|
}
|
m_modelResult->appendRow(items_2);
|
bigFlag = false;
|
bigRankUp = false;
|
big_3000 = false;
|
big_2000 = false;
|
}
|
}
|
|
}
|
qDebug()<<"cnt="<<cnt;
|
qDebug() << "Query executed in" << timer.elapsed() << "ms";
|
qDebug()<<"滑动窗口排名-cnt:"<<m_model->rowCount()<<cnt<<"start:"<<m_model->rowCount() - cnt + 1;
|
calcWindowRank(m_model->rowCount() - cnt + 1);
|
}
|
void AnalysisByRedisCache::on_pushButton_analysisByRedis_clicked()
|
{
|
// 单个分析
|
QString name = ui->lineEdit_name->text();
|
searchAndAnalysisData(name);
|
|
}
|
|
void AnalysisByRedisCache::on_pushButton_batchAnalysis_clicked()
|
{
|
|
// 批量分析
|
// 重设模型的行数为0,清空一下数据
|
m_model->setRowCount(0);
|
m_modelResult->setRowCount(0);
|
|
int batch_num = ui->comboBox_batchNum->currentText().toInt(); // 批量分析个股的数量
|
// 拿出个股交易额排名的前N名,进行缓存分析
|
emit getStockNamesSignal(batch_num);
|
|
}
|