在Excel中导入投资基金即时行情
作者:濮志刚 来源:赛迪网 添加时间:2006-5-21 16:29:34因此,笔者用Excel做了一张专门用于分析投资基金的图表,如下图:
图一
目标已经明确,让我们现在就开始吧!
第一步,找到记录即时行情的数据库
通过分析比较,可以认定核新天网的即时行情数据库保存在其安装目录(笔者的系统中为”c:\programfiles\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 |
有了以上的基础,我们再进行第三步:通过编程找出需要的数据
因为Excel软件中集成了VBA(VisualBasic for Applications),完全可以满足们的编程需要,故而笔者使用它并通过API的调用扩展其功能,使程序可以自动搜索系统中核新天网或其兼容程序的安装目录和其数据库所在位置,提高了程序的通用性和可用性。
现在,让我们执行Excel程序,建立如图一所示的工作表,并把这张表命名为“投资基金分析”。如果不会命名的话,请参考Excel帮助中的“重命名工作表”。这里,笔者必须提醒大家:图一的表中,除了C、F、G、H列,其它数据可得自己填喔。不知道基金每周的净值吗?没关系,上网在易富网站或是中国证券报的网站上查找,网址分别是:http://www.eefoo.com/fund/
好了,现在我们进行我们的VBA之旅吧。
在Excel菜单下(笔者用的是Excel 2000,使用其它版本的Excel,可能会和笔者的操作有所差异),找到“工具”一项,再选择其下子菜单“宏”中的“Visual Basic编辑器”,这样Microsoft Visual Basic的编辑界面就出现在我们的面前了。选择其菜单中的“插入”一项,并选择其中的“模块”,而后在该模块中键入如下代码:
| DeclareFunction GetWindowsDirectory Lib "kernel32"_ Alias"GetWindowsDirectoryA" (ByVal lpBuffer As String,_ ByValnSize As Long) As Long DeclareFunction GetPrivateProfileString Lib "kernel32"_ Alias"GetPrivateProfileStringA" (ByVal lpApplicationName_ AsString, ByVal lpKeyName As Any, ByVal lpDefault As String,_ ByVallpReturnedString As String, ByVal nSize As Long,_ ByVallpFileName As String) As Long TypeRecord_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 EndType DimMyRecord As Record_Price SubDistill() '从核新天网中提取即时行情 '以下程序段获得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") Iffs.FileExists(INIFileFullName) = True Then DimSzbuf As String DimintString_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 Notmc Is Nothing Then .Cells(Val(Right(mc.Address, Len(mc.Address) - _ InStr(2,mc.Address, "$"))), 3) = MyRecord.成交价/ 1000 EndIf EndWith 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 Notmc Is Nothing Then .Cells(Val(Right(mc.Address, Len(mc.Address) - _ InStr(2,mc.Address, "$"))), 3) = MyRecord.成交价/ 1000 Endif EndWith End If Next RecordNumber Close #1 EndSub |
好了,让我们保存这段代码并退出Visual Basic编辑环境,不过你必须确信除了注释以外,不能错一个字母喔!
最后,让我们回到Excel界面下,选择“工具”菜单下面的子菜单“宏”的“宏”子菜单(是不是有点拗口呀),再执行Distill宏就成了,注意你的C3列喔!
对了,笔者还有几句话要说,也许有些还挺重要呢!
其一,你必须安装有核新天网或其兼容的网上交易分析程序;其二,要想得到即时价格,你还必须先运行核新天网,并且把你关心的基金在屏幕上显示出来,如下图所示:
图二
你也可以和笔者一样,在工作表上建立一个宏按钮(图一左上角“获得基金当前价”),通过宏按钮来执行Distill宏,这样就更方便了。另行,笔者设计时尽可能的采取了自动处理,所以你的核新天网(或其兼容程序)的安装目录可以任意指定,程序都可自动找到,对基金的排列顺序也没有任何要求,程序会根据基金代码所在的单元格自动搜索。但基金代码和当前价格在分析表中的相对列位置必须如图一所示,否则就要对程序进行改动。
希望本文能对关注封闭式投资基金的朋友及使用VBA编程的朋友有所益处。感谢编辑提供给我与大家沟通的机会,我热切盼望着与大家的交流。我邮件地址:51gog074@public.gb.com.cn
站内搜索