网上有各种的资料,但是都存一点点小BUG,强行处理了一波
使用方法:
1,在大智慧系统中“接收除权数据” (在下载数据里面有)
2,大智慧系统中选 “常用“ – ”数据管理中心“ – ”财务数据“ – ”除权输出“
数据格式:120个字节为一段,如果头4个字节等于0XFFFFFFFF,表示后面紧接的
8个字节为GBK格式的代码,否则头4个字节表示除权的时间,数据为int类型,数值为
1970-01-01到目前的秒数
procedure TTrade.ReadDZHDividend(AFile: string);
const d = '\d+[\x{4E00}-\x{9FA5}]+\d\.\d+';
d2 ='([1-9]\d*\.?\d*)|(0\.\d*[1-9])';
{本来准备用正则表达式的,后来发现更麻烦}
var
ms:TMemoryStream;
t:TBytes;
num,npos,ncount:integer;
Acode,Atemp:string;
tt:TDateTime;
dv:TDividendRecord;
begin
SetLength(t,120);
ms := TMemoryStream.Create;
ms.LoadFromFile(AFile);
ZeroMemory(@dv,SizeOf(TDividendRecord));
ms.Position := 8;
ncount := 0;
while ms.Position<ms.Size do
begin
ms.ReadBuffer(t,120);
if Pinteger(t)^ = -1 then
Atemp :=Trim( TEncoding.Default.GetString(t,6,6))
else
begin
if Length(Atemp)<6 then Continue;
if (Atemp[1]='0') or (Atemp[1]='3') or (Atemp[1]='6') then
begin
dv.Acode := Atemp;
num := Pinteger(t)^;
tt := UnixToDateTime(num);
dv.Datetime := tt;
Acode := Trim(TEncoding.Default.GetString(t,20,32));
npos := Pos('派',Acode );
if npos>0 then
dv.Cash :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
npos := Pos('增',Acode );
if npos>0 then
dv.Bonus :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
npos := Pos('送',Acode );
if npos>0 then
dv.Bonus :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
npos := Pos('股',Acode );
if npos>0 then
dv.Dispatch :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
npos := Pos('价',Acode );
if npos>0 then
dv.Bonus :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
npos := Pos('红',Acode );
if npos>0 then
dv.Cash :=StrToCurrDef(Copy(Acode,npos+1,5),0) / 10;
if dv.Cash+dv.Bonus+dv.Splite+dv.Price+dv.Dispatch = 0 then
begin
//这儿就是目前网上的代码没有处理的送股问题
//不知道为什么送股数据没有采取一句中文的方式
//而且这个数据有可能存在时间后面的4个字节里
//也有可能存在下一个16字节的头4个字节里,如果有朋友清楚请告诉感谢
dv.Bonus := psingle(@t[4])^;
if dv.Bonus = 0 then
dv.Bonus := NewRoundTo(psingle(@t[16])^,-4);
if dv.Bonus = 0 then Continue;
end;
Inc(ncount);
SetLength(dvs,ncount);
dvs[ncount-1]:=dv;
ZeroMemory(@dv,SizeOf(TDividendRecord));
end;
end;
end;
end;
版权声明:本文为xionw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。