在量化计算中,经常需要取得类似最新的股票代码表等相关的股票信息。虽然可以网络上可以很容易获得这些信息,但当处于离线或网络状况不佳状态时,我们可以从诸如通达信,同花顺,大智慧终端之类的本地数据中获得此类信息。
数据文件
一般通达信的股票代码文件,位于"通达信软件的安装目录/T0002/hq_cache/"下。由 shm.tnf 沪市股票信息和 szm.tnf深市股票信息 两个文件。其中包括了在相应市场上的所有交易产品的代码和名称(股票AB,指数,基金等)。每个文件中的信息条目超过2万。
文件格式
数据文件是二进制字节格式,由文件头和数据体构成。
-- 文件头:包含 50 个Byte,其中
[ 0:40] -> 40个Byte,IPv4地址,记录软件最后登陆的行情主站IP地址,不足的字节由"\x00"填充,以"\x01'"结束;
[40:42] -> 2个Byte,端口号;
[42:46] -> 4个Byte,日期(YYYYMMDD);
[46:50] -> 4个Byte,时间(Hmmss);
-- 数据体:每个股票信息记录在 314 个Byte的数据块内,其中
[ 0: 6] -> 6个Byte,股票代码;
[23:41] -> 18个Byte,股票名称,不足的字节由"\x00"填充;
[276:280] -> 4个Byte,昨收盘价;
[285:293] -> 4个Byte,股票名称拼音字头
上图是程序界面
Private Sub Command1_Click()
On Error GoTo zyp
Dim hFile As Long
Dim temp(100) As Byte
Dim dddtemp As SECURITY_ATTRIBUTES
Dim dwRet, count, ngg, leibie As Integer
For ii = 0 To 1
tdx_mc = Text1(ii).Text
hFile = CreateFile(tdx_mc, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, dddtemp, OPEN_EXISTING, 0, 0)
If hFile = -1 Then
MsgBox "打开文件失败"
End If
'转到正式文件位置
SetFilePointer hFile, 50, 0, 0
'读取个数
ReadFile hFile, temp(0), 2, dwRet, 0
'最终的结构体,储存所有信息的
'Dim bk As WENJIAN
'wj.nBanKuai = CInt(temp(0)) + CInt(temp(1)) * 256
'count = wj.nBanKuai
'定义动态数组
'ReDim wj.bBanKuai(count) As BANKUAI
'循环读取板块
List1.Clear
cou = FileLen(tdx_mc) \ 314
Dim bk As BANKUAI
If InStr(tdx_mc, "shm") > 0 Then ibeg = 19000
If InStr(tdx_mc, "szm") > 0 Then ibeg = 500
For I = 0 To cou '读取板块名
Dim aa(6) As Byte
ReadFile hFile, aa(0), 7, dwRet, 0
bk.sDm = ByteToStr(aa)
SetFilePointer hFile, 50 + 23 + 314 * (I), 0, 0
ReadFile hFile, temp(0), 18, dwRet, 0
bk.sMc = ByteToStr(temp)
Debug.Print I & vbTab & bk.sDm & vbTab & bk.sMc
SetFilePointer hFile, 50 + 314 * (I + 1), 0, 0
If Left(bk.sDm, 2) = "30" Or Left(bk.sDm, 2) = "00" Then
List1.AddItem I & vbTab & bk.sDm & vbTab & bk.sMc
End If
Next
CloseHandle hFile
Next ii
'Text1.Text = Text1.Text + "读取完成"
'显示在界面上
zyp:
If Err.Number <> 0 Then MsgBox Err.Description
End Sub
Private Sub Command2_Click()
Me.CommonDialog1.InitDir = "D:\tdx"
Me.CommonDialog1.FileName = ""
Me.CommonDialog1.Filter = "txt (*.tnf)|*.tnf|All Files(*.*)|*.*"
Me.CommonDialog1.ShowOpen
If CommonDialog1.FileName <> " " Then
Text1(0) = Me.CommonDialog1.FileName
End If
End Sub
Private Sub Command3_Click()
Me.CommonDialog1.InitDir = "D:\tdx"
Me.CommonDialog1.FileName = ""
Me.CommonDialog1.Filter = "txt (*.tnf)|*.tnf|All Files(*.*)|*.*"
Me.CommonDialog1.ShowOpen
If CommonDialog1.FileName <> " " Then
Text1(1) = Me.CommonDialog1.FileName
End If
End Sub