qt qchart绘制简单股票

原始数据来自公开的链接

解析代码:

#include "StockDataReader.h"
#include 
#include 
#include 
//#include "../StockAnalyse/StockAnalyse_global.h"
//#include "../StockAnalyse/stockanalyse.h"// 静态成员变量需要在类体的外面进行初始化
//StocksDataReader* StocksDataReader::m_pInstance = NULL;
StocksDataReader* StocksDataReader::m_pInstance=NULL;
QMutex StocksDataReader::m_Mutex;static QString strhttp_kline = "https://quotes.sina.cn/cn/api/json_v2.php/CN_MarketDataService.getKLineData?symbol=";//绘制实时的分时图需要下列两个网址相结合,腾讯的网址获取今日的历史分时图,新浪的网址实时的该股票行情,进行对今日分时图刷新
//http://data.gtimg.cn/flashdata/hushen/minute/sz000001.js?maxage=110&0.28163905744440854
static QString strhttp_realtime = "http://hq.sinajs.cn/list=";
static QString strhttp_timeline = "http://data.gtimg.cn/flashdata/hushen/minute/";
static QString strhttp_4daytimeline = "http://data.gtimg.cn/flashdata/hushen/4day/"; //+sz/或sh///https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=sh600519         //新的链接
static QString strhttp_timeline_new = "https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=";
static QString strhttp_4daytimeline_new = "https://web.ifzq.gtimg.cn/appstock/app/day/query?code=";
//获取最新行情
static QString strhttp_realtime_all = "http://qt.gtimg.cn/q=";//sh600000,sz000001  sh500038 //可以选这个数据多,不用计算可以直接用//获取实时资金流向
//http://qt.gtimg.cn/q=ff_sh600519//参考链接https://www.jianshu.com/p/e14b01990ff4
static QString strhttp_realtimemoney = "http://qt.gtimg.cn/q=";//获取简要信息
//http://qt.gtimg.cn/q=s_sh600519,s_sh600000,s_sz000001//获取港股最新行情
//http://qt.gtimg.cn/q=r_hk09988//获取美股最新行情
//http://qt.gtimg.cn/?q=s_usBABA//一些链接
// https://www.cnblogs.com/jackljf/p/3589216.html//获取所有股票代码 (sign会不定期调整)
//http://api.k780.com/?app=finance.stock_list&category=hs&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json
static QString strhttp_allSharescode = "http://api.k780.com/?app=finance.stock_list&category=hs&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";//参考文章
//https://blog.csdn.net/dangfm/article/details/25079471//获取股票的交易明细(p为分页,每页70条数据)
//https://stock.gtimg.cn/data/index.php?appn=detail&action=data&c=sz002451&p=0//返回的格式: v_detail_data_sz002451=[0,"0/09:25:01/6.21/0.01/20/12420/B|1/09:30:01/6.25/0.04/81/50621/B]static QString strhttp_tradeDetail = "https://stock.gtimg.cn/data/index.php?appn=detail&action=data&c=";
StocksDataReader::StocksDataReader()
{manager = new QNetworkAccessManager(this);bool bSupp = QSslSocket::supportsSsl();QString buildVersion = QSslSocket::sslLibraryBuildVersionString();QString version = QSslSocket::sslLibraryVersionString();qDebug() << bSupp << buildVersion << version << endl;qDebug() << manager->supportedSchemes();m_SharesCodelist = new QVariantList();m_templist = new QVariantList();m_timelinelist = new QVector;m_pMap5DayTimeLine = new QMap*>();//m_AllRealtimelist = new QVector;m_SharesOlderList = new QMap*>();m_AllRealtimeMoneylist = new QVector;m_timer = new QTimer(this);connect(m_timer, &QTimer::timeout, this, [=](){if(m_SharesAllCode.size()> 0){PreGetAllRealtimeData(m_SharesAllCode);PreGetAllRealtimeMoney(m_SharesAllCode);//qDebug()<<"实时刷新正在运行...";}});m_timer->start(1000);m_currentPage = 0;m_bGetDetailFinished = false;m_currentIndex = 0;m_bGetAllKLineStart = false;m_bGetAllKLineFinished = false;}void StocksDataReader::StartWorking()
{qDebug()<<"StocksDataReader"<isActive()){qDebug()<isActive()<<"开启定时任务获取实时数据";m_timer->start(1000);}}else{// qDebug()<<"还没开市!";if(m_timer->isActive()){qDebug()<<"关闭定时获取实时数据任务";m_timer->stop();}}// m_timer->start(1000);
}void StocksDataReader::UpdateAllCodeFromHttpToDB()
{//m_SharesCodelist函数内没用到//qDebug()<<__FUNCTION__;StartGetAllSharesCodeFromHttp(m_SharesCodelist);}StocksDataReader::~StocksDataReader()
{manager->deleteLater();
}void StocksDataReader::StartGetKLineDataFromHttp(QString SharesCode,int type,int num,QVariantList* list)
{QNetworkRequest request;// 发送https请求前准备工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::TlsV1SslV3);request.setSslConfiguration(conf);QString strType,strCode,strNum;switch(type){case TYPE_5MIN_KLINE:strType = "5";break;case TYPE_10MIN_KLINE:strType = "10";break;case TYPE_10DAY_KLINE:strType  = "2400";break;case TYPE_5DAY_KLINE:strType = "1200";break;case TYPE_15MIN_KLINE:strType = "15";break;case TYPE_30MIN_KLINE:strType = "30";break;case TYPE_60MIN_KLINE:strType = "60";break;case TYPE_DAY_KLINE:strType = "240";break;default:strType = "240";break;}strNum = QString::number(num);//默认5,10,20,30均线都请求request.setUrl(QUrl(strhttp_kline+SharesCode+"&scale="+strType+"&ma=5,10,20,30"+"&datalen="+strNum));       ////startQNetworkReply *pReply = manager->get(request);connect(pReply , SIGNAL(finished()) , this , SLOT(onFinished_GetKLine()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetKLine(QNetworkReply::NetworkError)));
}void StocksDataReader::StartGetAllKLineDataFromHttp()
{m_currentCodeforAllKLine = m_SharesAllCode.at(m_currentIndex);m_bGetAllKLineStart = true;StartGetKLineDataFromHttp(m_currentCodeforAllKLine,TYPE_DAY_KLINE,-1,m_templist);//通过改第三个参数来决定获得多少天的数据}
void StocksDataReader::StartGetRealtimeDataFromHttp(QString SharesCode, QVector *list)
{}//新的腾讯分时api
void StocksDataReader::StartGetTimelineDataFromHttp_new(QString SharesCode, QVector *list)
{QNetworkRequest request;// 发送https请求前准备工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::TlsV1SslV3);request.setSslConfiguration(conf);//使qt自动处理重定向及相关问题request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);request.setUrl(QUrl(strhttp_timeline_new+SharesCode));//startQNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetTimeLineNew()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetTimeLineNew(QNetworkReply::NetworkError)));}void StocksDataReader::StartGetTimelineData_5DayFromHttp_new(QString SharesCode, QMap*>*list)
{QNetworkRequest request;// 发送https请求前准备工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::TlsV1SslV3);request.setSslConfiguration(conf);//使qt自动处理重定向及相关问题request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);request.setUrl(QUrl(strhttp_4daytimeline_new+SharesCode));//startQNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetTimeLine_5DayNew()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetTimeLine_5DayNew(QNetworkReply::NetworkError)));
}
void StocksDataReader::StartGetTimelineDataFromHttp(QString SharesCode, QVector* list)
{QNetworkRequest request;// 发送https请求前准备工作;QSslConfiguration config;QSslConfiguration conf = request.sslConfiguration();conf.setPeerVerifyMode(QSslSocket::VerifyNone);conf.setProtocol(QSsl::TlsV1SslV3);request.setSslConfiguration(conf);//使qt自动处理重定向及相关问题request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);request.setUrl(QUrl(strhttp_timeline+SharesCode+".js"));       //?maxage=110&0.28163905744440854//startQNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetTimeLine()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetTimeLine(QNetworkReply::NetworkError)));}void StocksDataReader::PreGetAllRealtimeData(QStringList SharesCodes)
{//因为腾讯的实时数据接口一次最多请求900个数据,所以需要进行处理int num = SharesCodes.size();//基金代码不想要了,就从303开始int times = (num)/900+1;//-303int res;for(int i = 0;i* list)
{QNetworkRequest request;request.setUrl(QUrl(strhttp_realtime_all+SharesCodes.join(",")));//m_AllRealtimelist = list;QNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetAllRealTime()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetAllRealTime(QNetworkReply::NetworkError)));
}
//获取股票的交易明细
void StocksDataReader::StartGetTradeDetailFromHttp(QString ShareCode,int page)
{QNetworkRequest request;request.setUrl(QUrl(strhttp_tradeDetail+ShareCode+"&p=" + QString::number(page)));QNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetTradeDetail()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetTradeDetail(QNetworkReply::NetworkError)));
}
void StocksDataReader::PreGetTradeDetail(QString ShareCode)
{m_currentPage = 0;m_bGetDetailFinished = false;m_currentCodeforDetail = ShareCode;//清除上一个股票的成交明细m_SharesOlderList->clear();StartGetTradeDetailFromHttp(m_currentCodeforDetail ,m_currentPage);
}void StocksDataReader::StartGetAllTradeDetailFromHttp()
{m_bGetAllTradeDetailFinished = false;//获取所有股票的成交明细,主要用于保存成历史文件m_currentCodeforTradeDetail = m_SharesAllCode.at(m_currentIndexForTradeDetail);PreGetTradeDetail(m_currentCodeforTradeDetail);}void StocksDataReader::PreGetAllRealtimeMoney(QStringList SharesCodes)
{int num = SharesCodes.size();//基金代码不想要了,就从303开始int times = (num)/680;//-303int res;for(int i = 0;iget(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetRealtimeMoney()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetRealtimeMoney(QNetworkReply::NetworkError)));
}//从网络更新所有的股票代码
void StocksDataReader::StartGetAllSharesCodeFromHttp(QVariantList *list)
{QNetworkRequest request;request.setUrl(QUrl(strhttp_allSharescode));if(list == NULL)return;//m_SharesCodelist = list;QNetworkReply *pReply = manager->get(request);connect(pReply,SIGNAL(finished()),this,SLOT(onFinished_GetAllSharesCode()));connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError_GetAllSharesCode(QNetworkReply::NetworkError)));
}
//从本地数据库中获得所有股票代码
void StocksDataReader::GetAllSharesCodeFromDB()
{QSqlDatabase database =QSqlDatabase::addDatabase("QSQLITE");
//       if(QSqlDatabase::contains("localhost@3306"))
//           database = QSqlDatabase::database("localhost@3306");
//       else
//          database = QSqlDatabase::addDatabase("QSQLITE", "localhost@3306");database.setDatabaseName(QApplication::applicationDirPath()+"/database.db");//    database.setUserName("root");//    database.setPassword("123456");if (!database.open()){qDebug() << "Error: Failed to connect database." << database.lastError();}else{qDebug() << "Succeed to connect database." ;QSqlQuery sql_query;//QString create_sql = "create table allSharecode_table (id varchar(30) primary key, name varchar(30))";QString select_allSharesCode_sql = "select * from  allSharecode_table";sql_query.prepare(select_allSharesCode_sql);if(!sql_query.exec()){qDebug()<append(sql_query.value(0).toString());list->append(sql_query.value(1).toString());//过滤掉数据库中的基金和其他不是股票的code,因为从网络获得的所有股票数据不太好,需要换个链接if(sql_query.value(0).toString().left(3) != "sh5" \&& sql_query.value(0).toString().left(3) != "sz1"\&& sql_query.value(0).toString().left(3) != "sz6"\&& sql_query.value(0).toString().left(3) != "sh9"){m_SharesInfo.insert(sql_query.value(0).toString(),*list);//存入读取的股票代码m_SharesAllCode<code = (sql_query.value(0).toString());data->AddDate = (sql_query.value(1).toString());data->Tip = sql_query.value(2).toString();data->Name = sql_query.value(3).toString();m_ChooseShareslist.push_back(*data);//qDebug()<clear();
}void StocksDataReader::clearTimelinedata()
{m_timelinelist->clear();}//将股票数据保存到本地的文件
int StocksDataReader::SaveAsLocalFile(QString SharesCode)
{return 0;
}
int StocksDataReader::ReadFromLocalFile(QString SharesCode)
{return 0;
}int StocksDataReader::SaveAllKLineAsLocalFile()
{QJsonObject obj;QJsonObject sub;QJsonArray  arr,arr2;QJsonArray jsonArray;QString str;QFile file("temo.json");file.open(QIODevice::WriteOnly);for(int i = 0;i StocksDataReader::Parase(QJsonValue value)
{QList list;if(value.isObject()){QJsonObject obj = value.toObject();QJsonValue val = obj.value(obj.keys().at(0));if(val.isObject()){QJsonValue val1 =val.toObject().value("data");if(val1.isObject()){QJsonValue val2 = val1.toObject().value("data");if(val2.isArray()){qDebug()<(sender());if(QNetworkReply::ContentNotFoundError == pReplay->error()){//没有获得数据m_templist->clear();m_MapAllSharesKLine.clear();}else{QByteArray replyContent = pReplay->readAll();if(replyContent == "null"){if(m_bGetAllKLineStart){//qDebug()<readAll();QJsonParseError jsonparseerr;QJsonDocument jsonDoc = QJsonDocument::fromJson(replyContent,&jsonparseerr);if(jsonDoc.isArray()){//qDebug()<<"aaaa";if(m_bGetAllKLineStart == false){m_templist->clear();(*m_templist) = jsonDoc.toVariant().toList();//数据接收完成,发出信号emit getKlineFinished(m_templist);}//用于分析if(m_bGetAllKLineStart){m_MapAllSharesKLine.insert(m_currentCodeforAllKLine,jsonDoc.toVariant().toList());//请求下一条m_currentIndex += 1;if(m_currentIndex < m_SharesAllCode.size()){m_currentCodeforAllKLine = m_SharesAllCode.at(m_currentIndex);//qDebug()<deleteLater();
}
void StocksDataReader::onFinished_GetTimeLine()
{QNetworkReply *pReplay = qobject_cast(sender());if(QNetworkReply::ContentNotFoundError == pReplay->error()){//没有获得数据m_timelinelist->clear();}else{//构建QTextStream读一行//qDebug()<<__FUNCTION__<error()<readAll();QTextStream datam(pReplay->readAll());datam.readLine();QString date = datam.readLine();QStringList strList;m_timelinelist->clear();do{QString line = datam.readLine();line = line.replace("\\n\\"," ");strList = line.split(" ", QString::SkipEmptyParts);if(strList[0] != "\";")m_timelinelist->append(strList);}while(strList[0] != "\";");}//发出接收分时数据完成信号emit getTimelineFinished(m_timelinelist);//qDebug()<at(1);pReplay->deleteLater();
}void StocksDataReader::onFinished_GetTimeLineNew()
{QNetworkReply *pReplay = qobject_cast(sender());QStringList strList;if(QNetworkReply::ContentNotFoundError == pReplay->error()){//没有获得数据m_timelinelist->clear();}else{m_timelinelist->clear();QByteArray replyContent = pReplay->readAll();QJsonParseError jsonparseerr;QJsonDocument jsonDoc = QJsonDocument::fromJson(replyContent,&jsonparseerr);//qDebug()< >QJsonValue value = jsonObject["data"];if(value.isObject()&& !value.isNull()){if(value.isObject()){QJsonObject obj = value.toObject();QJsonValue val = obj.value(obj.keys().at(0));if(val.isObject()){QJsonValue val1 =val.toObject().value("data");if(val1.isObject()){QJsonValue val2 = val1.toObject().value("data");if(val2.isArray()){//qDebug()<append(val2.toVariant().toList().at(i).toString().split(' '));//Debug()<at(i);}emit getTimelineNewFinished(m_timelinelist);}}}}}}}pReplay->deleteLater();}void StocksDataReader::onFinished_GetTimeLine_5DayNew()
{QNetworkReply *pReplay = qobject_cast(sender());QStringList strList;if(QNetworkReply::ContentNotFoundError == pReplay->error()){//没有获得数据m_pMap5DayTimeLine->clear();}else{m_pMap5DayTimeLine->clear();QByteArray replyContent = pReplay->readAll();QJsonParseError jsonparseerr;QJsonDocument jsonDoc = QJsonDocument::fromJson(replyContent,&jsonparseerr);//qDebug()<* strlist = new QVector();for(int j = 0;jappend(val2.toVariant().toList().at(j).toStringList());}m_pMap5DayTimeLine->insert(str,strlist);}//发出接收完成信号emit getTimeline_5DayNewFinished(m_pMap5DayTimeLine);}}}}}
}
void StocksDataReader::onFinished3()//实时行情槽函数
{}
void StocksDataReader::onFinished_GetAllRealTime()//腾讯的实时股票显示数据()槽函数
{//解析多个股票的实时数据QNetworkReply *pReplay = qobject_cast(sender());QTextCodec *gbk = QTextCodec::codecForName("gbk");QString g2u = gbk->toUnicode(pReplay->readAll());QString g2uTmp = g2u.replace(QString("\n"),QString(""));//m_AllRealtimelist->clear();QStringList strList = g2u.split(";",QString::SkipEmptyParts);for (QStringList::iterator it = strList.begin();it != strList.end(); ++it){int index= it->indexOf("\"");int index2= it->lastIndexOf("\"");QString vCode = it->left(index-1);QString st1 = it->mid(index+1,index2-(index+1));QStringList strTo = st1.split("~");//,QString::SkipEmptyParts//strTo<deleteLater();
}
void StocksDataReader::onFinished_GetAllSharesCode() //从网络获取所有股票代码的槽函数
{QNetworkReply *pReplay = qobject_cast(sender());QByteArray replyContent = pReplay->readAll();//json的中文处理//qDebug()<size() ; i++ ){QVariantMap map = m_SharesCodelist->at(i).toMap();if(!m_SharesAllCode.contains(map["symbol"].toString()) \&& map["symbol"].toString().left(3) != "sh5"\&& map["symbol"].toString().left(3) != "sz1"\&& map["symbol"].toString().left(3) != "sz6"\&& map["symbol"].toString().left(3) != "sh9"){qDebug()<append(map["symbol"].toString());list->append(map["sname"].toString());m_SharesInfo.insert(map["symbol"].toString(),*list);emit getAllSharesCodeFinished(*list);}}}}}}else{qDebug()<<"获取所有股票代码失败.";}pReplay->deleteLater();
}
void StocksDataReader::onFinished_GetTradeDetail()//从网络获取交易明细的槽函数
{QNetworkReply *pReplay = qobject_cast(sender());QByteArray replyContent = pReplay->readAll();//如果返回没有数据,则可以认为已经接收完了,不用继续请求下一页数据了if(replyContent == ""){qDebug()<<"获取分时交易数据成功。";m_bGetDetailFinished = true;emit getTradeDetailFinished(m_SharesOlderList);return;}QString str = QString(replyContent);QString page =str.mid(str.indexOf('[')+1,str.indexOf(',')-(str.indexOf('[')+1));//qDebug()<* s = new QVector();for(int i = 0;itime = str3.at(1);olderData->price = str3.at(2).toDouble();olderData->zhangdie = str3.at(3).toDouble();olderData->volume = str3.at(4).toULong();olderData->money = str3.at(5).toULong();olderData->flag = str3.at(6);s->append(*olderData);}m_SharesOlderList->insert(page.toInt(),s);if(m_bGetDetailFinished == false){m_currentPage += 1;StartGetTradeDetailFromHttp(m_currentCodeforDetail,m_currentPage);}//qDebug()<size()<(sender());//qDebug()<readAll();QTextCodec *gbk = QTextCodec::codecForName("gbk");QString g2u = gbk->toUnicode(pReplay->readAll());g2u = g2u.simplified(); //去掉一些换行符啥的QStringList strtmp = g2u.split(";");//qDebug()<value("000001");}void StocksDataReader::onSaveEveryday()
{qDebug()<<__FUNCTION__;}

代码:

 shares和stockAnalyse-QT文档类资源-CSDN文库


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部