已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大智慧日K线的数据结构rn 大智慧股票行情软件是目前应用广泛的一个炒股工具,有时我们需要自编炒股的算法进行研究,如提取某只股票的收盘价,成交量等,这时候如果能直接读大智慧股票分析系统的数据格式,将对软件的编制带来极大的方便。(注:大智慧用的钱龙数据格式,本文适用于钱龙股票行情软件中的日k线数据)。本文主要描述了在Delphi下大智慧日K线的数据结构,和以动态数组方式提取数据的方法。rn 一、数据文件和数据结构:rn 大智慧数据文件和数据结构:(假设大智慧股票行情软件安装在D:dzh目录下)rn 上海日线存储路径为:D:dzhDATASHaseDay,文件扩展名为:.dayrn 上海周线存储路径为:D:dzhDATASHaseweek,文件扩展名为: .wekrn 上海月线存储路径为:D:dzhDATASHasemonth,文件扩展名为: .mntrn 深圳日线存储路径为:D:dzhDATASZnseDayrn 深圳周线存储路径为:D:dzhDATASZnseweekrn 深圳月线存储路径为:D:dzhDATASZnsemonthrn 周线,月线格式与日线格式一致.rn 以深发展日线为例:rn 1A76:0100 D6 CD 2F 01 52 07 01 00-52 07 01 00 52 07 01 00rn 1A76:0110 52 07 01 00 86 0F 00 00-4D 02 00 00 00 00 00 00rn 1A76:0120 00 00 00 00 00 00 00 00-D7 CD 2F 01 60 03 01 00rn 1A76:0130 60 03 01 00 60 03 01 00-60 03 01 00 82 05 00 00rn 1A76:0140 D4 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 rnrn每一条记录的长度为40字节:rn1-4字节为日期,D6 CD 2F 01转换为十进制是:19910102rn5-8字节=开盘价(元)*1000rn9-12字节=最高价(元)*1000rn13-16字节=最低价(元)*1000rn17-20字节=收盘价(元)*1000rn21-24字节=成交金额(元)/1000rn25-28字节=成交量(手)rn其余12字节未使用rn实现步骤:rn1、先定义日线数据结构数组rn2、再以实际记录数分配动态数组空间rn3、然后把数据读入相应数组中rnrnProcedureTFormKXianMain.ReadData(Sender: Tobject);/读取日k线数据文件中的开盘价、最高价、最低价、收盘价、成交金额、成交量rnVar I:Integer;rnVar FileName:String;/日k线数据文件rnVar DataFile:File;rn/-定义日线数据结构数组-rnVar DataDate: LongWord;/日期数组rnVar DataOpen: LongWord;/开盘价数组rnVar DataHigh: LongWord;/最高价数组rnVar DataLow: LongWord;/最低价数组rnVar DataClose: LongWord;/收盘价数组rnVar DataShuLiang: LongWord;/成交量数组rnVar DataJinE: LongWord;/成交金额数组rnVar DataNoOne: LongWord;rnVar DataNoTwo: LongWord;rnVar DataNoThree: LongWord;rn/-rnBeginrnTryrn DayCount:=0;rn FileName:=D:dzhDATASZnseDay0001.day;/此处根据文件的具体路径填写rn If FileExists(FileName) Thenrn Beginrn AssignFile(DataFile, Filename);rn Reset(DataFile,1);rn /-以实际记录数分配动态数组空间-rn DayCount:=Round(FileSize(DataFile)/40);rn /基本数据rn SetLength(DayData,7);rn For I := Low(DayData) to High(DayData) dorn SetLength(DayDataI,DayCount);rn I:=0;rn /-rn /=把数据读入相应数组中=rn while not Eof(DataFile) dorn Beginrn BlockRead(DataFile, DataDate, SizeOf(DataDate);rn DayData0I:=DataDate;/读取日期数据放入日期数组中rn BlockRead(DataFile, DataOpen, SizeOf(DataOpen);rn DayData1I:=DataOpen; /读取开盘数据放入开盘数组中rn BlockRead(DataFile, DataClose, SizeOf(DataHigh);rn DayData4I:=DataClose; /读取收盘数据放入收盘数组中rn BlockRead(DataFile, DataHigh, SizeOf(DataLow);rn DayData2I:=DataHigh;/读取最高价数据放入最高价数组中rn BlockRead(DataFile, DataLow, SizeOf(DataClose);rn DayData3I:=DataLow; /读取最低价数据放入最低价数组中rn BlockRead(DataFile, DataJinE, SizeOf(DataShuLiang);rn DayData5I:=Not DataJinE;/读取成交金额数据放入成交金额数组中rn BlockRead(DataFile, DataShuLiang, SizeOf(DataJinE);rn DayData6I:=DataShuLiang;/读取成交量数据放入成交量数组中rn BlockRead(DataFile, DataNoOne, SizeOf(DataNoOne);rn BlockRead(DataFile, DataNoTwo, SizeOf(DataNoTwo);rn BlockRead(DataFile, DataNoThree, SizeOf(DataNoThree);rn I:=I+1;rn End;rn /=rn CloseFile(DataFile);rn End/数据文件存在rn Elsern MessageDlg(数据文件不存在,请检查程序中文件路径!, mtInformation,mbOk, 0);rnExceptrn MessageDlg(文件读写错误,请检查程序中文件路径!, mtInformation,mbOk, 0);rnEnd;rnEnd;rnrn 二、引用日线数据文件中的数据rn 只要在需要的地方进行调用上述定义的数组即可。部分示例如下: rnProcedureTFormKXianMain.DrawLineInIt(Sender: Tobject);rnVar I,FlagExit,x1:Integer;rnBeginrn If DayCount>0 Thenrn Beginrn BeginDate:=0;rn EndDate:=DayCount-1;rn x1:=LeftX;rn FlagExit:=0;rn I:=DayCount-1;rn While (I>-1) And (FlagExit=0) Dorn Beginrn x1:=x1+DefaultWidth;rn If (x1+DefaultWidth)>(PaintWidth-RightX) Thenrn FlagExit:=1rn Elsern I:=I-1;rn End;rn If (I=-1) Thenrn LeftDate:=0rn Elsern LeftDate:=I;rn RightDate:=DayCount-1;rn CurrentDate:=DayCount-1;rn CurrentX:=x1-Round(DefaultWidth+1)/2);rn End;rnEnd;rnrnProcedureTFormKXianMain.DrawLine(Sender: Tobject);rnVar kpjg,spjg,zgjg,zdjg:Integer;rnVar x1,x2,y1,y2,x3,y3,x4,y4:Integer;rnVar I,Kheight:Integer;rnVar TempString,OutStr:String;rnVar TempLen,StrLen:Integer;rnBeginrn If DayCount>0 Thenrn Beginrn /清空屏幕rn Canvas.Brush.Color:=clblack;rn Canvas.Brush.style:=bsSolid;rn Canvas.FillRect(Rect(0,0,PaintWidth,PaintHeight);rnrn /左边竖直线rn Canvas.Pen.Color:=clRed;rn Canvas.MoveTo(LeftX-1,0);rn Canvas.LineTo(LeftX-1,PaintHeight);rn /上边水平线rn Canvas.MoveTo(0,TopY);rn Canvas.LineTo(PaintWidth,TopY);rn /右边竖直线rn Canvas.MoveTo(PaintWidth-RightX,TopY);rn Canvas.LineTo(PaintWidth-RightX,PaintHeight);rn /下边水平线rn Canvas.MoveTo(0,PaintHeight-BottomY);rn Canvas.LineTo(PaintWidth-RightX,PaintHeight-BottomY);rnrn PageTopY:=PaintHeight-BottomY;rnrn Canvas.Pen.Style:=psDot;rn Canvas.Pen.Color:=clMaroon;rn Canvas.MoveTo(LeftX-1,Round(PageTopY/3);rn Canvas.LineTo(PaintWidth-RightX,Round(PageTopY/3);rn Canvas.MoveTo(LeftX-1,Round(2*PageTopY/3);rn Canvas.LineTo(PaintWidth-RightX,Round(2*PageTopY/3);rnrn Canvas.Pen.style:=psSolid;rnrn /求价格的最大、最小值rn Maxjg:=DayData2LeftDate;rn MinJg:=DayData3LeftDate;rn I:=LeftDate;rn While (I<RightDate) Or (I=RightDate) Dorn Beginrn If DayData2I>MaxJg Thenrn MaxJg:=DayData2I;rn If DayData3I<MinJg Thenrn MinJg:=DayData3I;rn I:=I+1;rn End;rnrn /画右侧成交价格坐标数值rn OutStr:=.;rn Canvas.Font.Color := clRed;rn Canvas.Brush.Color:=clBlack;rn Canvas.Font.Size:=11;rn Canvas.F:=宋体;rn Canvas.Brush.style:=bsSolid;rn Canvas.Pen.color:=clred;rn TempString:=IntToStr(Round(MinJg+(MaxJg-MinJg)*2/3);rn TempLen:=Length(TempString);rn Insert(OutStr,TempString,TempLen-2);rn StrLen:=Length(TempString);rn If TempStringStrLen=0 Thenrn TempStringStrLen:= ;rn Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY/3)-9,TempString);rnrn TempString:=IntToStr(Round(MinJg+(MaxJg-MinJg)/3);rn TempLen:=Length(TempString);rn Insert(OutStr,TempString,TempLen-2);rn StrLen:=Length(TempString);rn If TempStringStrLen=0 Thenrn TempStringStrLen:= ;rn Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY*2/3)-9,TempString);rnrnrn /画K线图rn Kheight:=PageTopY-TopY-10;rn HeightXiShu:=(MaxJg-MinJg)/Kheight;rn x1:=LeftX-DefaultWidth;rn I:=LeftDate;rn While (I<RightDate) Or(I=RightDate) Dorn Beginrn kpjg:=DayData1I;rn spjg:=DayData4I;rn zgjg:=DayData2I;rn zdjg:=DayData3I;rn x1:=x1+DefaultWidth;rn x2:=x1+DefaultWidth-1;rn x3:=Round(x1+x2)/2);rn x4:=x3;rn If spjg<kpjg Thenrn Beginrn Canvas.Pen.Color:=clAqua;rn Canvas.Brush.Color:=clAqua;rn Canvas.Brush.style:=bsSolid;rn y3:=PageTopY-Round(zgjg-MinJg)/HeightXiShu)-2;rn y1:=PageTopY-Round(kpjg-MinJg)/HeightXiShu)-2;rn y2:=PageTopY-Round(spjg-MinJg)/HeightXiShu)-2;rn y4:=PageTopY-Round(zdjg-MinJg)/HeightXiShu)-2;rn If (y1=y2) Thenrn y2:=y2+1;rn If (zgjg=kpjg) Thenrn y3:=y1;rn If (zdjg=spjg) Thenrn y4:=y2;rn If (zgjg<>kpjg) And (y1=y3) Thenrn y3:=y3-1;rn If (zdjg<>spjg) And (y2=y4) Thenrn y4:=y4+1;rn Canvas.MoveTo(x3,y3);rn Canvas.LineTo(x3,y1);rn Canvas.FillRect(Rect(x1,y1,x2,y2);rn Canvas.MoveTo(x4,y2);rn Canvas.LineTo(x4,y4);rn End/收盘价小于开盘价,阴线rn Elsern Beginrn Canvas.Pen.Color:=clred;rn x2:=x2-1;rn y3:=PageTopY-Round(zgjg-MinJg)/HeightXiShu)-2;rn y1:=PageTopY-Round(spjg-MinJg)/HeightXiShu)-2;rn y2:=PageTopY-Round(kpjg-MinJg)/HeightXiShu)-2;rn y4:=PageTopY-Round(zdjg-MinJg)/HeightXiShu)-2;rn If (y1=y2) And (spjg<>kpjg) Thenrn y2:=y2+1;rn If (zdjg=kpjg) Thenrn y4:=y2;rn If (zgjg=spjg) Thenrn y3:=y1;rn If (zdjg<>kpjg) And (y2=y4) Thenrn y4:=y4+1;rn If (zgjg<>spjg) And (y1=y3) Thenrn y3:=y3-1;rn Canvas.MoveTo(x3,y3);rn Canvas.LineTo(x3,y1);rn Canvas.MoveTo(x1,y1);rn Canvas.LineTo(x2,y1);rn Canvas.LineTo(x2,y2);rn Canvas.LineTo(x1,y2);rn Canvas.LineTo(x1,y1);rn Canvas.MoveTo(x4,y2);rn Canvas.LineTo(x4,y4);rn End;/收盘价大于开盘价,阳线rn I:=I+1;rn End;/画K线图rnrnrn Canvas.Font.Color := clRed;rn Canvas.Brush.Color:=clBlack;rn Canvas.Font.Size:=11;rn Canvas.F:=宋体;rn /输出证券名称rn TempString:=ZqjcDataZqRecordNo;rn Canvas.TextOut(1,1,TempString);rn /输出基本信息rn TempString:=代码 ;rn TempString:=TempString+ZqdmDataZqRecordNo+ ;rn TempString:=TempString+流通股本;rn TempString:=TempString+IntToStr(ZqltgbDataZqRecordNo)+ ;rn Canvas.TextOut(LeftX+1,1,TempString);rn End;/数据集中数据个数大于0rnEnd;rnrnProcedureTFormKXianMain.DrawNowLine(Sender: Tobject);rnVar TempStr,OutStr:String;rnVar TempLen,StrLen:Integer;rnBeginrn If DayCount>0 Thenrn Beginrn Canvas.Pen.Color:=clred;rn OutStr:=.;rn Canvas.Font.Color := clRed;rn Canvas.Brush.Color:=clBlack;rn Canvas.Font.Size:=11;rn Canvas.F:=宋体;rn /输出日期rn TempStr:=-+IntToStr(DayData0CurrentDate)+-;rn Canvas.TextOut(2,PaintHeight-BottomY+1,TempStr);rn /输出开盘价rn TempStr:=IntToStr(DayData1CurrentDate);rn TempLen:=Length(TempStr);rn Insert(OutStr,TempStr,TempLen-2);rn StrLen:=Length(TempStr);rn If TempStrStrLen=0 Thenrn TempStrStrLen:= ;rn Canvas.TextOut(1,TopY+1,开盘);rn Canvas.TextOut(41,TopY+1,TempStr);rn /输出最高价rn TempStr:=IntToStr(DayData2CurrentDate);rn TempLen:=Length(TempStr);rn Insert(OutStr,TempStr,TempLen-2);rn StrLen:=Length(TempStr);rn If TempStrStrLen=0 Thenrn TempStrStrLen:= ;rn Canvas.TextOut(1,TopY+21,最高);rn Canvas.TextOut(41,TopY+21,TempStr);rn /输出最低价rn TempStr:=IntToStr(DayData3CurrentDate);rn TempLen:=Length(TempStr);rn OutStr:=.;rn Insert(OutStr,TempStr,TempLen-2);rn StrLen:=Length(TempStr);rn If TempStrStrLen=0 Thenrn TempStrStrLen:= ;rn Canvas.TextOut(1,TopY+41,最低);rn Canvas.TextOut(41,TopY+41,TempStr);rn /输出收盘价rn TempStr:=IntToStr(DayData4CurrentDate);rn TempLen:=Length(TempStr);rn Insert(OutStr,TempStr,TempLen-2);rn StrLen:=Length(TempStr);rn If TempStrStrLen=0 Thenrn TempStrStrLen:= ;rn Canvas.TextOut(1,TopY+61,收盘);rn Canvas.TextOut(41,TopY+61,TempStr);rnrnrn Canvas.MoveTo(LeftX-1,0);rn Canvas.LineTo(LeftX-1,PaintHeight);rnrn Canvas.Pen.Color:=clwhite;rn Canvas.Brush.style:=bsSolid;rn Canvas.MoveTo(CurrentX,TopY);rn Canvas.LineTo(CurrentX,PaintHeight-BottomY);rnrn End;/DayCount>1rnEnd;rnrnrnProcedureTFormKXianMain.MoveLineLeft(Sender: Tobject);rnVar CurrentNow:Integer;rnBeginrnIf CurrentDate>BeginDate ThenrnBeginrn CurrentNow:=CurrentX;rn If CurrentDate<>LeftDate Thenrn CurrentNow:=CurrentX-DefaultWidthrn Elsern Beginrn LeftDate:=LeftDate-1;rn RightDate:=RightDate-1;rn End;rn CurrentDate:=CurrentDate-1;rn CurrentX:=CurrentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rnEnd;rnEnd;rnrnrnProcedureTFormKXianMain.MoveLineRight(Sender: Tobject);rnVar CurrentNow:Integer;rnBeginrnIf CurrentDate<EndDate ThenrnBeginrn CurrentNow:=CurrentX;rn If CurrentDate<>RightDate Thenrn CurrentNow:=CurrentX+DefaultWidthrn Elsern Beginrn LeftDate:=LeftDate+1;rn RightDate:=RightDate+1;rn End;rn CurrentDate:=CurrentDate+1;rn CurrentX:=CurrentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rnEnd;rnEnd;rnrnProcedureTFormKXianMain.MoveLineHome(Sender: Tobject);rnBeginrnIf CurrentDate<>BeginDate ThenrnBeginrn CurrentDate:=LeftDate;rn CurrentX:=LeftX+Round(DefaultWidth/2);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rnEnd;rnEnd;rnrnrnProcedureTFormKXianMain.MoveLineEnd(Sender: Tobject);rnVar CurrentNow:Integer;rnBeginrnIf CurrentDate<>EndDate ThenrnBeginrn CurrentNow:=CurrentX;rn While (CurrentDate<>RightDate) Dorn Beginrn CurrentNow:=CurrentNow+DefaultWidth;rn CurrentDate:=CurrentDate+1;rn End;rn CurrentX:=CurrentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rnEnd;rnEnd;rnrnrnprocedure TFormKXianMain.EditCodeKeyDown(Sender: TObject; var Key: Word;rnShift: TShiftState);rnbeginrnIf (key=VK_RETURN) And (EditCode.Text<>CurrentCode) Thenrn Beginrn CurrentCode:=;rn If ZqdmFind(EditCode.Text)<>-1 Thenrn CurrentCode:=ZqdmDataZqRecordNorn Else If ZqkjmFind(EditCode.Text)<>-1 Thenrn CurrentCode:=ZqdmDataZqRecordNorn Elsern MessageDlg(证券代码不存在,请重新输入!, mtInformation,mbOk, 0);rn EditCode.Text:=;rn If CurrentCode<> Thenrn Beginrn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rn End;rnIf (Key=VK_PRIOR) Then/Page Up keyrn Beginrn If (ZqRecordNo=0) Thenrn ZqRecordNo:=ZqRecordCount-1;rn ZqRecordNo:=ZqRecordNo-1;rn CurrentCode:=ZqdmDataZqRecordNo;rn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_NEXT) Then/Page Down keyrn Beginrn If (ZqRecordNo=(ZqRecordCount-1) Thenrn ZqRecordNo:=0;rn ZqRecordNo:=ZqRecordNo+1;rn CurrentCode:=ZqdmDataZqRecordNo;rn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_DOWN) And (DefaultWidth>3) Then/Virtual key codesrn Beginrn DefaultWidth:=DefaultWidth-2;rn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_UP) And (DefaultWidth<50) Thenrn Beginrn DefaultWidth:=DefaultWidth+2;rn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_HOME) Thenrn MoveLineHome(EditCode);rnIf (Key=VK_END) Thenrn MoveLineEnd(EditCode);rnI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年线上客服代表招聘面试参考题库及答案
- 2025年投资助理招聘面试题库及参考答案
- 2025年教学秘书招聘面试题库及参考答案
- 2025年精益生产经理招聘面试参考题库及答案
- 2025年企业IT支持专员招聘面试参考题库及答案
- 2025年财务风险评估师招聘面试题库及参考答案
- 2025年宣传推广经理招聘面试参考题库及答案
- 2025年速运管理专员招聘面试题库及参考答案
- 2025年工程技术经理招聘面试题库及参考答案
- 2025年大学招生顾问招聘面试题库及参考答案
- 职工困难借款管理办法
- 音乐教师素养知识培训课件
- 小学科学知识竞赛题库(试题及答案)
- 2024年恒瑞医药ESG综合报告:以社会责任推动医药产业的可持续发展
- 医院账务合并方案模板(3篇)
- 护理人文关怀试点病房汇报
- 2025年公共交通智能调度系统采购及运维服务合同
- 2025年北京共青团入团考试题及答案
- 野生动物监测技术
- 预防早恋27安全教育课件
- 东北师范大学《大学日语1》2023-2024学年第一学期期末试卷
评论
0/150
提交评论