Delphi 读取大智慧2的日线数据(300分)

N

nalyc

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi 读取大智慧2的日线数据,
-----------------------------------
说明:日线数据文件day.dat
case DataTypes.hq:
fileName = "DAY.DAT";
startAddress = 0x41000;
blockSize = 8192;
recordSize = 32;
codeIsLong = false;
fieldString =
"dm,代码,code,10,0,0,;" +
"rq,日期,date,4,1,0,;" +
"kp,开盘,single,4,2,4,B;" +
"zg,最高,single,4,3,8,B;" +
"zd,最低,single,4,4,12,B;" +
"sp,收盘,single,4,5,16,B;" +
"sl,成交数量,single,4,6,20,A;"+
"je,成交金额,single,4,7,24,";
数据格式几乎与分析家相同
起止地址 数据内容 数据含义 数据类型
00 - 03 F4 9B 13 FC 文件标志 int
04 - 07 00 06 00 00 未知 int
08 - 0B 00 00 00 00 保留 int
0C - 0F 97 04 00 00 证券总数 int
10 - 13 00 18 00 00 未知 int需添加之起始块号
14 - 17 DB 17 00 00 未知 int当前最后空块号
18 - 21 31 41 30 30 30...FF 证券代码 byte[10]
22 - 25 B0 09 00 00 日线记录数 int
26 - 57 00 00 25 04...FF FF 记录块号 char[25]
......
记录块开始于0x41000
41000 - 41003 80 47 B2 2B 日期 int
41004 - 41007 B9 1E 25 41 开盘价 float
41008 - 4100B CD CC 4C 41 最高价 float
4100C - 4100F EC 51 18 41 最低价 float
41010 - 41013 9A 99 41 41 收盘价 float
41014 - 41017 80 06 B2 47 成交量 float
41018 - 4101B 40 1C BC 4C 成交金额 float
4101C - 4101D 00 00 上涨家数 char
4101E - 4101F 00 00 下跌家数 char
注:
   1)起止地址、数据内容为十六进制,数据类型为 Delphi 下之定义。
   2)从18h开始至40017h每64byte为一条股票数据分配记录,含义如上表18h - 57h所示;
   3)从41000h开始每8KB为一股票数据存储块,每个股票数据存储块共存储256条日线记录,
    每一条记录的长度为32 byte(含义如上表;上涨家数及下跌家数只对指数有效);
   4)从41000h开始的8KB为第0号数据存储块,以后类推;
   5)系统对每个股票日线数据存储以存储块为单位进行分配。
   6)具体应用实例分析家数据管理程序。
   7) 日期字段的意义为:实际日期 = StrToDate(^1970-01-01^)+(日期字段 div 86400);
    即“日期字段”除以86400所得数为实际日期距1970年01月01日的天数。
 
N

nalyc

Unregistered / Unconfirmed
GUEST, unregistred user!
这是C代码,您转一下,再给1000分
--------------------------------------------------------
if (!File.Exists(FxjFile))
{
msg = fxjFileStruct.fileName + "没有找到!";
return new string[1, 1] { { null } };
}
#endregion
if (fxjFileStruct.isIndexDataStruct == true)
{
#region 处理DAY.DAT等结构(索引/数据)的数据
try
{
FileStream fs = new FileStream(FxjFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(fs);
int secCounts = 0;//文件中证券总数
string code0 = "";
len = fs.Length;
fs.Position = 12;
secCounts = br.ReadInt32();
for (int i = 0;
i < secCounts;
i++)
{
pos = 24 + 64 * i;
if (pos <= len)
{
fs.Position = pos;
//code0 = new string(br.ReadChars(10));//分析家用10个字节保存代码,一般用8个字节
code0 = System.Text.Encoding.Default.GetString(br.ReadBytes(10));
code0 = code0.Replace("/0", "");
code0 = code0.Replace("HKHK", "HK");
//香港证券代码本身保存为HKxxxx
if (fxjFileStruct.codeIsLong == false &amp;&amp;
code == market + code0 || fxjFileStruct.codeIsLong == true &amp;&amp;
code == code0)
{
recordCounts = br.ReadInt32();
for (int j = 0;
j < 25;
j++)
{
blocks[j] = br.ReadInt16();
}
}
}
}
int iRecord = 1;//记录
int iBlock = 0;//第iBlock块
int fieldCounts = fxjFileStruct.fields.GetLength(0);
while (iBlock < 25 &amp;&amp;
blocks[iBlock] != -1)
{
int r = 0;
while (iRecord < recordCounts + 1 &amp;&amp;
r < fxjFileStruct.blockSize / fxjFileStruct.recordSize) //16=3776/236
{
string[] record = new string[fieldCounts];
pos = fxjFileStruct.startAddress + blocks[iBlock] * fxjFileStruct.blockSize + r * fxjFileStruct.recordSize;
for (int iField = 0;
iField < fieldCounts;
iField++)
{
fs.Position = pos + Convert.ToInt64(fxjFileStruct.fields[iField, 5]);
switch (fxjFileStruct.fields[iField, 2].ToLower())
{
case "code":
//code0 = new string(br.ReadChars(8));//有12位,实际用了8位,第9-12位一般为/0,有时是错误字节,因为只读8位
//code0 = code0.Replace("/0", "");
record[iField] = code;
break;
case "date":
intField = br.ReadInt32();
record[iField] = (intField == 0 ? "" : (date19700101.AddDays(intField / 86400)).ToString("yyyy-MM-dd"));
break;
case "int":
intField = br.ReadInt32();
record[iField] = intField.ToString();
break;
case "single":
floatField = br.ReadSingle();
if (fxjFileStruct.fields[iField, 6].ToUpper() == "A") floatField *= 100;
record[iField] = floatField.ToString();
break;
case "double":
do
ubleField = br.ReadDouble();
record[iField] =do
ubleField.ToString();
break;
case "string":
record[iField] = System.Text.Encoding.Default.GetString(br.ReadBytes(Convert.ToInt32(fxjFileStruct.fields[iField, 3]))).Replace("/0", "");
break;
}
}

recordList.Add(record);
r = r + 1;
iRecord = iRecord + 1;
}
iBlock = iBlock + 1;
}
fs.Close();
 
N

nalyc

Unregistered / Unconfirmed
GUEST, unregistred user!
谁帮一下啊~
 

Similar threads

S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
728
import
I
I
回复
0
查看
536
import
I
顶部