/jcb_zxjt/T0002/zst_cache/ sz399005.zst
说明:只有在浏览历史分时图时才生成相应文件。
/jcb_zxjt/T0002/hq_cache/sh.tfz
/jcb_zxjt/T0002/hq_cache/sz.tfz
说明:通达信当日分时数据, 包括所有浏览过的股票
1、历史分时数据格式
(1)、日期信息格式
数据含义 |
数据类型 |
日期 |
Integer |
昨日收盘价 |
single |
(2)、分时数据格式
数据含义 |
数据类型 |
备注 |
时间 |
word |
如570/60=9.5,即9:30分 |
现价 |
single |
|
均价 |
single |
|
成交量 |
Integer |
|
预留 |
|
12个字节 |
注意:
1)、每6508个字节为一天的数据。(6508 – 8 )/ 26 = 250
2)、每26个字节为一个分钟的记录。
2、当日分时数据格式
(1)、索引数据格式
数据含义 |
数据类型 |
备注 |
存储标记 |
Byte |
表示在指定地址是否有数据 |
起始地址 |
Integer |
股票分时数据块起始地址 |
注意:
1)、索引个数与“/jcb_zxjt/T0002/hq_cache/ shex.tnf”或“/jcb_zxjt/T0002/hq_cache/ szex.tnf”中的股票个数相同。
(2)、分时数据格式
数据含义 |
数据类型 |
备注 |
时间 |
word |
如570/60=9.5,即9:30分 |
现价 |
single |
|
均价 |
single |
|
成交量 |
Integer |
|
预留 |
|
12个字节 |
注意:
1)、每6240个字节为一天的数据。6240 / 26 = 240
2)、每26个字节为一个分钟的记录。
备注:uDataBuffer单元代码在“大智慧Level2日线数据文件格式分析”文档中。
unit uZstData;
interface
uses
uDataBuffer;
type
TDataRecord_min = packed record
time: word; //--时间
cur: single; //--现价
avg: single; //--均价
vol: Integer; //--成交量
reservation: array[0..2] of Integer; //--保留
end;
TDataRecord_Zst = packed record
date: Integer; //--日期
Last: single; //--昨收盘
min: array[0..249] of TDataRecord_min;
end;
PDataRecord_Zst = ^TDataRecord_Zst;
{ 历史分时数据}
TStockDataStream_Zst = class(TRecordStream)
private
function GetItems(Index: Integer): PDataRecord_Zst;
public
constructor Create;
//---
property Items[Index: Integer]: PDataRecord_Zst read GetItems; default;
end;
implementation
constructor TStockDataStream_Zst.Create;
begin
inherited;
//---
DataSize := sizeof(TDataRecord_Zst);
end;
function TStockDataStream_Zst.GetItems(Index: Integer): PDataRecord_Zst;
begin
Result := self.Datas[Index];
end;
end.
unit uTfzData;
interface
uses
uDataBuffer;
type
TIndexRecord_Tfz = packed record
UseSign: byte; //--数据标记
StartAddress: Longword; //--起始地址
end;
PIndexRecord_Tfz = ^TIndexRecord_Tfz;
TDataRecord_min_Tfz = packed record
time: word; //--时间
cur: single; //--现价
avg: single; //--均价
vol: Integer; //--成交量
reservation: array[0..2] of Integer; //--保留
end;
TDataRecord_Tfz = packed record
min: array[0..239] of TDataRecord_min_Tfz;
end;
PDataRecord_Tfz = ^TDataRecord_Tfz;
{ 当日分时数据}
TStockDataStream_Tfz = class(TCustomStringBuffer)
private
FIndexCount: Integer;
FIndexSize: Integer;
FDataCount: word;
FDataSize: Integer;
function GetDatas(Index: Integer): PDataRecord_Tfz;
function GetIndexs(Index: Integer): PIndexRecord_Tfz;
protected
procedure ClearBuffer; override;
procedure DoBufferChange; override;
public
constructor Create;
//---
function GetDataStartAddress(const AIndex: Integer): Longword;
//---
property Datas[Index: Integer]: PDataRecord_Tfz read GetDatas;
property DataCount: word read FDataCount;
property Indexs[Index: Integer]: PIndexRecord_Tfz read GetIndexs;
property IndexCount: Integer read FIndexCount;
end;
implementation
constructor TStockDataStream_Tfz.Create;
begin
inherited;
//---
FIndexSize := sizeof(TIndexRecord_Tfz);
FDataSize := sizeof(TDataRecord_Tfz);
end;
procedure TStockDataStream_Tfz.ClearBuffer;
begin
inherited;
//---
FIndexCount := 0;
FDataCount := 0;
end;
procedure TStockDataStream_Tfz.DoBufferChange;
const
CNT_MinStockCount = 1500;
//---
function _ReadIndex: Boolean;
var
AIndexLen: integer;
begin
AIndexLen := (self.BufferSize - FDataSize * FDataCount);
FIndexCount := AIndexLen div FIndexSize;
//---
Result := (AIndexLen mod FIndexSize) = 0;
end;
//---
function _ReadData: Boolean;
begin
FDataCount := (self.BufferSize - FIndexSize * CNT_MinStockCount) div FDataSize;
Result := FDataCount > 0;
end;
begin
inherited;
//---
if FDataSize <= 0 then
self.ClearBuffer
else
begin
if not (_ReadData and _ReadIndex) then
self.ClearBuffer;
end;
end;
function TStockDataStream_Tfz.GetDatas(Index: Integer): PDataRecord_Tfz;
begin
Result := Pointer(self.Buffer + FIndexSize * FIndexCount + FDataSize * Index);
end;
function TStockDataStream_Tfz.GetIndexs(Index: Integer): PIndexRecord_Tfz;
begin
Result := Pointer(self.Buffer + FIndexSize * Index);
end;
function TStockDataStream_Tfz.GetDataStartAddress(const AIndex: Integer):
Longword;
begin
Result := FIndexSize * FIndexCount + FDataSize * AIndex;
end;
end.
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
GroupBox1: TGroupBox;
OpenDialog1: TOpenDialog;
RadioGroup1: TRadioGroup;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure ShowData_Zst(const AFile: string; const AListBox: TListBox);
procedure ShowData_Tfz(const AFile: string; const AListBox: TListBox);
public
procedure ShowData(const AFile: string; const AListBox: TListBox);
end;
var
Form1: TForm1;
implementation
uses uZstData,uTfzData;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
with RadioGroup1.Items do
begin
clear;
Add('临时分时数据');
Add('当日分时数据');
end;
RadioGroup1.ItemIndex := 0;
//---
SendMessage(ListBox1.Handle,LB_SetHorizontalExtent,2000,longint(0));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with self.OpenDialog1 do
begin
if Execute then
self.ShowData(FileName,ListBox1);
end;
end;
procedure TForm1.ShowData(const AFile: string; const AListBox: TListBox);
begin
case RadioGroup1.ItemIndex of
0: ShowData_Zst(AFile,AListBox);
1: ShowData_Tfz(AFile,AListBox);
end;
end;
procedure TForm1.ShowData_Zst(const AFile: string;
const AListBox: TListBox);
var
AStream: TStockDataStream_Zst;
ADayIndex,AMinIndex: Integer;
begin
AStream := TStockDataStream_Zst.Create;
try
with AListBox.Items do
begin
BeginUpdate;
Clear;
with AStream do
begin
if ReadFile(AFile) then
begin
for ADayIndex := 0 to Count - 1 do
begin
with items[ADayIndex]^ do
begin
Add(Format('%.3d %d 昨%.2f', [ADayIndex,date,Last]));
for AMinIndex := Low(min) to high(min) do
begin
with min[AMinIndex] do
Add(Format('%.3d %.2d:%.2d 现%.2f 均%.2f 量%d 保留%d %d %d', [AMinIndex,time div 60,time mod 60,
cur,avg,vol,
reservation[0],reservation[1],reservation[2]]));
end;
end;
end;
end;
end;
EndUpdate;
end;
finally
AStream.Free;
end;
end;
procedure TForm1.ShowData_Tfz(const AFile: string;
const AListBox: TListBox);
var
AStream: TStockDataStream_Tfz;
//---
procedure _ShowIndex;
var
AIndex: Integer;
begin
with AListBox.Items,AStream do
begin
Add('--------索引---------');
//---
for AIndex := 0 to IndexCount - 1 do
begin
with Indexs[AIndex]^ do
Add(Format('%.4d 数据标记:%d 起始地址:%.6x', [AIndex + 1,UseSign,StartAddress]));
end;
end;
end;
//---
procedure _ShowData;
var
ADataIndex,AMinIndex,AStartAddress: Integer;
//---
function _FindIndex(AStartAddress: Integer): integer;
var
AIndex: integer;
begin
with AStream do
begin
for AIndex := 0 to IndexCount - 1 do
begin
with Indexs[AIndex]^ do
if (UseSign = 1) and (StartAddress = AStartAddress) then
begin
Result := AIndex;
exit;
end;
end;
end;
//---
Result := 0;
end;
begin
with AListBox.Items,AStream do
begin
Add('--------数据---------');
for ADataIndex := 0 to DataCount - 1 do
begin
Add(' ');
//---
AStartAddress := GetDataStartAddress(ADataIndex);
Add(Format('%.3d 索引:%.3d 地址:%.6x', [ADataIndex + 1,_FindIndex(AStartAddress) + 1,AStartAddress]));
//---
with Datas[ADataIndex]^ do
begin
for AMinIndex := Low(min) to high(min) do
begin
with min[AMinIndex] do
Add(Format('%.3d %.2d:%.2d 现%.2f 均%.2f 量%d 保留%d %d %d', [AMinIndex + 1,
time div 60,time mod 60,
cur,avg,vol,
reservation[0],reservation[1],reservation[2]]));
end;
end;
end;
end;
end;
begin
AStream := TStockDataStream_Tfz.Create;
try
with AListBox.Items do
begin
BeginUpdate;
Clear;
with AStream do
begin
if ReadFile(AFile) then
begin
_ShowIndex;
_ShowData;
end;
end;
EndUpdate;
end;
finally
AStream.Free;
end;
end;
end.