#include "analysisbyrediscache.h" #include "ui_analysisbyrediscache.h" #include #include #include 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:"<label_load->setText(QString("缓存加载%2条,耗时%1ms").arg(QString::number(resTime)).arg(QString::number(result.size()))); } // 滑动窗口计算排名变化 void AnalysisByRedisCache::calcWindowRank(int start) { // 滑动窗口排名,6个要2+的前100 QVector ranks; for(int i=start;irowCount();++i){ ranks.append(m_model->item(i,4)->text().toInt()); if(i >= 6+start){ // 先统计排名计数 int cntBig=0, cntSmall=0; for(int j=0;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:"< 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 items_2; for(int i=0;itext())); 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="<rowCount()<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); }