DELPHI 读取大智慧除权数据

  • Post author:
  • Post category:其他


网上有各种的资料,但是都存一点点小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 版权协议,转载请附上原文出处链接和本声明。