向钱赚文章转发:在Excel中导入投资基金即时行情

来源:百度文库 编辑:中财网 时间:2024/03/29 05:48:50

对于封闭式投资基金来说,基金的折价率、增长率和净值相对而言是确定其投资价值的重要依据。

因此,笔者用Excel做了一张专门用于分析投资基金的图表,如下图:



图一

但由于证券的时效性,在使用中,不时需要从核新天网网上股票交易分析系统中读取基金的当前价格,然后再填入到分析系统相应的单元格中。反复的手工操作让笔者不胜其烦,而且存在时效性差、工作量大、容易出错等多方面的缺点,故而笔者想到,如果能用程序从核新天网的行情数据中提取即时行情到Excel单元格中,问题不就可以解决了吗?

目标已经明确,让我们现在就开始吧!

第一步,找到记录即时行情的数据库

通过分析比较,可以认定核新天网的即时行情数据库保存在其安装目录(笔者的系统中为”c:program fileshexin”)dat子目录下,并依据沪深两市分为两个数据库,沪市为shnow.dat,深市为sznow.dat

第二步,分析它的数据结构

UltraEdit打开数据库,发现其每个记录的长度相等,为94个字节,并且每个记录是以空值(00H)开头的,结构如下表所示:


起始地址   代表内容   记录长度   数据类型
 
00H        
分隔记录      1   
01H        股票名称      9        字符型
0AH        股票代码      6        字符型
10H        前收盘        4        长整型
14H        开盘价        4        长整型
18H        最高价        4        长整型
1CH        最低价        4        长整型
20H        成交价        4        长整型
24H        总手          4        长整型
28H        成交额        4        长整型
2CH        买一价        4        长整型
30H        买一量        4        长整型
34H        买二价        4        长整型
38H        买二量        4        长整型
3CH        买三价        4        长整型
40H        买三量        4        长整型
44H        卖一价        4        长整型
48H        卖一量        4        长整型
4CH        卖二价        4        长整型
50H        卖二量        4        长整型
54H        卖三价        4        长整型
58H        卖三量        4        长整型
5CH        其它          2

值得注意的是,以上有关价格、金额的字段除了成交额一项以元为单位计算,其余的计量单位都是厘,也就是一分钱的十分之一;买卖量、总手数则是以0.01手为单位,也就是以股为单位计算。

有了以上的基础,我们再进行第三步:通过编程找出需要的数据

因为Excel软件中集成了VBA(Visual Basic for Applications),完全可以满足们的编程需要,故而笔者使用它并通过API的调用扩展其功能,使程序可以自动搜索系统中核新天网或其兼容程序的安装目录和其数据库所在位置,提高了程序的通用性和可用性。

现在,让我们执行Excel程序,建立如图一所示的工作表,并把这张表命名为投资基金分析。如果不会命名的话,请参考Excel帮助中的重命名工作表。这里,笔者必须提醒大家:图一的表中,除了CFGH列,其它数据可得自己填喔。不知道基金每周的净值吗?没关系,上网在易富网站或是中国证券报的网站上查找,网址分别是:http://www.eefoo.com/fund/  http://www.cs.com.cn/csnews/tzjj.htm

好了,现在我们进行我们的VBA之旅吧。

Excel菜单下(笔者用的是Excel 2000,使用其它版本的Excel,可能会和笔者的操作有所差异),找到工具一项,再选择其下子菜单中的“Visual Basic编辑器,这样Microsoft Visual Basic的编辑界面就出现在我们的面前了。选择其菜单中的插入一项,并选择其中的模块,而后在该模块中键入如下代码:

Declare Function GetWindowsDirectory Lib "kernel32"_

Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String,_

ByVal nSize As Long) As Long

Declare Function GetPrivateProfileString Lib "kernel32"_

Alias "GetPrivateProfileStringA" (ByVal lpApplicationName_

As String, ByVal lpKeyName As Any, ByVal lpDefault As String,_

ByVal lpReturnedString As String, ByVal nSize As Long,_

ByVal lpFileName As String) As Long

Type Record_Price    ' 
定义用户自定义数据类型。

    Separator_1 As String * 1

    
股票名称 As String * 9

    股票代码 As String * 6

    前收盘 As Long            '昨天的收盘价

    开盘价 As Long

    最高价 As Long

    最低价 As Long

    成交价 As Long

    总手数 As Long

    成交额 As Long

    买一价 As Long

    买一量 As Long

    买二价 As Long

    买二量 As Long

    买三价 As Long

    买三量 As Long

    卖一价 As Long

    卖一量 As Long

    卖二价 As Long

    卖二量 As Long

    卖三价 As Long

    卖三量 As Long

    Separator_2 As String * 2

End Type

Dim MyRecord As Record_Price

 

Sub Distill()   '
从核新天网中提取即时行情

   '以下程序段获得Windows目录

   Dim strWinPath As String

   Dim lngWinPath As Long

  

   strWinPath = String(144, vbNullChar)   ' 
使用空字符填充字符串。

   lngWinPath = Len(strWinPath)           ' 获得字符串的长度。

   ' 调用 GetWindowsDirectory 函数,向它传递字符串及其长度。

      If (GetWindowsDirectory(strWinPath, lngWinPath) > 0) Then

      strWinPath = Left(strWinPath, InStr(1,_

strWinPath, vbNullChar) - 1)   ' 
在第一个空字符处截断字符串。

   Else

      strWinPath = ""

      MsgBox "
没有找到Windows系统,程序不能运行!"

      Exit Sub

   End If

 

  '
以下程序段查找并确定核新天网的YYY.INI文件

    Dim fs, strFolder, INIFileFullName, mc

   

    INIFileFullName = strWinPath & "yyy.ini"

    Set fs = CreateObject("Scripting.FileSystemObject")

   

    If fs.FileExists(INIFileFullName) = True Then

        Dim Szbuf As String

        Dim intString_Len As Integer

        Szbuf = String(127, 0)

        intString_Len = GetPrivateProfileString("System",_

"DownLoadPath", "", Szbuf, 127, INIFileFullName)

        Szbuf = Left(Szbuf, InStr(1, Szbuf, vbNullChar) - 1)_

在第一个空字符处截断字符串。

        strFolder = Szbuf & "dat"    ' 生成核新天网的数据文件所在目录

    Else

        MsgBox "
没有找到核新天网系统,程序不能运行!"

        Exit Sub

    End If

 

    Worksheets("
投资基金分析").Activate

   

    '
以下程序提取深市的基金行情

    Open strFolder & "sznow.dat" For Random As #1 _

Len = Len(MyRecord)

    For RecordNumber = 1 To (LOF(1)  Len(MyRecord))

    Seek #1, RecordNumber    ' 
设置读写位置。

    Get #1, , MyRecord   ' 读入一个记录。

    If Left(MyRecord.股票代码, 1) = "4" Then

        With Worksheets("投资基金分析")

            Set mc = .Cells.Find(What:=Trim(MyRecord.股票代码),_

LookIn:=xlValues, SearchOrder:=xlByColumns)

           If Not mc Is Nothing Then

            .Cells(Val(Right(mc.Address, Len(mc.Address) - _

InStr(2, mc.Address, "$"))), 3) = MyRecord.
成交价 / 1000

           End If

        End With

    End If

   

    Next RecordNumber

    Close #1

 

    '
以下程序提取沪市的基金行情

    Open strFolder & "shnow.dat" For Random As #1 _

Len = Len(MyRecord)

   

    For RecordNumber = 1 To (LOF(1)  Len(MyRecord))

    Seek #1, RecordNumber    ' 
设置读写位置。

    Get #1, , MyRecord   ' 读入一个记录。

   

    If Left(MyRecord.
股票代码, 4) = "5000" Then

        With Worksheets("投资基金分析")

            Set mc = .Cells.Find(What:=Trim(MyRecord.股票代码),_

LookIn:=xlValues, SearchOrder:=xlByColumns)

           If Not mc Is Nothing Then

            .Cells(Val(Right(mc.Address, Len(mc.Address) - _

InStr(2, mc.Address, "$"))), 3) = MyRecord.
成交价 / 1000

           End if

        End With

    End If

   

    Next RecordNumber

    Close #1

   

End Sub

 


好了,让我们保存这段代码并退出Visual Basic编辑环境,不过你必须确信除了注释以外,不能错一个字母喔!

最后,让我们回到Excel界面下,选择工具菜单下面的子菜单子菜单(是不是有点拗口呀),再执行Distill宏就成了,注意你的C3列喔!

对了,笔者还有几句话要说,也许有些还挺重要呢!

其一,你必须安装有核新天网或其兼容的网上交易分析程序;其二,要想得到即时价格,你还必须先运行核新天网,并且把你关心的基金在屏幕上显示出来,如下图所示:



图二

否则你提取的当前价格可是0.00元喔!不会吓一跳吧?

你也可以和笔者一样,在工作表上建立一个宏按钮(图一左上角获得基金当前价”),通过宏按钮来执行Distill宏,这样就更方便了。另行,笔者设计时尽可能的采取了自动处理,所以你的核新天网(或其兼容程序)的安装目录可以任意指定,程序都可自动找到,对基金的排列顺序也没有任何要求,程序会根据基金代码所在的单元格自动搜索。但基金代码和当前价格在分析表中的相对列位置必须如图一所示,否则就要对程序进行改动。