




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、大智慧日 K 線的數(shù)據(jù)結(jié)構(gòu)rn 大智慧股票行情軟件是目前應用廣泛的一個炒股工具,有時我們需要自編炒股的算法進行研究,如 提取某只股票的收盤價,成交量等,這時候如果能直接讀大智慧股票分析系統(tǒng)的數(shù)據(jù)格式,將對軟件的編 制帶來極大的方便。 (注:大智慧用的錢龍數(shù)據(jù)格式,本文適用于錢龍股票行情軟件中的日 k 線數(shù)據(jù))。本 文主要描述了在 Delphi 下大智慧日 K 線的數(shù)據(jù)結(jié)構(gòu),和以動態(tài)數(shù)組方式提取數(shù)據(jù)的方法。rn 一、數(shù)據(jù)文件和數(shù)據(jù)結(jié)構(gòu):rnrn大智慧數(shù)據(jù)文件和數(shù)據(jù)結(jié)構(gòu):上海日線存儲路徑為rn上海周線存儲路徑為rn上海月線存儲路徑為假設(shè)大智慧股票行情軟件安裝在 D:dzh 目錄下) :D:dzhD
2、ATASHaseDay, 文件擴展名為 :.day :D:dzhDATASHaseweek, 文件擴展名為 : .wek :D:dzhDATASHasemonth, 文件擴展名為 : .mntrn深圳日線存儲路徑為:D:dzhDATASZnseDayrn深圳周線存儲路徑為:D:dzhDATASZnseweekrn深圳月線存儲路徑為:D:dzhDATASZnsemonthrn周線 ,月線格式與日線格式一致rn 以深發(fā)展日線為例 : rn 1A76:0100 D6 CD 2F 01 52 07 01 00-52 07 01 00 52 07 01 00rn1A76:0110 52 07 01 00
3、 86 0F 00 00-4D 02 00 00 00 00 00 00rn1A76:0120 00 00 00 00 00 00 00 00-D7 CD 2F 01 60 03 01 00rn1A76:0130 60 03 01 00 60 03 01 00-60 03 01 00 82 05 00 00 rn 1A76:0140 D4 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 rnrn 每一條記錄的長度為 40 字節(jié) : rn1-4 字節(jié)為日期 ,D6 CD 2F 01 轉(zhuǎn)換為十進制是 :19910102rn5-8 字節(jié)= 開盤價 (元)*1
4、000rn9-12 字節(jié)=最高價 (元)*1000rn13-16 字節(jié)= 最低價(元)*1000rn17-20 字節(jié)= 收盤價(元)*1000rn21-24 字節(jié)=成交金額 (元)/1000rn25-28 字節(jié)= 成交量(手)rn 其余 12 字節(jié)未使用rn 實現(xiàn)步驟:rn1 、先定義日線數(shù)據(jù)結(jié)構(gòu)數(shù)組rn2 、再以實際記錄數(shù)分配動態(tài)數(shù)組空間rn3 、然后把數(shù)據(jù)讀入相應數(shù)組中rnrnProcedure TFormKXianMain.ReadData(Sender: Tobject);/ 讀取日 k 線數(shù)據(jù)文件中的開盤價、最高價、 最低價、收盤價、成交金額、成交量rnVar I:Integer;r
5、nVar FileName:String;/ 日 k 線數(shù)據(jù)文件rnVar DataFile:File;rn/ 定義日線數(shù)據(jù)結(jié)構(gòu)數(shù)組 rnVar DataDate: LongWord;/ 日期數(shù)組rnVar DataOpen: LongWord;/ 開盤價數(shù)組rnVar DataHigh: LongWord;/ 最高價數(shù)組rnVar DataLow: LongWord;/ 最低價數(shù)組rnVar DataClose: LongWord;/ 收盤價數(shù)組rnVar DataShuLiang: LongWord;/ 成交量數(shù)組rnVar DataJinE: LongWord;/ 成交金額數(shù)組rnVar
6、 DataNoOne: LongWord;rnVar DataNoTwo: LongWord;rnVar DataNoThree: LongWord;rn/rnBeginrn Tryrn DayCount:=0;rn FileName:= D:dzhDATASZnseDa0y001.day 此;/處/ 根據(jù)文件的具體路徑填寫rnIf FileExists(FileName) Thenrn Beginrn AssignFile(DataFile, Filename);rn Reset(DataFile,1);rn / 以實際記錄數(shù)分配動態(tài)數(shù)組空間 rn DayCount:=Round(FileS
7、ize(DataFile)/40);rn / 基本數(shù)據(jù)rn SetLength(DayData,7);rnFor I := Low(DayData) to High(DayData) dorn SetLength(DayDataI,DayCount);rn I:=0;rn /rn /= 把數(shù)據(jù)讀入相應數(shù)組中 =rn while not Eof(DataFile) dorn BeginrnBlockRead(DataFile, DataDate, SizeOf(DataDate);rnDayData0I:=DataDate;/ 讀取日期數(shù)據(jù)放入日期數(shù)組中rnBlockRead(DataFile,
8、 DataOpen, SizeOf(DataOpen);rnDayData1I:=DataOpen; /讀取開盤數(shù)據(jù)放入開盤數(shù)組中rnBlockRead(DataFile, DataClose, SizeOf(DataHigh);rnDayData4I:=DataClose; /讀取收盤數(shù)據(jù)放入收盤數(shù)組中rnBlockRead(DataFile, DataHigh, SizeOf(DataLow);rnDayData2I:=DataHigh; /讀取最高價數(shù)據(jù)放入最高價數(shù)組中rnBlockRead(DataFile, DataLow, SizeOf(DataClose);rnDayData3I
9、:=DataLow; / 讀取最低價數(shù)據(jù)放入最低價數(shù)組中rnBlockRead(DataFile, DataJinE, SizeOf(DataShuLiang);rnDayData5I:=Not DataJinE;/ 讀取成交金額數(shù)據(jù)放入成交金額數(shù)組中rnBlockRead(DataFile, DataShuLiang, SizeOf(DataJinE);rnDayData6I:=DataShuLiang;/ 讀取成交量數(shù)據(jù)放入成交量數(shù)組中rnBlockRead(DataFile, DataNoOne, SizeOf(DataNoOne);rnBlockRead(DataFile, DataN
10、oTwo, SizeOf(DataNoTwo);rnBlockRead(DataFile, DataNoThree, SizeOf(DataNoThree);rnI:=I+1;rn End;rn /=rn CloseFile(DataFile);rn End/ 數(shù)據(jù)文件存在rn Elsern MessageDlg( 數(shù)據(jù)文件不存在,請檢查程序中文件路徑 ! , mtInformation,mbOk, 0);rn Exceptrn MessageDlg( 文件讀寫錯誤,請檢查程序中文件路徑 ! , mtInformation,mbOk, 0);rn End;rnEnd;rnrn 二、引用日線數(shù)據(jù)
11、文件中的數(shù)據(jù)rn 只要在需要的地方進行調(diào)用上述定義的數(shù)組即可。部分示例如下:rnProcedure TFormKXianMain.DrawLineInIt(Sender: Tobject);rnVar I,FlagExit,x1:Integer;rnBeginrnIf DayCount>0 Thenrn BeginrnBeginDate:=0;rnEndDate:=DayCount-1;rnx1:=LeftX;rnFlagExit:=0;rnI:=DayCount-1;rnWhile (I>-1) And (FlagExit=0) DornBeginrnx1:=x1
12、+DefaultWidth;rnIf (x1+DefaultWidth)>(PaintWidth-RightX) Thenrn FlagExit:=1rnElsernI:=I-1;rnEnd;rnIf (I=-1) ThenrnLeftDate:=0rnElsernLeftDate:=I;rnRightDate:=DayCount-1;rnCurrentDate:=DayCount-1;rnCurrentX:=x1-Round(Defaul tWidth+1)/2);rn End;rnEnd;rnrnProcedure TFormKXianMain.DrawLine(Sender
13、: 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;rnBeginrnIf DayCount>0 ThenrnrnBegin/清空屏幕rnCanvas.Brush.Color:=clblack;rnCanvas.Brush.style:=bsSolid;rnrnCanvas.FillRect(R ect
14、(0,0,PaintWidth,PaintHeight);rn/ 左邊豎直線rnCanvas.Pen.Color:=clRed;rnCanvas.MoveTo(LeftX-1,0);rnCanvas.LineTo(LeftX-1,PaintHeight);rn/ 上邊水平線rnrnCanvas.MoveTo(0,TopY);Canvas.LineTo(PaintWidth,TopY);rn/ 右邊豎直線rnCanvas.MoveTo(PaintWidth-RightX,TopY);rnCanvas.LineTo(PaintWidth-RightX,PaintHeight);rn/ 下邊水平線r
15、nCanvas.MoveTo(0,PaintHeight-BottomY);rnCanvas.LineTo(PaintWidth-RightX,PaintHeight-BottomY);rnrnPageTopY:=PaintHeight-BottomY;rnrnCanvas.Pen.Style:=psDot;rnCanvas.Pen.Color:=clMaroon;rnCanvas.MoveTo(LeftX-1,R ound(PageTopY/3);rnCanvas.LineTo(PaintWidth-RightX,Round(PageTopY/3);rnCanvas.MoveTo(LeftX
16、-1,R ound(2*PageTopY/3);rnCanvas.LineTo(PaintWidth-RightX,Round(2*PageTopY/3);rnrnrnCanvas.Pen.style:=psSolid;rn/ 求價格的最大、最小值rnMaxjg:=DayData2LeftDate;rnMinJg:=DayData3LeftDate;rnI:=LeftDate;rnWhile (I<RightDate) Or (I=RightDate) DornBeginrnIf DayData2I>MaxJg Thenrn rn rn rn rn rn rn rn
17、 rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnMaxJg:=DayData2I;If DayData3I<MinJg ThenMinJg:=DayData3I;I:=I+1;End;/ 畫右側(cè)成交價格坐標數(shù)值OutStr:= . ;Canvas.Font.Color := clRed;Canvas.Brush.Color:=clBlack;Canvas.Font.Size:=11;Canvas.F
18、:= 宋體;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);If TempStringStrLen=Then 0 TempStringStrLen:= ;Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY/3
19、)-9,TempString);TempString:=IntToStr(Round(MinJg+(MaxJg-MinJg)/3); TempLen:=Length(TempString);Insert(OutStr ,TempString,TempLen-2);StrLen:=Length(TempString);If TempStringStrLen= 0 ThenTempStringStrLen:= ;Canvas.TextOut(PaintWidth-RightX+2,Round(PageTopY*2/3)-9,TempString);/畫 K 線圖Kheight:=PageTopY-
20、TopY-10;HeightXiShu:=(MaxJg-MinJg)/Kheight;x1:=LeftX-DefaultWidth;I:=LeftDate;While (I<RightDate) Or (I=RightDate) DoBeginkpjg:=DayData1I;spjg:=DayData4I;zgjg:=DayData2I;zdjg:=DayData3I;x1:=x1+DefaultWidth;x2:=x1+DefaultWidth-1;rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn
21、 rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnx3:=R ound(x1+x2)/2);x4:=x3;If spjg<kpjg ThenBeginCanvas.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:=P
22、ageTopY-Round(spjg-MinJg)/HeightXiShu)-2;y4:=PageTopY-Round(zdjg-MinJg)/HeightXiShu)-2;If (y1=y2) Theny2:=y2+1;If (zgjg=kpjg) Theny3:=y1;If (zdjg=spjg) Theny4:=y2;If (zgjg<>kpjg) And (y1=y3) Theny3:=y3-1;If (zdjg<>spjg) And (y2=y4) Theny4:=y4+1;Canvas.MoveTo(x3,y3);Canvas
23、.LineTo(x3,y1);Canvas.FillRect(Rect(x1,y1,x2,y2);Canvas.MoveTo(x4,y2);Canvas.LineTo(x4,y4);End/ 收盤價小于開盤價,陰線ElseBeginCanvas.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-
24、Round(zdjg-MinJg)/HeightXiShu)-2;If (y1=y2) And (spjg<>kpjg) Theny2:=y2+1;If (zdjg=kpjg) Theny4:=y2;If (zgjg=spjg) Theny3:=y1;If (zdjg<>kpjg) And (y2=y4) Theny4:=y4+1;If (zgjg<>spjg) And (y1=y3) Thenrny3:=y3-1;rnCanvas.MoveTo(x3,y3);rnCanvas.LineTo(x3,y1);rn
25、Canvas.MoveTo(x1,y1);rnCanvas.LineTo(x2,y1);rnCanvas.LineTo(x2,y2);rnCanvas.LineTo(x1,y2);rnCanvas.LineTo(x1,y1);rnCanvas.MoveTo(x4,y2);rnCanvas.LineTo(x4,y4);rnEnd;/ 收盤價大于開盤價,陽線rnI:=I+1;rnEnd;/ 畫 K 線圖rnrnrnCanvas.Font.Color := clRed;rnCanvas.Brush.Color:=clBlack;rnrnCanvas.Font.Size:=11;Canvas.Font
26、.name:= 宋體;rn/ 輸出證券名稱rnTempString:=ZqjcDataZqRecordNo;rnCanvas.TextOut(1,1,TempString);rn/ 輸出基本信息rnTempString:= 代碼 ;rnTempString:=TempString+ZqdmDataZqR ecordNo+ rnTempString:=TempString+ 流通股本 ;rnTempString:=TempString+IntToStr(ZqltgbDataZqRecordNo)+rnrnCanvas.TextOut(LeftX+1,1,TempString);End;/ 數(shù)據(jù)集
27、中數(shù)據(jù)個數(shù)大于 0rnEnd;rnrnProcedure TFormKXianMain.DrawNowLine(Sender: Tobject);rnVar TempStr ,OutStr:String;rnVar TempLen,StrLen:Integer;rnBeginrnIf DayCount>0 ThenrnBeginrnCanvas.Pen.Color:=clred;rnOutStr:= . ;rnCanvas.Font.Color := clRed;rnCanvas.Brush.Color:=clBlack;rnCanvas.Font.Size:=11;rnCanv
28、as.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 Te
29、mpStr StrLen:= ;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,To
30、pY+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
31、.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
32、 Canvas.MoveTo(LeftX-1,0);rn Canvas.LineTo(LeftX-1,PaintHeight);rnrn Canvas.Pen.Color:=cl w hite;rn Canvas.Brush.style:=bsSolid;rn Canvas.MoveTo(CurrentX,TopY);rn Canvas.LineTo(CurrentX,PaintHeight-BottomY);rnrn End;/DayCount>1rnEnd;rnrnrnProcedure TFormKXianMain.MoveLineLeft(Sender: Tobject)
33、;rnVar CurrentNow:Integer;rnBeginrn If CurrentDate>BeginDate Thenrn Beginrn CurrentNow:=CurrentX;rn If CurrentDate&l t;>LeftDate ThenrnCurrentNow:=CurrentX-DefaultWidthrn ElsernBeginrnLeftDate:=LeftDate-1;rnRightDate:=RightDate-1;rnEnd;rn CurrentDate:=CurrentDate-1;rn CurrentX:=Cur
34、rentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnEnd;rnrnrnProcedure TFormKXianMain.MoveLineRight(Sender: Tobject);rnVar CurrentNow:Integer;rnBeginrn If CurrentDate<EndDate Thenrn Beginrn CurrentNow:=CurrentX;rnIf CurrentDate&l t;>RightDate ThenrnCurrentNow:=CurrentX
35、+DefaultWidthrn ElsernBeginrnLeftDate:=LeftDate+1;rnRightDate:=RightDate+1;rnEnd;rn CurrentDate:=CurrentDate+1;rn CurrentX:=CurrentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnEnd;rnrnProcedure TFormKXianMain.MoveLineHome(Sender: Tobject);rnBeginrn If CurrentDate<>BeginD
36、ate Thenrn Beginrn CurrentDate:=LeftDate;rn CurrentX:=LeftX+Round(DefaultWidth/2);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnEnd;rnrnrnProcedure TFormKXianMain.MoveLineEnd(Sender: Tobject);rnVar CurrentNow:Integer;rnBeginrn If CurrentDate<>EndDate Thenrn Beginrn CurrentNow
37、:=CurrentX;rn While (CurrentDate<>RightDate) DornBeginrn CurrentNow:=CurrentNow+Defaul tWidth;rnCurrentDate:=CurrentDate+1;rnEnd;rn CurrentX:=CurrentNow;rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnEnd;rnrnrnprocedure TFormKXianMain.EditCodeKeyDown(Sender: TObject; var Key:
38、Word; rn Shift: TShiftState);rnbeginrnIf (key=VK_RETURN) And (Edi t Code.Text<>CurrentCode) Thenrn BeginrnCurrentCode:= ;rnIf ZqdmFind(Edi t Code.Text)<>-1 Thenrn CurrentCode:=ZqdmDataZqR ecordNornElse If ZqkjmFind(EditCode.Text)<>-1 ThenrnCurrentCode:=ZqdmD
39、ataZqR ecordNorn ElsernMessageDlg( 證券代碼不存在,請重新輸入 ! , mtInformation,mbOk, 0);rnEdit Code.Text:= ;rnIf 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
40、(ZqR ecordNo=0) Thenrn ZqRecordNo:=ZqR ecordCount-1;rn ZqRecordNo:=ZqRecordNo-1;rn CurrentCode:=ZqdmDataZqR ecordNo;rn ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_NEXT) Then/Page Down keyrn Beginrn If (ZqR ecordNo=(ZqRecordCount-1)
41、Thenrn ZqRecordNo:=0;rn ZqRecordNo:=ZqRecordNo+1;rn CurrentCode:=ZqdmDataZqR ecordNo;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:=Defaul t Width-2;rn
42、 ReadData(EditCode);rn DrawLineInit(EditCode);rn DrawLine(EditCode);rn DrawNowLine(EditCode);rn End;rnIf (Key=VK_UP) And (DefaultWidth<50) Thenrn Beginrn DefaultWidth:=Defaul t Width+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 MoveLineEn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論