魅族logo:在Excel中导入投资基金即时行情

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 02:08:20
(濮志刚 2001年07月31日 09:28)
对于封闭式投资基金来说,基金的折价率、增长率和净值相对而言是确定其投资价值的重要依据。
因此,笔者用Excel做了一张专门用于分析投资基金的图表,如下图:

图一
但由于证券的时效性,在使用中,不时需要从“核新天网—网上股票交易分析系统”中读取基金的当前价格,然后再填入到分析系统相应的单元格中。反复的手工操作让笔者不胜其烦,而且存在时效性差、工作量大、容易出错等多方面的缺点,故而笔者想到,如果能用程序从核新天网的行情数据中提取即时行情到Excel单元格中,问题不就可以解决了吗?
目标已经明确,让我们现在就开始吧!
第一步,找到记录即时行情的数据库
通过分析比较,可以认定核新天网的即时行情数据库保存在其安装目录(笔者的系统中为”c:\program files\hexin”)的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帮助中的“重命名工作表”。这里,笔者必须提醒大家:图一的表中,除了C、F、G、H列,其它数据可得自己填喔。不知道基金每周的净值吗?没关系,上网在易富网站或是中国证券报的网站上查找,网址分别是: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宏,这样就更方便了。另行,笔者设计时尽可能的采取了自动处理,所以你的核新天网(或其兼容程序)的安装目录可以任意指定,程序都可自动找到,对基金的排列顺序也没有任何要求,程序会根据基金代码所在的单元格自动搜索。但基金代码和当前价格在分析表中的相对列位置必须如图一所示,否则就要对程序进行改动。
希望本文能对关注封闭式投资基金的朋友及使用VBA编程的朋友有所益处。感谢编辑提供给我与大家沟通的机会,我热切盼望着与大家的交流。我邮件地址:51gog074@public.gb.com.cn
(责任编辑 Rayhotray@ccidnet.com)