抓取股票软件,炒股软件数据抓取

  

  之前用MFC写过股票相关的小工具,但是shm.tnf(上交所)szm.tnf(深交所)的文件格式总是比较混乱,看不清相关代码和名称,还要手动导出更新,很麻烦。   

  

  周末无聊,又在网上搜了一遍相关资料,还是没看懂具体的数据格式,不过已经可以读出想要的信息了。我把网上找到的数据格式信息贴出来如下,供参考:   

  

  Shm.tnf文件格式   

  

  TFileHelisting _ Tnf=pair conditionerked记录   

  

  IP:后部认可[0.39]的char///- IP地址   

  

  未知:字;//-未知   

  

  ddined:整数;//-日期   

  

  time:整数;//-时间   

  

  结束;   

  

  pfilehelisting _ stock=^tfilehelisting_tnf;   

  

  TD found ATA record _ Tnf=pair conditionerked记录   

  

  股票代码:后方认可[0.8]的char//-股票代码   

  

  Unknown1:字节;//-未知   

  

  未知2:字;//-未知   

  

  未知3:单;//-代码未知   

  

  Unknown4:整数;//-未知   

  

  Unknown5:整数;//-未知   

  

  StockNwseeing ase:后部认可[0.17]的char//-股票名称   

  

  Unknown6:整数;//-未知   

  

  未知7:后部认可[0.185]的char//-未知   

  

  l见astClose:单;//昨天的收盘价   

  

  未知8:字节;//-未知   

  

  Unknown9:整数;//-未知   

  

  StockNwseeing aseSX:后部认可[0.8]的char//-姓名缩写   

  

  有需要的朋友可以直接参考下面的代码读出相关信息。上面的数据格式已经多次尝试定义结构类型,但结果都无法准确读出。最后,我们不得不放弃定义结构。网上有很多资料提到了现在的shm.tnf前50个字节是文件相关信息,先偏移50,然后一个信息点就是314个字节。经过多次尝试,编码是314的前9个字节,名字是23开始的18个字节,缩写是285开始的9个字节。或者有问题,输出如下。   

ge/tos-cn-i-qvj2lq49k0/2d2d9bbf329d4787a3c539e7ded96918" img_width="500" img_height="1012" inline="0" alt="C++读取通达信shm.tnf文件股票代码/名称" onerror="javascript:errorimg.call(this);">

shm.tnf

此调试用VS2017 C++编写,建立一个空项目,直接把内容贴到.cpp文件中即可。注:请自行修正文件路径,本机为string path = "D:\\new_tdx\\T0002\\hq_cache\\shm.tnf",对应修改此处。

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

void test()

{

string path = "D:\\new_tdx\\T0002\\hq_cache\\shm.tnf";

fstream ifs(path, ios::in | ios::binary);

ifs.seekg(50);

char buf[314];

int nSh = 0;

int nKcB = 0;

cout << path << endl;

cout << "------------------------------------------------------" << endl;

//输出表头

cout << "序 号" << "\t股票代码" << "\t股票名称" << "\t名称缩写" << endl;

cout << "------------------------------------------------------" << endl;

while (!ifs.eof())

{

ifs.read(buf, sizeof(buf));

string strTwo(buf, 2);

string symbol(buf, 0, 6);

string name(buf + 23, 18);

string mcsx(buf + 285, 9);

if (strTwo == "60" | strTwo == "68" )

{

if(strTwo == "60")

nSh++;

else nKcB++;

cout << nSh + nKcB << "\t" << symbol << "\t\t" << name << "\t" << mcsx << endl;

}

//memset(buf, 0, sizeof(buf));

}

cout << "------------------------------------------------------" << endl;

cout << "沪市A股不含科创板:" << nSh << "只" << endl;

cout << "沪市A股科创板:" << nKcB << "只" << endl;

cout << "沪市A股合计:" << nSh + nKcB << "只" << endl;

ifs.close();

}

int main()

{

test();

}

指数、板块等相关信息在调试中已屏蔽,需要用的可自行修改。有过类似经验的友友留言交流指导,谢谢!

相关文章