通达信电脑版怎么添加自选股票?_通达信自动交易解决方案

(64) 2024-07-31 11:01:01

说明

在量化计算中,经常需要取得类似最新的股票代码表等相关的股票信息。虽然可以网络上可以很容易获得这些信息,但当处于离线或网络状况不佳状态时,我们可以从诸如通达信,同花顺,大智慧终端之类的本地数据中获得此类信息。
 

(一) 读取股票代码

  • 数据文件
    一般通达信的股票代码文件,位于"通达信软件的安装目录/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,股票名称拼音字头

通达信电脑版怎么添加自选股票?_通达信自动交易解决方案 (https://mushiming.com/)  第1张

 上图是程序界面

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

THE END

发表回复