之前用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);">此调试用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();
}
指数、板块等相关信息在调试中已屏蔽,需要用的可自行修改。有过类似经验的友友留言交流指导,谢谢!