大智慧日K线的数据结构.docx
- 文档编号:592017
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:15
- 大小:18.64KB
大智慧日K线的数据结构.docx
《大智慧日K线的数据结构.docx》由会员分享,可在线阅读,更多相关《大智慧日K线的数据结构.docx(15页珍藏版)》请在冰点文库上搜索。
大智慧日K线的数据结构
1大智慧日K线的数据结构
大智慧日K线的数据结构
大智慧股票行情软件是目前应用广泛的一个炒股工具,有时我们需要自编炒股的算法进行研究,如提取某只股票的收盘价,成交量等,这时候如果能直接读大智慧股票分析系统的数据格式,将对软件的编制带来极大的方便。
(注:
大智慧用的钱龙数据格式,本文适用于钱龙股票行情软件中的日k线数据)。
本文主要描述了在Delphi下大智慧日K线的数据结构,和以动态数组方式提取数据的方法。
一、数据文件和数据结构:
大智慧数据文件和数据结构:
(假设大智慧股票行情软件安装在D:
dzh目录下)
上海日线存储路径为:
D:
dzhDATASHaseDay,文件扩展名为:
.day
上海周线存储路径为:
D:
dzhDATASHaseweek,文件扩展名为:
.wek
上海月线存储路径为:
D:
dzhDATASHasemonth,文件扩展名为:
.mnt
深圳日线存储路径为:
D:
dzhDATASZnseDay
深圳周线存储路径为:
D:
dzhDATASZnseweek
深圳月线存储路径为:
D:
dzhDATASZnsemonth
周线,月线格式与日线格式一致.
以深发展日线为例:
1A76:
0100D6CD2F0152070100-5207010052070100
1A76:
011052070100860F0000-4D02000000000000
1A76:
01200000000000000000-D7CD2F0160030100
1A76:
01306003010060030100-6003010082050000
1A76:
0140D400000000000000-0000000000000000
每一条记录的长度为40字节:
1-4字节为日期,D6CD2F01转换为十进制是:
19910102
5-8字节=开盘价(元)*1000
9-12字节=最高价(元)*1000
13-16字节=最低价(元)*1000
17-20字节=收盘价(元)*1000
21-24字节=成交金额(元)/1000
25-28字节=成交量(手)
其余12字节未使用
实现步骤:
1、先定义日线数据结构数组
2、再以实际记录数分配动态数组空间
3、然后把数据读入相应数组中
Procedure TFormKXianMain.ReadData(Sender:
Tobject);//读取日k线数据文件中的开盘价、最高价、最低价、收盘价、成交金额、成交量
VarI:
Integer;
VarFileName:
String;//日k线数据文件
VarDataFile:
File;
//-----------------定义日线数据结构数组----------
VarDataDate:
LongWord;//日期数组
VarDataOpen:
LongWord;//开盘价数组
VarDataHigh:
LongWord;//最高价数组
VarDataLow:
LongWord;//最低价数组
VarDataClose:
LongWord;//收盘价数组
VarDataShuLiang:
LongWord;//成交量数组
VarDataJinE:
LongWord;//成交金额数组
VarDataNoOne:
LongWord;
VarDataNoTwo:
LongWord;
VarDataNoThree:
LongWord;
//----------------------------------------------
Begin
Try
DayCount:
=0;
FileName:
=‘D:
dzhDATASZnseDay001.day‘;//此处根据文件的具体路径填写
IfFileExists(FileName)Then
Begin
AssignFile(DataFile,Filename);
Reset(DataFile,1);
//-------以实际记录数分配动态数组空间--------
DayCount:
=Round(FileSize(DataFile)/40);
//基本数据
SetLength(DayData,7);
ForI:
=Low(DayData)toHigh(DayData)do
SetLength(DayData[I],DayCount);
I:
=0;
//------------------------------------------
//============把数据读入相应数组中===========
whilenotEof(DataFile)do
Begin
BlockRead(DataFile,DataDate,SizeOf(DataDate));
DayData[0][I]:
=DataDate;//读取日期数据放入日期数组中
BlockRead(DataFile,DataOpen,SizeOf(DataOpen));
DayData[1][I]:
=DataOpen;//读取开盘数据放入开盘数组中
BlockRead(DataFile,DataClose,SizeOf(DataHigh));
DayData[4][I]:
=DataClose;//读取收盘数据放入收盘数组中
BlockRead(DataFile,DataHigh,SizeOf(DataLow));
DayData[2][I]:
=DataHigh; //读取最高价数据放入最高价数组中
BlockRead(DataFile,DataLow,SizeOf(DataClose));
DayData[3][I]:
=DataLow;//读取最低价数据放入最低价数组中
BlockRead(DataFile,DataJinE,SizeOf(DataShuLiang));
DayData[5][I]:
=NotDataJinE;//读取成交金额数据放入成交金额数组中
BlockRead(DataFile,DataShuLiang,SizeOf(DataJinE));
DayData[6][I]:
=DataShuLiang;//读取成交量数据放入成交量数组中
BlockRead(DataFile,DataNoOne,SizeOf(DataNoOne));
BlockRead(DataFile,DataNoTwo,SizeOf(DataNoTwo));
BlockRead(DataFile,DataNoThree,SizeOf(DataNoThree));
I:
=I+1;
End;
//========================================
CloseFile(DataFile);
End//数据文件存在
Else
MessageDlg(‘数据文件不存在,请检查程序中文件路径!
‘,mtInformation,[mbOk],0);
Except
MessageDlg(‘文件读写错误,请检查程序中文件路径!
‘,mtInformation,[mbOk],0);
End;
End;
二、引用日线数据文件中的数据
只要在需要的地方进行调用上述定义的数组即可。
部分示例如下:
Procedure TFormKXianMain.DrawLineInIt(Sender:
Tobject);
VarI,FlagExit,x1:
Integer;
Begin
IfDayCount>0Then
Begin
BeginDate:
=0;
EndDate:
=DayCount-1;
x1:
=LeftX;
FlagExit:
=0;
I:
=DayCount-1;
While(I>-1)And(FlagExit=0)Do
Begin
x1:
=x1+DefaultWidth;
If(x1+DefaultWidth)>(PaintWidth-RightX)Then
FlagExit:
=1
Else
I:
=I-1;
End;
If(I=-1)Then
LeftDate:
=0
Else
LeftDate:
=I;
RightDate:
=DayCount-1;
CurrentDate:
=DayCount-1;
CurrentX:
=x1-Round((DefaultWidth+1)/2);
End;
End;
Procedure TFormKXianMain.DrawLine(Sender:
Tobject);
Varkpjg,spjg,zgjg,zdjg:
Integer;
Varx1,x2,y1,y2,x3,y3,x4,y4:
Integer;
VarI,Kheight:
Integer;
VarTempString,OutStr:
String;
VarTempLen,StrLen:
Integer;
Begin
IfDayCount>0Then
Begin
//清空屏幕
Canvas.Brush.Color:
=clblack;
Canvas.Brush.style:
=bsSolid;
Canvas.FillRect(Rect(0,0,PaintWidth,PaintHeight));
//左边竖直线
Canvas.Pen.Color:
=clRed;
Canvas.MoveTo(LeftX-1,0);
Canvas.LineTo(LeftX-1,PaintHeight);
//上边水平线
Canvas.MoveTo(0,TopY);
Canvas.LineTo(PaintWidth,TopY);
//右边竖直线
Canvas.MoveTo(PaintWidth-RightX,TopY);
Canvas.LineTo(PaintWidth-RightX,PaintHeight);
//下边水平线
Canvas.MoveTo(0,PaintHeight-BottomY);
Canvas.LineTo(PaintWidth-RightX,PaintHeight-BottomY);
PageTopY:
=PaintHeight-BottomY;
Canvas.Pen.Style:
=psDot;
Canvas.Pen.Color:
=clMaroon;
Canvas.MoveTo(LeftX-1,Round(PageTopY/3));
Canvas.LineTo(PaintWidth-RightX,Round(PageTopY/3));
Canvas.MoveTo(LeftX-1,Round(2*PageTopY/3));
Canvas.LineTo(PaintWidth-RightX,Round(2*PageTopY/3));
Canvas.Pen.style:
=psSolid;
//求价格的最大、最小值
Maxjg:
=DayData[2][LeftDate];
MinJg:
=DayData[3][LeftDate];
I:
=LeftDate;
While(I<RightDate)Or(I=RightDate)Do
Begin
IfDayData[2][I]>MaxJgThen
MaxJg:
=DayData[2][I];
IfDayData[3][I]<MinJgThen
MinJg:
=DayData[3][I];
I:
=I+1;
End;
//画右侧成交价格坐标数值
OutStr:
=‘.‘;
Canvas.Font.Color:
=clRed;
Canvas.Brush.Color:
=clBlack;
Canvas.Font.Size:
=11;
Canvas.Font.name:
=‘宋体‘;
Canvas.Brush.style:
=bsSolid;
Canvas.Pen.color:
=clred;
TempString:
=IntToStr(Round(MinJg+(MaxJg-MinJg)*2/3));
TempLen:
=Length(TempString);
Insert(OutStr,TempString,TempLen-2);
StrLen:
=Length(TempString);
IfTempString[StrLen]=‘0‘Then
TempString[StrLen]:
=‘‘;
Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY/3)-9,TempString);
TempString:
=IntToStr(Round(MinJg+(MaxJg-MinJg)/3));
TempLen:
=Length(TempString);
Insert(OutStr,TempString,TempLen-2);
StrLen:
=Length(TempString);
IfTempString[StrLen]=‘0‘Then
TempString[StrLen]:
=‘‘;
Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY*2/3)-9,TempString);
//画K线图
Kheight:
=PageTopY-TopY-10;
HeightXiShu:
=(MaxJg-MinJg)/Kheight;
x1:
=LeftX-DefaultWidth;
I:
=LeftDate;
While(I<RightDate)Or (I=RightDate)Do
Begin
kpjg:
=DayData[1][I];
spjg:
=DayData[4][I];
zgjg:
=DayData[2][I];
zdjg:
=DayData[3][I];
x1:
=x1+DefaultWidth;
x2:
=x1+DefaultWidth-1;
x3:
=Round((x1+x2)/2);
x4:
=x3;
Ifspjg<kpjgThen
Begin
Canvas.Pen.Color:
=clAqua;
Canvas.Brush.Color:
=clAqua;
Canvas.Brush.style:
=bsSolid;
y3:
=PageTopY-Round((zgjg-MinJg)/HeightXiShu)-2;
y1:
=PageTopY-Round((kpjg-MinJg)/HeightXiShu)-2;
y2:
=PageTopY-Round((spjg-MinJg)/HeightXiShu)-2;
y4:
=PageTopY-Round((zdjg-MinJg)/HeightXiShu)-2;
If(y1=y2)Then
y2:
=y2+1;
If(zgjg=kpjg)Then
y3:
=y1;
If(zdjg=spjg)Then
y4:
=y2;
If(zgjg<>kpjg)And(y1=y3)Then
y3:
=y3-1;
If(zdjg<>spjg)And(y2=y4)Then
y4:
=y4+1;
Canvas.MoveTo(x3,y3);
Canvas.LineTo(x3,y1);
Canvas.FillRect(Rect(x1,y1,x2,y2));
Canvas.MoveTo(x4,y2);
Canvas.LineTo(x4,y4);
End//收盘价小于开盘价,阴线
Else
Begin
Canvas.Pen.Color:
=clred;
x2:
=x2-1;
y3:
=PageTopY-Round((zgjg-MinJg)/HeightXiShu)-2;
y1:
=PageTopY-Round((spjg-MinJg)/HeightXiShu)-2;
y2:
=PageTopY-Round((kpjg-MinJg)/HeightXiShu)-2;
y4:
=PageTopY-Round((zdjg-MinJg)/HeightXiShu)-2;
If(y1=y2)And(spjg<>kpjg)Then
y2:
=y2+1;
If(zdjg=kpjg)Then
y4:
=y2;
If(zgjg=spjg)Then
y3:
=y1;
If(zdjg<>kpjg)And(y2=y4)Then
y4:
=y4+1;
If(zgjg<>spjg)And(y1=y3)Then
y3:
=y3-1;
Canvas.MoveTo(x3,y3);
Canvas.LineTo(x3,y1);
Canvas.MoveTo(x1,y1);
Canvas.LineTo(x2,y1);
Canvas.LineTo(x2,y2);
Canvas.LineTo(x1,y2);
Canvas.LineTo(x1,y1);
Canvas.MoveTo(x4,y2);
Canvas.LineTo(x4,y4);
End;//收盘价大于开盘价,阳线
I:
=I+1;
End;//画K线图
Canvas.Font.Color:
=clRed;
Canvas.Brush.Color:
=clBlack;
Canvas.Font.Size:
=11;
Canvas.Font.name:
=‘宋体‘;
//输出证券名称
TempString:
=ZqjcData[ZqRecordNo];
Canvas.TextOut(1,1,TempString);
//输出基本信息
TempString:
=‘代码‘;
TempString:
=TempString+ZqdmData[ZqRecordNo]+‘‘;
TempString:
=TempString+‘流通股本‘;
TempString:
=TempString+IntToStr(ZqltgbData[ZqRecordNo])+‘‘;
Canvas.TextOut(LeftX+1,1,TempString);
End;//数据集中数据个数大于0
End;
Procedure TFormKXianMain.DrawNowLine(Sender:
Tobject);
VarTempStr,OutStr:
String;
VarTempLen,StrLen:
Integer;
Be
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智慧 数据结构