#include "getstocklist.h" #include "ui_getstocklist.h" #include <QDebug> #include <QFile> #include <QNetworkCookieJar> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QLibrary> // ç”¨äºŽåŠ è½½dll动æ€åº“的类 #pragma execution_character_set("utf-8") GetStockList::GetStockList(QWidget *parent) : QMainWindow(parent), ui(new Ui::GetStockList) { ui->setupUi(this); ui->pushButton_get->hide(); ui->statusbar->hide(); // 方案2: // 如果https 访问的时候,还是爬å–失败,å¯ä»¥ä»£ç åŠ è½½åŠ¨æ€åº“æ¥æ”¯æŒ // 剿æ¡ä»¶æ˜¯æŠŠ2个dll动æ€åº“æ‹·è´çš„生æˆç›®å½•ä¸:libeay32.dll å’Œ ssleay32.dll // æ‹·è´åˆ°ç”Ÿæˆç›®å½•,就å¯ä»¥ç›´æŽ¥åŠ è½½ // 若是msvc 64bit的编译器,需è¦ä¸‹è½½å¯¹åº”使•°çš„dllåº“æ¥æ‹·è´å³å¯ -- openssl-1.0.2q-x64_86-win64.zip QLibrary lb("libeay32.dll"); if(lb.load()){ qDebug()<<"load libeay32.dll æˆåŠŸ"; } QLibrary lb2("ssleay32.dll"); if(lb2.load()){ qDebug()<<"load ssleay32.dll æˆåŠŸ"; } // æŒ‡å®šå½“å‰æ—¥æœŸç±»åž‹ä¸º week m_dateType = "week"; // åˆå§‹åŒ–回测数é‡ä¸º100 m_maTestNum = 100; // 模型åŠè¡¨æ ¼è§†å›¾ m_model = new QStandardItemModel(this); m_model->setColumnCount(10); // 设置10列 QStringList labels; labels<<"股票åå—"<<"股票代å·"<<"总市值(亿)"<<"æµé€šå¸‚值(亿)"<<"涨跌幅(%)"<<"收盘价"<<"æˆäº¤é¢(亿)"<<"æˆäº¤é‡(手)"<<"æ¢æ‰‹çއ(%)"<<"市盈率"; m_model->setHorizontalHeaderLabels(labels); // è®¾ç½®æ¨¡åž‹çš„åˆ—æ ‡ç¾å m_customModel = new CustomSortProxyModel; m_customModel->setSourceModel(m_model); // è®¾ç½®æºæ¨¡åž‹ //ui->tableView->setModel(m_model); // å°†æ¨¡åž‹å’Œè§†å›¾å…³è” ui->tableView->setModel(m_customModel); // 设置自定义排åºçš„æ¨¡åž‹ ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 设置内容自适应,拉伸 // ç»™è¡¨æ ¼è§†å›¾æ·»åŠ å³å‡»è‡ªå®šä¹‰èœå• ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu); // 设置上下文èœå•ç–略为自定义èœå• connect(ui->tableView,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu())); m_menu = new QMenu(this); QMenu *dateMenu = new QMenu("设置周期"); QAction *m30Action = dateMenu->addAction("设置为30分"); QAction *m60Action = dateMenu->addAction("设置为60分"); QAction *m120Action = dateMenu->addAction("设置为120分"); QAction *dayAction = dateMenu->addAction("设置为日"); QAction *weekAction = dateMenu->addAction("设置为周"); QAction *monthAction = dateMenu->addAction("设置为月"); QAction *yearAction = dateMenu->addAction("设置为年"); m_menu->addMenu(dateMenu); connect(m30Action,&QAction::triggered,this,[&]{ m_dateType = "30m";}); connect(m60Action,&QAction::triggered,this,[&]{ m_dateType = "60m";}); connect(m120Action,&QAction::triggered,this,[&]{ m_dateType = "120m";}); connect(dayAction,&QAction::triggered,this,[&]{ m_dateType = "day";}); connect(weekAction,&QAction::triggered,this,[&]{ m_dateType = "week";}); // 修改日期类型 connect(monthAction,&QAction::triggered,this,[&]{ m_dateType = "month";}); connect(yearAction,&QAction::triggered,this,[&]{ m_dateType = "year";}); QMenu *testMenu = new QMenu("设置回测股票数é‡"); QAction *pre100Action = testMenu->addAction("设置为å‰100"); QAction *pre300Action = testMenu->addAction("设置为å‰300"); QAction *pre500Action = testMenu->addAction("设置为å‰500"); QAction *pre1000Action = testMenu->addAction("设置为å‰1000"); QAction *pre5000Action = testMenu->addAction("设置为å‰5000"); m_menu->addMenu(testMenu); connect(pre100Action,&QAction::triggered,this,[&]{ m_maTestNum = 100;}); // 修改回测数é‡ç±»åž‹ connect(pre300Action,&QAction::triggered,this,[&]{ m_maTestNum = 300;}); connect(pre500Action,&QAction::triggered,this,[&]{ m_maTestNum = 500;}); connect(pre1000Action,&QAction::triggered,this,[&]{ m_maTestNum = 1000;}); connect(pre5000Action,&QAction::triggered,this,[&]{ m_maTestNum = 5000;}); QMenu *timerMenu = new QMenu("设置轮询执行ç–ç•¥"); QAction *timerMultiResonateAction = timerMenu->addAction("轮询多ç–略共振"); m_menu->addMenu(timerMenu); m_pollMultiTimer = new QTimer(this); connect(m_pollMultiTimer,SIGNAL(timeout()),this,SLOT(pollMultiSlot())); connect(timerMultiResonateAction,&QAction::triggered,this,[&] { static int cnt=0; if(cnt % 2 == 0){ m_pollMultiTimer->start(1000*60); qDebug()<<"å¯åŠ¨è½®è¯¢å¤šç–略共振的定时器"; }else{ m_pollMultiTimer->stop(); qDebug()<<"åœæ¢è½®è¯¢å¤šç–略共振ç–ç•¥"; } }); // 轮询多ç–略共振 QAction *policy = m_menu->addAction("ç–略分æž"); QAction *price = m_menu->addAction("æœ€æ–°ä»·æ ¼"); QAction *maPolicy = m_menu->addAction("MAç–ç•¥"); QAction *macdPolicy = m_menu->addAction("MACDç–ç•¥"); QAction *maTest100 = m_menu->addAction("MAç–ç•¥-回测"); QAction *buttomToUpPolicy = m_menu->addAction("底部å转ç–ç•¥"); QAction *multiResonatePolicy = m_menu->addAction("多ç–略共振"); QAction *multiResonateTest100 = m_menu->addAction("多ç–略共振-回测"); QAction *oneUpCrossFourPolicy = m_menu->addAction("一阳穿四线ç–ç•¥"); QAction *oneUpCrossFourTest100 = m_menu->addAction("一阳穿四线ç–ç•¥-回测"); connect(policy,SIGNAL(triggered(bool)),this,SLOT(policySlot())); // 当点击èœå•ç–略分æžä¹‹åŽï¼Œå°±ä¼šå‡ºå‘æ§½ policySlot 函数 connect(price,SIGNAL(triggered(bool)),this,SLOT(priceSlot())); connect(maPolicy,SIGNAL(triggered(bool)),this,SLOT(maPolicySlot())); // MAå‡çº¿ç–ç•¥ connect(macdPolicy,SIGNAL(triggered(bool)),this,SLOT(macdPolicySlot())); // MAå‡çº¿ç–ç•¥ connect(maTest100,SIGNAL(triggered(bool)),this,SLOT(maTest100Slot())); // MA回测å‰100å connect(buttomToUpPolicy,SIGNAL(triggered(bool)),this,SLOT(buttomToUpPolicySlot())); // 底部å转ç–ç•¥ connect(multiResonatePolicy,SIGNAL(triggered(bool)),this,SLOT(multiResonatePolicySlot())); // 多ç–略共振 connect(multiResonateTest100,SIGNAL(triggered(bool)),this,SLOT(multiResonateTest100Slot())); // 多ç–略共振回测 connect(oneUpCrossFourPolicy,SIGNAL(triggered(bool)),this,SLOT(oneUpCrossFourSlot())); // 一阳穿四线ç–ç•¥ connect(oneUpCrossFourTest100,SIGNAL(triggered(bool)),this,SLOT(oneUpCrossFourTest100Slot())); // 一阳穿四线回测 // å¤„ç†æ•°æ®çˆ¬å–çš„æ“作 // 模拟æµè§ˆå™¨çš„傿•° QString userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; m_cookie = "__utma=1.731742638.1647403301.1699341909.1700229030.32; device_id=196eef62baf016c7d95a22752d9bdbab; smidV2=20240414233939e95389ecf7ecd2f4d08524ce770aacd500753aa68e9640320; s=c611de27gr; cookiesu=651726298794778; xq_a_token=220b0abef0fac476d076c9f7a3938b7edac35f48; xqat=220b0abef0fac476d076c9f7a3938b7edac35f48; xq_r_token=1d46f0ed628506486164e5055a4993f9b54b2f4c; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTcyOTIxMjc4NCwiY3RtIjoxNzI3NDkwOTU3MjA0LCJjaWQiOiJkOWQwbjRBWnVwIn0.C_GmKEhTaaioDMLWkgZyMXDl4duYEVmsdJHsTi7gbcNz0Tohc-uxHsaw0yBT5k-qmbrJ_RaLMCSxy06v14-R3dwL-MsiKRHxHa5qvQZN4BjEgvPRkqqvPgE_fkPLte8qQOEgd5iVkhr-4mjip0-9WCeXYiH7DygxFOBXGlgoPtpPzAtOTm5TWJmXh0ipDsIZxfNOl8jipXYaIdkv_kqLul5gqiBi5qqnwONDa24Zx-Kvpm8ySWiPFBLzZBqTuRBs4oKAMpSdOiYGLVL7dcSDDZyWqAexmrN4f19hkmd6gBHL4dCczRMDGYc1e98sQtlbZ5lgeEuuM24jjcuwCxsxXQ; u=651726298794778; Hm_lvt_1db88642e346389874251b5a1eded6e3=1727099939,1727251802,1727488707,1727491020; HMACCOUNT=1628106D67895387; acw_tc=2760828017275244258732552e9880f861be6db0c40facbdd5f223490decc2; acw_sc__v2=66f7ee8290dc3f63112948801ef331b8c97ccb35; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1727524485; .thumbcache_f24b8bbe5a5934237bbc0eda20c1b6e7=t00N841S/BEpxTGOoJrbm0blWik12om0ew/whcq/V2DNtyEA8um7J+yzeGOli+6iP/TrvrH0YKH2kHlsmDb5EQ%3D%3D; ssxmod_itna=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GAqGNK3DZDiqAPGhDC8RzeL4Ko7+e2aeQvSeopd5pYDk0Ge5TB0PIjaIDB3DEx06TCCQxiiSDCeDIDWeDiDG4Gm4qGtDpxG=DjDytZ9TtDm4GWGqDmDGYBWqDgDYQDGwIXD7QDIqtW07tQDDNQKpAKDiYeHlL5uMRMtOrK7DtDjdTD/3+kZCbCcPwVFeFO=nPcDB6wxBjZRq00Un+g4mNqLYf4IDAxQuYKtgheYYoAfDhTKhhLSGx4tGY4+GDKSiMS2DDAIvdKeD; ssxmod_itna2=YqAOBKYve+x0ODfxBcDB4DKM7RtAA4454DkDIEC+GDA69mqD/YttDFhxMltFKApT7bCMH+bytp7GQQyCbBWukeAF3+jxeN2wLjbQAFcdwbeNeoohjQ4qtEnLg4TKyX2LqVL=CGaV=GqZZqbDby8DFnFbgWiZEH8zoBzBCbzqWeqwoPq7/TpL=gIRY8sVhEpnWWHQU8sz+S8=+8oRerHq0wtQnSzyQDK7Dmvr3a+VY7fezRmxKF=bDeqexYUbuuzw2eR3In9evW6tzHbQY6vp=AIOUc9l6vc0vOl9plD6D07zGGQ41uxpii2Y5s7KvYQDWGYExD7=DYKKeD=="; QByteArray cookieByte = m_cookie.toUtf8(); QList<QNetworkCookie> list; list.push_back(QNetworkCookie(cookieByte)); QVariant var; var.setValue(list); // 设置è¦è®¿é—®çš„ç½‘å€ m_request.setUrl(QUrl("https://xueqiu.com/?md5__1038=QqGxcDnDyiitnD05o4%2Br%3Di%3De0KDtYqCDRWOoD")); // 设置请求头,用户代ç†ï¼Œç”¨æ¥æ¨¡æ‹Ÿæµè§ˆå™¨ m_request.setHeader(QNetworkRequest::UserAgentHeader,userAgent); // 设置cookie //m_request.setHeader(QNetworkRequest::CookieHeader, var); // 查看manager都支æŒå“ªäº›åè®® qDebug()<<"支æŒçš„åè®®:"<<m_manager.supportedSchemes(); // å…³è”ä¿¡å·æ§½ï¼Œå½“请求管ç†å¯¹è±¡å®Œå…¨æ‰“开网页之åŽï¼Œä¼šå°†æ•°æ®ç»™æ§½å‡½æ•°å¤„ç† connect(&m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(showAplyData(QNetworkReply*))); on_pushButton_get_clicked(); // è¡¨æ ¼åˆ—æŽ’åº ui->tableView->setSortingEnabled(true); // ui->tableView->setSortingEnabled(false); // ui->tableView->horizontalHeader()->setSortIndicatorShown(false); // connect(ui->tableView->horizontalHeader(),&QHeaderView::sortIndicatorChanged,this,[=](int index,Qt::SortOrder order){ // qDebug()<<"sort:"<<index<<order; // //m_model->sort(index,order); // m_customModel->sort(index,order); // ui->tableView->horizontalHeader()->setSortIndicatorShown(true); // }); // 定时获å–股票代å·çš„定时器相关 m_getCodeTimer = new QTimer(this); connect(m_getCodeTimer,SIGNAL(timeout()),this,SLOT(getCodeSlot())); // 支æŒç¼–è¾‘æ¡†çš„æ¨¡ç³ŠåŒ¹é… m_completer = new QCompleter(this); m_completer->setModel(m_customModel); // å…³è”åŒ…å«æ‰€æœ‰åŒ¹é…内容的模型或者å—符串链表 m_completer->setCaseSensitivity(Qt::CaseInsensitive); // ä¸åŒºåˆ†å¤§å°å†™ m_completer->setCompletionMode(QCompleter::PopupCompletion); // 自动显示下拉框 m_completer->setFilterMode(Qt::MatchContains); // å‰ç¼€åŒ¹é…ã€åŒ…å«ã€åŽç¼€ ui->lineEdit_search->setCompleter(m_completer); // å…³è”匹é…的控件 } GetStockList::~GetStockList() { delete ui; } /* * è¦å¤„ç†çš„å¤§æ¦‚æ ¼å¼å¦‚下 * * {"data":{"count":5000,"list":[{"symbol":"SZ300817","net_profit_cagr":-17.50317062659299,"north_net_inflow":null, * "ps":4.4809,"type":11,"percent":20.03,"has_follow":false,"tick_size":0.01,"pb_ttm":3.2607,"float_shares":99366912, * "current":18.04,"amplitude":24.02,"pcf":21.3128,"current_year_percent":28.25,"float_market_capital":1.792579092E9, * "north_net_inflow_time":null,"market_capital":3.1504802E9,"dividend_yield":1.153,"lot_size":100,"roe_ttm":5.6761589850147, * "total_percent":78.15,"percent5m":0.0,"income_cagr":2.235799161377394,"amount":3.5973639118E8,"chg":3.01, * "issue_date_ts":1581955200000,"eps":0.32,"main_net_inflows":6078207.0,"volume":21355714,"volume_ratio":4.35,"pb":3.143, * "followers":6931,"turnover_rate":21.49,"first_percent":43.98,"name":"åŒé£žè‚¡ä»½","pe_ttm":56.123,"total_shares":174638592, * "limitup_days":1}]}} */ // èŽ·å–æ‰€æœ‰æ²ªæ·±è‚¡ç¥¨çš„ä¿¡æ¯ void GetStockList::getStockAllCode(QByteArray &buffer) { // 使用JSON进行数æ®å¤„ç† QJsonDocument jd = QJsonDocument::fromJson(buffer); if(jd.isArray()){ qDebug()<<"js array"; }else if(jd.isObject()){ qDebug()<<"js object"; QJsonObject jobject = jd.object(); QStringList jlist = jobject.keys(); qDebug()<<"jlist:"<<jlist; // 输出一下一级键的情况 // é€šè¿‡é”®å€¼å¯¹çš„æ–¹å¼æå–æ•°æ® int count = jobject["data"].toObject()["count"].toInt(); qDebug()<<"count:"<<count; QJsonArray listData = jobject["data"].toObject()["list"].toArray(); count = listData.size(); // é€‚åº”æ–°ç‰ˆçš„å¤„ç† for(int i=0;i<count;++i){ QString symbol = listData.at(i).toObject().value("symbol").toString(); // è‚¡ç¥¨ä»£å· QString name = listData.at(i).toObject().value("name").toString(); // 股票åå— double market_capital = listData.at(i).toObject().value("market_capital").toDouble()/100000000; // 总市值 å•ä½ äº¿ double float_market_capital = listData.at(i).toObject().value("float_market_capital").toDouble()/100000000; // æµé€šå¸‚值 å•ä½ äº¿ double percent = listData.at(i).toObject().value("percent").toDouble(); // 涨跌幅 百分比,大于0上涨,å°äºŽ0下跌 double current = listData.at(i).toObject().value("current").toDouble(); // 收盘价 double amount = listData.at(i).toObject().value("amount").toDouble()/100000000; // æˆäº¤é¢ å•ä½ äº¿ double volume = listData.at(i).toObject().value("volume").toInt(); // æˆäº¤é‡ å•ä½ æ‰‹ double turnover_rate = listData.at(i).toObject().value("turnover_rate").toDouble(); // æ¢æ‰‹çއ 百分比 double pe_ttm = listData.at(i).toObject().value("pe_ttm").toDouble(); // PE值 市盈率 百分比 //qDebug()<<name<<symbol<<market_capital; m_codeNames[symbol] = name; // æ·»åŠ æˆ–è¦†ç›–é”®å€¼å¯¹ï¼Œä¿å˜è‚¡ç¥¨ä»£å·å’Œè‚¡ç¥¨åå—到mapä¸ // æ·»åŠ æ¨¡åž‹è¡Œçš„æ•°æ®:股票åå—ã€è‚¡ç¥¨ä»£å· 总市值 æµé€šå¸‚值 涨跌幅 收盘价 æˆäº¤é¢ æˆäº¤é‡ æ¢æ‰‹çއ 市盈率 QList<QStandardItem*> rowItems; rowItems.append(new QStandardItem(name)); rowItems.append(new QStandardItem(symbol)); rowItems.append(new QStandardItem(QString::number(market_capital,'f',2))); rowItems.append(new QStandardItem(QString::number(float_market_capital))); //rowItems.append(new CustomItem(QString::number(float_market_capital))); QStandardItem *percentItem = new QStandardItem(QString::number(percent)); if(percent > 0){ percentItem->setData(QColor("red"),Qt::DecorationRole); // æ·»åŠ ä¸€ä¸ªè£…é¥°çš„é¢œè‰²ä¸ºçº¢è‰² percentItem->setData(QColor("red"),Qt::TextColorRole); // å°†å—体颜色设置为红色 rowItems.at(0)->setData(QColor("red"),Qt::TextColorRole); // 将股票åå—设置为红色 } else if(percent < 0){ percentItem->setData(QColor("green"),Qt::BackgroundColorRole); rowItems.at(0)->setData(QColor("green"),Qt::TextColorRole); } rowItems.append(percentItem); rowItems.append(new QStandardItem(QString::number(current))); rowItems.append(new QStandardItem(QString::number(amount))); rowItems.append(new QStandardItem(QString::number(volume))); rowItems.append(new QStandardItem(QString::number(turnover_rate))); if(pe_ttm > 0){ rowItems.append(new QStandardItem(QString::number(pe_ttm))); } else{ rowItems.append(new QStandardItem("äºæŸ")); } // æ·»åŠ ä¸€è¡Œæ•°æ®é¡¹åˆ°æ¨¡åž‹ä¸ m_model->appendRow(rowItems); } } } /* è¦å¤„ç†çš„å•ä¸ªè‚¡ç¥¨çš„æ ¼å¼å¦‚下 {"data":{" ":"SH601127","column":["timestamp","volume","open","high","low","close","chg","percent","turnoverrate","amount","volume_post","amount_post"], "item":[[1680192000000,592214010,37.57,41.56,35.63,37.85,0.2,0.53,50.63,2.3075281252E10,0,0.0], [1682611200000,355174985,36.6,36.6,28.61,29.52,-8.33,-22.01,27.0,1.1568002446E10,0,0.0], [1685462400000,345031667,29.51,30.1,25.27,25.78,-3.74,-12.67,23.04,9.442101926E9,0,0.0], [1688054400000,1217980960,25.6,42.19,24.75,36.77,10.99,42.63,81.24,4.2515733378E10,0,0.0], [1688572800000,427585117,37.5,47.3,37.06,46.62,9.85,26.79,28.37,1.8368604411E10,0,0.0]]},"error_code":0,"error_description":""} */ // å•个股票的 JSONæ ¼å¼å¤„ç† void GetStockList::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; // è‚¡ç¥¨ä»£å· QLineSeries *series = new QLineSeries; // QLineSeries 折线的类,QSplineSeries 为圆滑曲线类 series->setName(symbol); // 设置折线åå— //series->setColor(QColor(255,0,0)); // 设置颜色 r,g,b 红绿è“ä¸‰åŽŸè‰²ï¼Œéšæ„ç»„åˆ QSplineSeries *sp = new QSplineSeries; sp->setName(symbol); QSplineSeries *spVolume = new QSplineSeries; spVolume->setName(symbol.append("--volume")); QSplineSeries *spAmount = new QSplineSeries; spVolume->setName(symbol.append("--amount")); int ma10_20_flag = 0; // æ ‡è®°MA金å‰ã€æ»å‰çš„æƒ…况 0:åˆå§‹å€¼ï¼Œ1:金å‰ï¼Œ-1:æ»å‰ long long oldVolume = 0; // MACD: è€çš„æˆäº¤é‡ int macd_buy = 0; // ä¹°å…¥æ ‡å¿— double buy_price = 0; // ä¹°å…¥ä»·æ ¼ double rate_all = 0; // 收益百分比 for(int i=0;i<cnt;++i){ qint64 timestamp = jArr.at(i).toArray().at(0).toVariant().toLongLong(); double close = jArr.at(i).toArray().at(5).toVariant().toDouble(); long long volume = jArr.at(i).toArray().at(1).toVariant().toLongLong()/100; long long amount = jArr.at(i).toArray().at(9).toVariant().toLongLong()/100000000; QString curDateTime = QDateTime::fromMSecsSinceEpoch(timestamp).toString("yyyy-MM-dd"); //qDebug()<<curDateTime<<close<<volume<<amount; series->append(timestamp,close); // æŠ˜çº¿æ•°æ®æ·»åŠ sp->append(timestamp,close); // æ›²çº¿æ•°æ®æ·»åŠ spVolume->append(timestamp,volume); spAmount->append(timestamp,amount); if(m_menuIndex == 2){ // MA ma10交ma20 金å‰ï¼Œma10交ma60 æ»å‰ double ma5 = jArr.at(i).toArray().at(12).toVariant().toDouble(); double ma10 = jArr.at(i).toArray().at(13).toVariant().toDouble(); double ma20 = jArr.at(i).toArray().at(14).toVariant().toDouble(); double ma30 = jArr.at(i).toArray().at(15).toVariant().toDouble(); //qDebug()<<"MA5-10-20-30"<<ma5<<ma10<<ma20<<ma30; if(i>0){ double ma5_old = jArr.at(i-1).toArray().at(12).toVariant().toDouble(); double ma10_old = jArr.at(i-1).toArray().at(13).toVariant().toDouble(); double ma20_old = jArr.at(i-1).toArray().at(14).toVariant().toDouble(); double ma30_old = jArr.at(i-1).toArray().at(15).toVariant().toDouble(); // if(ma5_old > ma20_old && ma5 <= ma20){ // // æ»å‰ // qDebug()<<"MA5-20æ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; // }else if(ma5_old < ma20_old && ma5 >= ma20){ // // é‡‘å‰ // qDebug()<<"MA5-20金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; // } if(ma10_old > ma20_old && ma10 <= ma20){ // æ»å‰ qDebug()<<"MA10-20æ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; if(buy_price == 0) buy_price = close; double tmp_rate = (close-buy_price)/buy_price; rate_all += tmp_rate; QString info = QString("<font size=8 color=green> %3 %6 MA10-20æ»å‰:%1 ä»·æ ¼:%2 盈利比:%4 总盈利:%5</font>").arg(curDateTime).arg(close).arg(code) .arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100)).arg(m_codeNames[code]); emit sendInfoMess(info); //buy_price = close; // æ»å‰ä¹°å…¥çš„æƒ…况 }else if(ma10_old < ma20_old && ma10 >= ma20){ // é‡‘å‰ buy_price = close; // 金å‰ä¹°å…¥çš„æƒ…况 qDebug()<<"MA10-20金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; // if(buy_price == 0) buy_price = close; // double tmp_rate = (close-buy_price)/buy_price; // rate_all += tmp_rate; QString info = QString("<font size=8 color=red> %3 %4 MA10-20金å‰:%1 ä»·æ ¼:%2 </font>").arg(curDateTime).arg(close).arg(code).arg(m_codeNames[code]); //.arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100)); emit sendInfoMess(info); } } }else if(m_menuIndex == 3){ // MACDç–ç•¥ ç»“åˆæˆäº¤é‡æ¥åˆ¤æ–会更好:买入点æˆäº¤é‡ç»§ç»æ”¾å¤§åˆ™æŒæœ‰ï¼Œç¼©å°åˆ™ç¦»åœº double dea = jArr.at(i).toArray().at(12).toVariant().toDouble(); double dif = jArr.at(i).toArray().at(13).toVariant().toDouble(); double macd = jArr.at(i).toArray().at(14).toVariant().toDouble(); if(macd_buy == 1 && oldVolume > volume){ QString info = QString("<font size=8 color=green> %4 MACD æˆäº¤é‡åˆæ¬¡è§é¡¶ 离场1:%1 ä»·æ ¼:%2 MACD=%3 </font>").arg(curDateTime).arg(close).arg(macd).arg(code); emit sendInfoMess(info); macd_buy = 0; oldVolume = 0; } if(i > 0){ double dea_old = jArr.at(i-1).toArray().at(12).toVariant().toDouble(); double dif_old = jArr.at(i-1).toArray().at(13).toVariant().toDouble(); double macd_old = jArr.at(i-1).toArray().at(14).toVariant().toDouble(); if(dif_old > dea_old && dif <= dea){ // æ»å‰ qDebug()<<"MACDæ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close <<"MACD="<<macd ; QString info=QString("<font size=8 color=green> %4 MACDæ»å‰:%1 ä»·æ ¼:%2 MACD=%3 </font>").arg(curDateTime).arg(close).arg(macd).arg(code); emit sendInfoMess(info); }else if(dif_old < dea_old && dif >= dea){ // é‡‘å‰ qDebug()<<"MACD金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close <<"MACD="<<macd <<"建议记录当å‰é‡‘å‰MACD的值,若åŽé¢æœ‰ä½ŽäºŽæ¤å€¼ï¼Œå…³æ³¨ç¦»åœºæç¤º"; QString info=QString("<font size=9 color=red> %4 MACD金å‰:%1 ä»·æ ¼:%2 MACD=%3 建议记录当å‰é‡‘å‰MACD的值,若åŽé¢æœ‰ä½ŽäºŽæ¤å€¼ï¼Œå…³æ³¨ç¦»åœºæç¤º </font>").arg(curDateTime).arg(close).arg(macd).arg(code); emit sendInfoMess(info); macd_buy = 1; oldVolume = volume; } } }else if(m_menuIndex == 4){ // 底部å转ç–ç•¥,æå‰çš„æ„ŸçŸ¥çš„æ—¶é—´ä¼šæ›´æ—©ï¼Œå¾—到更好的预判趋势 // qDebug()<<"底部å转ç–ç•¥"; if(i > 0){ double volume_cur = jArr.at(i).toArray().at(1).toDouble(); double volume_old = jArr.at(i-1).toArray().at(1).toDouble(); double volume_rate = volume_cur / volume_old; if(volume_rate > 2){ qDebug()<<"底部å转ç–ç•¥:é‡èƒ½æ¯”"<<volume_rate<<code <<curDateTime<<"ä»·æ ¼:" <<close; QString info = QString("<font size=8 color=red> %4 底部å转ç–ç•¥:é‡èƒ½ æ—¶é—´:%1 ä»·æ ¼:%2 é‡èƒ½æ¯”值=%3 </font>").arg(curDateTime).arg(close).arg(volume_rate).arg(code); emit sendInfoMess(info); } } }else if(m_menuIndex == 5){ // 多ç–略共振:é‡èƒ½ã€MACDã€MAã€BOLL int cnt = 0; // é‡èƒ½ if(i > 0){ double volume_cur = jArr.at(i).toArray().at(1).toDouble(); double volume_old = jArr.at(i-1).toArray().at(1).toDouble(); double volume_rate = volume_cur / volume_old; if(volume_rate > 2){ cnt++; qDebug()<<"多ç–略共振:é‡èƒ½æ¯”"<<volume_rate<<code <<curDateTime<<"ä»·æ ¼:" <<close; QString info = QString("<font size=8 color=red> %4 多ç–略共振:é‡èƒ½ç–ç•¥ æ—¶é—´:%1 ä»·æ ¼:%2 é‡èƒ½æ¯”值=%3 共振值:%5</font>").arg(curDateTime).arg(close).arg(volume_rate).arg(code).arg(cnt); emit sendInfoMess(info); } } // MACDç–ç•¥ ç»“åˆæˆäº¤é‡æ¥åˆ¤æ–会更好:买入点æˆäº¤é‡ç»§ç»æ”¾å¤§åˆ™æŒæœ‰ï¼Œç¼©å°åˆ™ç¦»åœº double dea = jArr.at(i).toArray().at(16).toVariant().toDouble(); double dif = jArr.at(i).toArray().at(17).toVariant().toDouble(); double macd = jArr.at(i).toArray().at(18).toVariant().toDouble(); if(macd_buy == 1 && oldVolume > volume){ QString info = QString("<font size=8 color=green> %4 MACD æˆäº¤é‡åˆæ¬¡è§é¡¶ 离场1:%1 ä»·æ ¼:%2 MACD=%3 </font>").arg(curDateTime).arg(close).arg(macd).arg(code); emit sendInfoMess(info); macd_buy = 0; oldVolume = 0; } if(i > 0){ double dea_old = jArr.at(i-1).toArray().at(16).toVariant().toDouble(); double dif_old = jArr.at(i-1).toArray().at(17).toVariant().toDouble(); double macd_old = jArr.at(i-1).toArray().at(18).toVariant().toDouble(); if(dif_old > dea_old && dif <= dea){ // æ»å‰ qDebug()<<"MACDæ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close <<"MACD="<<macd ; QString info=QString("<font size=8 color=green> %4 MACDæ»å‰:%1 ä»·æ ¼:%2 MACD=%3 </font>").arg(curDateTime).arg(close).arg(macd).arg(code); emit sendInfoMess(info); }else if(dif_old < dea_old && dif >= dea){ // é‡‘å‰ cnt++; qDebug()<<"MACD金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close <<"MACD="<<macd <<"建议记录当å‰é‡‘å‰MACD的值,若åŽé¢æœ‰ä½ŽäºŽæ¤å€¼ï¼Œå…³æ³¨ç¦»åœºæç¤º"; QString info=QString("<font size=9 color=red> %4 MACD金å‰:%1 ä»·æ ¼:%2 MACD=%3 共振值:%5 </font>").arg(curDateTime).arg(close).arg(macd).arg(code).arg(cnt); emit sendInfoMess(info); macd_buy = 1; oldVolume = volume; } } // MA ma10交ma20 金å‰ï¼Œma10交ma60 æ»å‰ double ma5 = jArr.at(i).toArray().at(12).toVariant().toDouble(); double ma10 = jArr.at(i).toArray().at(13).toVariant().toDouble(); double ma20 = jArr.at(i).toArray().at(14).toVariant().toDouble(); double ma30 = jArr.at(i).toArray().at(15).toVariant().toDouble(); //qDebug()<<"MA5-10-20-30"<<ma5<<ma10<<ma20<<ma30; if(i>0){ double ma5_old = jArr.at(i-1).toArray().at(12).toVariant().toDouble(); double ma10_old = jArr.at(i-1).toArray().at(13).toVariant().toDouble(); double ma20_old = jArr.at(i-1).toArray().at(14).toVariant().toDouble(); double ma30_old = jArr.at(i-1).toArray().at(15).toVariant().toDouble(); // if(ma5_old > ma20_old && ma5 <= ma20){ // // æ»å‰ // qDebug()<<"MA5-20æ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; // }else if(ma5_old < ma20_old && ma5 >= ma20){ // // é‡‘å‰ // qDebug()<<"MA5-20金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; // } if(ma10_old > ma20_old && ma10 <= ma20){ // æ»å‰ qDebug()<<"MA10-20æ»å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; if(buy_price == 0) buy_price = close; double tmp_rate = (close-buy_price)/buy_price; rate_all += tmp_rate; QString info = QString("<font size=8 color=green> %3 %6 MA10-20æ»å‰:%1 ä»·æ ¼:%2 盈利比:%4 总盈利:%5</font>").arg(curDateTime).arg(close).arg(code) .arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100)).arg(m_codeNames[code]); emit sendInfoMess(info); //buy_price = close; // æ»å‰ä¹°å…¥çš„æƒ…况 }else if(ma10_old < ma20_old && ma10 >= ma20){ // é‡‘å‰ cnt++; buy_price = close; // 金å‰ä¹°å…¥çš„æƒ…况 qDebug()<<"MA10-20金å‰:"<<curDateTime<<" ä»·æ ¼:"<<close; QString info = QString("<font size=8 color=red> %3 %4 MA10-20金å‰:%1 ä»·æ ¼:%2 共振值:%5 </font>").arg(curDateTime).arg(close).arg(code).arg(m_codeNames[code]).arg(cnt); //.arg(QString::number(tmp_rate*100)).arg(QString::number(rate_all*100)); emit sendInfoMess(info); } } }else if(m_menuIndex == 6){ // 一阳穿四线 double ma5 = jArr.at(i).toArray().at(12).toVariant().toDouble(); double ma10 = jArr.at(i).toArray().at(13).toVariant().toDouble(); double ma20 = jArr.at(i).toArray().at(14).toVariant().toDouble(); double ma30 = jArr.at(i).toArray().at(15).toVariant().toDouble(); double open = jArr.at(i).toArray().at(2).toVariant().toDouble(); long long market_cap = jArr.at(i).toArray().at(22).toVariant().toLongLong(); double volume_rate = 0; if(i > 0){ // 计算é‡èƒ½æ¯” double volume_cur = jArr.at(i).toArray().at(1).toDouble(); double volume_old = jArr.at(i-1).toArray().at(1).toDouble(); volume_rate = volume_cur / volume_old; } if(ma5 >= open && ma10 >= open && ma20 >= open && ma30 >= open && ma5 <= close && ma10 <= close && ma20 <= close && ma30 <= close){ qDebug()<<"一阳穿四线:"<< code <<curDateTime<<" ä»·æ ¼:"<<close << "é‡èƒ½æ¯”:"<<volume_rate; if(volume_rate > 4){ QString info = QString("<font size=8 color=blue> %3 %4 一阳穿四线:%1 ä»·æ ¼:%2 é‡èƒ½æ¯”:%5 周期:%6 市值:%7亿</font>").arg(curDateTime).arg(close).arg(code).arg(m_codeNames[code]).arg(volume_rate) .arg(m_dateType).arg(market_cap/100000000.0); emit sendInfoMess(info); }else{ QString info = QString("<font size=8 color=red> %3 %4 一阳穿四线:%1 ä»·æ ¼:%2 é‡èƒ½æ¯”:%5 周期:%6 市值:%7亿</font>").arg(curDateTime).arg(close).arg(code).arg(m_codeNames[code]).arg(volume_rate) .arg(m_dateType).arg(market_cap/100000000.0); emit sendInfoMess(info); } } } } if(m_menuIndex == 0){ // ç–ç•¥åˆ†æž åªèƒ½é€‰ä¸€ç§çº¿å½¢æ•°æ® //emit sendChartData(series); // å‘é€æŠ˜çº¿æ•°æ® emit sendChartData(sp); // å‘逿›²çº¿æ•°æ® 收盘价 emit sendChartData(spVolume); // å‘é€äº¤æ˜“釿›²çº¿ emit sendChartData(spAmount); // äº¤æ˜“é¢æ›²çº¿ }else if(m_menuIndex == 1){ // æœ€æ–°ä»·æ ¼ }else if(m_menuIndex == 2){ // MAç–ç•¥ }else if(m_menuIndex == 3){ // MACDç–ç•¥ } } } /* 获å–è¡Œä¸šä¿¡æ¯ * * {"data":{"industries":[{"encode":"S1101","name":"ç§æ¤ä¸š","pinyin":"zzy"}, * {"encode":"S1102","name":"渔业","pinyin":"yy"},{"encode":"S1103","name":"林业","pinyin":"ly"}, * {"encode":"S1104","name":"饲料","pinyin":"sl"},{"encode":"S1105","name":"农产å“åŠ å·¥","pinyin":"ncpjg"}, * {"encode":"S1107","name":"养殖业","pinyin":"yzy"},{"encode":"S1108","name":"动物ä¿å¥","pinyin":"dwbj"}, * {"encode":"S1109","name":"农业综åˆ","pinyin":"nyzh"},{"encode":"S2202","name":"化å¦åŽŸæ–™","pinyin":"hxyl"}, * {"encode":"S2203","name":"化å¦åˆ¶å“","pinyin":"hxzp"},{"encode":"S2204","name":"化å¦çº¤ç»´","pinyin":"hxxw" * */ void GetStockList::getIndustryInfo(QByteArray &buffer) { QJsonDocument jd = QJsonDocument::fromJson(buffer); if(jd.isObject()){ QJsonObject jObject = jd.object(); QJsonArray jArr = jObject.value("data").toObject().value("industries").toArray(); // 通过键值对å–值 int cnt = jArr.count(); for(int i=0;i<cnt;++i){ QJsonObject tmpObj = jArr[i].toObject(); QString encode = tmpObj.value("encode").toString(); QString name = tmpObj.value("name").toString(); qDebug()<<encode<<name; m_industryInfo[encode] = name; // æ·»åŠ åˆ°è¡Œä¸šmap里é¢åŽ»ä¿å˜ // 接ç€é历所有行业拥有的对应股票 m_curIndustry = encode; // 设置当å‰è¡Œä¸š QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=100&order=desc&order_by=percent&market=CN&ind_code=%1").arg(encode); m_request.setUrl(url); m_manager.get(m_request); } } } /* {"data":{"count":21,"list":[{"symbol":"SZ000995","net_profit_cagr":92.61556393554986, "north_net_inflow":null,"ps":19.4318,"type":11,"percent":1.86,"has_follow":false, "tick_size":0.01,"pb_ttm":20.688,"float_shares":177408000,"current":16.95, "amplitude":8.65,"pcf":534.2042,"current_year_percent":2.73,"float_market_capital":3.0070656E9, "north_net_inflow_time":null,"market_capital":3.0070656E9,"dividend_yield":null,"lot_size":100, "roe_ttm":2.8913250918407045,"total_percent":90.46,"percent5m":0.53,"income_cagr":19.383233238212405, "amount":5.4679898205E8,"chg":0.31,"issue_date_ts":965577600000,"eps":0.02,"main_net_inflows":-9917325.0, "volume":32611719,"volume_ratio":1.31,"pb":20.688,"followers":46602,"turnover_rate":18.38,"mapping_quote_current":null, "first_percent":99.74,"name":"皇å°é…’业","pe_ttm":731.576,"dual_counter_mapping_symbol":null,"total_shares":177408000,"limitup_days":0}, */ void GetStockList::getStockByIndustry(QByteArray &buffer,QString industryCode) { // 通过行业获å–è‚¡ç¥¨ä¿¡æ¯ static int sAllCnt = 0; QJsonDocument jd = QJsonDocument::fromJson(buffer); if(jd.isObject()){ QJsonObject jObject = jd.object(); QJsonArray jArr = jObject.value("data").toObject().value("list").toArray(); // 通过键值对å–值 int allCnt = jObject.value("data").toObject().value("count").toInt(); sAllCnt += allCnt; int cnt = jArr.count(); qDebug()<<"行业:"<<industryCode<<m_industryInfo[industryCode]<<"allCnt:"<<allCnt<<"pageCnt:"<<cnt; for(int i=0;i<cnt;++i){ QString symbol = jArr[i].toObject().value("symbol").toString(); QString name = jArr[i].toObject().value("name").toString(); m_codeAndIndustry[symbol].append(m_industryInfo[industryCode]); // æ·»åŠ è¡Œä¸šåˆ°å¯¹åº”map qDebug()<<"股票:"<<symbol<<name<<industryCode; } } qDebug()<<"行业统计到的股票sAllCnt"<<sAllCnt; } void GetStockList::on_pushButton_get_clicked() { qDebug()<<"开始请求"; m_manager.get(m_request); qDebug()<<"请求ä¸..."; } void GetStockList::showAplyData(QNetworkReply *reply) { qDebug()<<"收到å“应"; // å°†å“应的数æ®ï¼Œä¸€æŠŠè¯»å–完,放到å—èŠ‚æ•°ç»„é‡Œé¢æ¥å¤„ç† QByteArray buffer = reply->readAll(); // 将数æ®å†™åˆ°æ–‡ä»¶ä¸ï¼Œæ–¹ä¾¿è§‚察数æ®å†…容 QFile file("data.txt"); file.open(QIODevice::ReadWrite | QIODevice::Text); QTextStream out(&file); out << buffer << endl; file.close(); // 下é¢ä½¿ç”¨JSON进行数æ®å¤„ç† if(reply->url() == QUrl("https://xueqiu.com/")){ qDebug()<<"å‘现首页url"; qDebug()<<buffer; }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/chart/kline.json") != -1){ qDebug()<<"查看个股情况:"; 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(); QString industryCode = reply->url().toString().split("=").back(); qDebug()<<"行业信æ¯:"<<industryCode; getStockByIndustry(buffer,industryCode); }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/quote/list.json") != -1){ qDebug()<<"èŽ·å–æ‰€æœ‰æ²ªæ·±è‚¡ç¥¨ å¯ä»¥å¹²æ´»äº†"; getStockAllCode(buffer); }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/industries.json") != -1){ qDebug()<<"获å–行业信æ¯"; getIndustryInfo(buffer); } reply->deleteLater(); } void GetStockList::on_pushButton_get_2_clicked() { m_model->setRowCount(0); // æ¸…é™¤å½“å‰æ¨¡åž‹ä¸çš„内容 // 最好输出一下所有股票åŠè¡Œä¸šä¿¡æ¯ qDebug()<<"一把能看到的股票数é‡"<<m_codeAndIndustry.size(); for(auto it = m_codeAndIndustry.begin();it != m_codeAndIndustry.end();++it){ qDebug()<<it.key()<<"所属行业数é‡:"<<it.value().size(); for(auto e:it.value()){ qDebug()<<e; } } // // 设置è¦çˆ¬å–çš„æ ¸å¿ƒç½‘å€ // m_request.setUrl(QUrl("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=5000&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz")); // // 执行get请求,去拿网å€å¯¹åº”çš„æ•°æ® // m_manager.get(m_request); // qDebug()<<"req ok"; // 2024-9-21 修改新版,官方åšäº†æ•°é‡é™åˆ¶ï¼Œå¯ä»¥å•页100æ¡ï¼Œä½†æ˜¯ä¸èƒ½ä¸€æŠŠå–所有了 //m_request.setHeader(QNetworkRequest::CookieHeader,m_cookie); //m_request.setHeader(QNetworkRequest::SetCookieHeader,m_cookie); int allCnt = 6000; int singlePageCnt = 90; // å•é¡µè‚¡ç¥¨çš„è‚¡ç¥¨æ•°é‡ int pages = allCnt/singlePageCnt; qDebug()<<"请求股票代å·:"<<QTime::currentTime(); for(int i=1;i<=pages;++i){ QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=%1&size=%2&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz").arg(i).arg(singlePageCnt); m_request.setUrl(QUrl(url)); m_manager.get(m_request); } qDebug()<<"OK--完æˆè¯·æ±‚股票代å·:"<<QTime::currentTime(); // 使用定时器æ¥å®šæ—¶èŽ·å– // m_getCodeTimer->start(10); } void GetStockList::showMenu() { qDebug()<<"å³å‡»èœå•"; m_menu->popup(QCursor::pos()); // åœ¨é¼ æ ‡å…‰æ ‡çš„ä½ç½®å¼¹å‡ºèœå• } void GetStockList::policySlot() { qDebug()<<"ç–略查看"; if(m_model->rowCount() == 0)return; // 防æ¢å¼‚常 int row = ui->tableView->currentIndex().row(); // å–出èœå•æ‰€åœ¨çš„è¡Œå· // QString symbol = m_model->item(row,1)->text(); // å–当å‰è¡Œæ‰€åœ¨çš„è‚¡ç¥¨ä»£å· QString symbol = m_customModel->data(m_customModel->index(row,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ m_numsCnt = 30; // 这里是设置获å–å•个股票的数æ®é‡ QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=week&type=before&count=-%3&indicator=kline").arg(symbol).arg(begin).arg(m_numsCnt); qDebug()<<urlStr; // qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_model->item(row,0)->text(); qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(row,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 0; // 第一个èœå• m_request.setUrl(QUrl(urlStr)); // è®¾ç½®æ–°çš„ç½‘å€ m_manager.get(m_request); // 打开网å€ï¼Œæ‹¿æ•°æ® } void GetStockList::priceSlot() { qDebug()<<"æœ€æ–°ä»·æ ¼"; if(m_model->rowCount() == 0)return; int row = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(row,1)->text(); // å–当å‰è¡Œæ‰€åœ¨çš„è‚¡ç¥¨ä»£å· QString symbol = m_customModel->data(m_customModel->index(row,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 20; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=day&type=before&count=-%3&indicator=kline").arg(symbol).arg(begin).arg(numsCnt); qDebug()<<urlStr; // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 1; // 第二个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::maPolicySlot() { qDebug()<<"执行MAç–ç•¥"; emit sendInfoMess("<font size=12 color=pink>执行MAç–ç•¥ </font>"); int curRow = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(curRow,1)->text(); QString symbol = m_customModel->data(m_customModel->index(curRow,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 300; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%4&type=before&count=-%3&indicator=kline,ma").arg(symbol).arg(begin).arg(numsCnt).arg(m_dateType); qDebug()<<urlStr; // qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_model->item(curRow,0)->text(); qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(curRow,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 2; // 第三个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::maTest100Slot() { // for(int i=0;i<m_model->rowCount() && i < m_maTestNum;++i){ // ui->tableView->setCurrentIndex(m_model->index(i,0)); // 设置当å‰è¡¨æ ¼ç´¢å¼•ï¼Œä¸»è¦æ˜¯ä¸ºäº†è®¾ç½®è¡Œ // maPolicySlot(); // 调用MAç–略去回测 // } for(int i=0;i<m_customModel->rowCount() && i < m_maTestNum;++i){ ui->tableView->setCurrentIndex(m_customModel->index(i,0)); // 设置当å‰è¡¨æ ¼ç´¢å¼•ï¼Œä¸»è¦æ˜¯ä¸ºäº†è®¾ç½®è¡Œ maPolicySlot(); // 调用MAç–略去回测 } } void GetStockList::multiResonateTest100Slot() { for(int i=0;i<m_customModel->rowCount() && i < m_maTestNum;++i){ ui->tableView->setCurrentIndex(m_customModel->index(i,0)); // 设置当å‰è¡¨æ ¼ç´¢å¼•ï¼Œä¸»è¦æ˜¯ä¸ºäº†è®¾ç½®è¡Œ multiResonatePolicySlot(); // 调用多ç–略共振ç–略去回测 } } void GetStockList::macdPolicySlot() { qDebug()<<"执行MACDç–ç•¥"; emit sendInfoMess("<font size=12 color=pink>执行MACDç–ç•¥ </font>"); int curRow = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(curRow,1)->text(); QString symbol = m_customModel->data(m_customModel->index(curRow,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 300; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=week&type=before&count=-%3&indicator=kline,macd").arg(symbol).arg(begin).arg(numsCnt); qDebug()<<urlStr; qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(curRow,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 3; // 第四个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::buttomToUpPolicySlot() { /* å¤ç›˜ä¹‹å‰çš„æœˆçº¿çªç ´æƒ…况,放é‡ä¸Šæ¶¨ï¼Œ5å€å·¦å³ï¼Œå¹¶ä¸”在60æ—¥å‡çº¿ä¸Šå†²é«˜ï¼Œä¸å›žè½ï¼Œå¤§æ¦‚率å¯ä»¥ç»§ç»å†² 关注好冲的形æ€ï¼ŒåŠ ä¸Šå¾ˆå¥½çš„æ¢æ‰‹çއ80%+,甚至100%+ï¼Œè¯´æ˜Žå……åˆ†æ¢æ‰‹äº†ï¼Œçªç ´ä¼šæ›´å¥½ï¼Œæœ‰å°±ä¼šèµšå¤šå€ 并且多日查看,比例值一直在放大,说明很é 谱,就是有一个数值比例的爬å‡è¿‡ç¨‹ï¼Œé‚£å°±å¯ä»¥é‡ä»“ä¹°å…¥ç‰æ”¶ç›Šäº†ï¼Œå¯ä»¥ç»˜åˆ¶ä¸€æ¡æ›²çº¿æ¥è§‚察情况 */ qDebug()<<"执行底部å转ç–ç•¥"; emit sendInfoMess("<font size=12 color=pink>执行底部å转ç–ç•¥ </font>"); int curRow = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(curRow,1)->text(); QString symbol = m_customModel->data(m_customModel->index(curRow,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 300; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%4&type=before&count=-%3&indicator=kline,macd").arg(symbol).arg(begin).arg(numsCnt).arg(m_dateType); qDebug()<<urlStr; qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(curRow,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 4; // 第五个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::multiResonatePolicySlot() { qDebug()<<"多ç–略共振:é‡èƒ½ã€MACDã€MAã€BOLL"; emit sendInfoMess("<font size=12 color=pink>执行多ç–略共振 </font>"); int curRow = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(curRow,1)->text(); QString symbol = m_customModel->data(m_customModel->index(curRow,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 200; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%4&type=before&count=-%3&indicator=kline,macd,ma,boll").arg(symbol).arg(begin).arg(numsCnt).arg(m_dateType); qDebug()<<urlStr; qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(curRow,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 5; // 第å…个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::oneUpCrossFourSlot() { /* 一阳穿四线 K线出现了大阳线并且贯穿4æ¡å‡çº¿ï¼Œè¯´æ˜Žåœ¨çŒ›æ¶¨äº†ï¼Œå¹¶ä¸”é‡èƒ½ä¹Ÿè·Ÿä¸Šçš„è¯ï¼Œå°±è¯´æ˜Žå¼ºåв æ—¥Kã€å‘¨Kã€æœˆK就很明显。 å¤§è¶‹åŠ¿ä»¥å‘¨ã€æœˆä¸ºä¸»ï¼Œé€‚åˆä¸é•¿çº¿å¤„ç† --------------------------- 也éžå¸¸é€‚åˆè¶…çŸçº¿çš„处ç†ï¼Œ30分ã€60分ã€120分的大穿阳线也很明显 --------------------------- 就是开盘价和收盘价包å«äº†ä¸€ä¸ªåŒºé—´ï¼Œè¿™ä¸ªåŒºé—´å†…都把Ma5 Ma10 Ma20 Ma30给包ä½äº†ï¼Œè¯´æ˜Žè§¦å‘了一阳穿四线 */ qDebug()<<"一阳穿四线ç–ç•¥"; emit sendInfoMess("<font size=12 color=pink>执行一阳穿四线ç–ç•¥ </font>"); int curRow = ui->tableView->currentIndex().row(); // QString symbol = m_model->item(curRow,1)->text(); QString symbol = m_customModel->data(m_customModel->index(curRow,1)).toString(); qint64 begin = QDateTime::currentMSecsSinceEpoch(); // å–当剿—¶é—´æˆ³ int numsCnt = 200; QString urlStr = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%4&type=before&count=-%3&indicator=kline,macd,ma,boll,market_capital").arg(symbol).arg(begin).arg(numsCnt).arg(m_dateType); qDebug()<<urlStr; qDebug()<<"当å‰è‚¡ç¥¨:"<<symbol<<m_customModel->data(m_customModel->index(curRow,0)).toString(); // 下一æ¥å°±æ˜¯æ ¹æ®url请求到的数æ®ï¼Œè¿›è¡Œåˆ†æž m_menuIndex = 6; // 第七个èœå•项 m_request.setUrl(QUrl(urlStr)); m_manager.get(m_request); } void GetStockList::oneUpCrossFourTest100Slot() { for(int i=0;i<m_customModel->rowCount() && i < m_maTestNum;++i){ ui->tableView->setCurrentIndex(m_customModel->index(i,0)); // 设置当å‰è¡¨æ ¼ç´¢å¼•ï¼Œä¸»è¦æ˜¯ä¸ºäº†è®¾ç½®è¡Œ oneUpCrossFourSlot(); // 调用一阳穿四线去回测 } } void GetStockList::getCodeSlot() { // 2024-9-21 修改新版,官方åšäº†æ•°é‡é™åˆ¶ï¼Œå¯ä»¥å•页100æ¡ï¼Œä½†æ˜¯ä¸èƒ½ä¸€æŠŠå–所有了 static int allCnt = 6000; static int pages = allCnt/100; static int i=1; QString url = QString("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=%1&size=100&order=desc&orderby=amount&order_by=amount&market=CN&type=sh_sz").arg(i); m_request.setUrl(QUrl(url)); m_manager.get(m_request); ++i; if(i > pages){ i=1; m_getCodeTimer->stop(); // åœæŽ‰å®šæ—¶å™¨ } } void GetStockList::pollMultiSlot() { multiResonateTest100Slot(); // 多ç–略共振回测 } void GetStockList::on_pushButton_industry_clicked() { // 获å–行业信æ¯ï¼Œèƒ½æ‹¿åˆ° 行业代ç å’Œåå—ï¼Œç®€å†™ç‰ QString url = "https://stock.xueqiu.com/v5/stock/screener/industries.json?category=cn"; m_request.setUrl(QUrl(url)); m_manager.get(m_request); } void GetStockList::getLastClosePrice(QString name) { for(int i=0;i<m_model->rowCount();++i){ if(m_model->item(i,0)->text() == name){ QString closePrice = m_model->item(i,5)->text(); emit sendClosePrice(name,closePrice); } } } void GetStockList::on_pushButton_filterCap_clicked() { double begin = ui->lineEdit_beginCap->text().toDouble(); double end = ui->lineEdit_endCap->text().toDouble(); int rows = m_customModel->rowCount(); for(int i=rows - 1;i > 0;--i){ double allCap = m_customModel->data(m_customModel->index(i,2)).toDouble(); if( allCap < begin || allCap > end){ m_customModel->removeRow(i); } } } void GetStockList::on_pushButton_search_clicked() { ui->tableView->clearSelection(); QString condition = ui->lineEdit_search->text(); for(int i =0;i<m_customModel->rowCount();++i){ if(m_customModel->data(m_customModel->index(i,0)).toString() == condition || m_customModel->data(m_customModel->index(i,1)).toString() == condition) { //ui->tableView->setCurrentIndex(m_customModel->index(i,0)); ui->tableView->selectRow(i); break; } } } void GetStockList::on_lineEdit_search_returnPressed() { on_pushButton_search_clicked(); }