⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kxianmain.pas

📁 这是一个用Delphi开发的读取K线的股票分析系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit KXianMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Menus;

type
  TFormKXianMain = class(TForm)
    PaintBoxMain: TPaintBox;
    PanelMain: TPanel;
    EditCode: TEdit;
    MainFormMenu: TMainMenu;
    NXiTongGongJu: TMenuItem;
    NShuJuYuanSheZhi: TMenuItem;
    NTuiChu: TMenuItem;
    LabelCode: TLabel;
    procedure FormShow(Sender: TObject);
    procedure ReadData(Sender: Tobject);
    Procedure DrawLineInIt(Sender: Tobject);
    Procedure DrawLine(Sender: Tobject);
    Procedure MoveLineLeft(Sender: Tobject);
    Procedure MoveLineRight(Sender: Tobject);
    Procedure MoveLineHome(Sender: Tobject);
    Procedure MoveLineEnd(Sender: Tobject);
    Procedure DrawNowLine(Sender: Tobject);
    procedure EditCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure PaintBoxMainPaint(Sender: TObject);
    procedure NTuiChuClick(Sender: TObject);
    procedure NShuJuYuanSheZhiClick(Sender: TObject);
    procedure PaintBoxMainMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormKXianMain: TFormKXianMain;
  CurrentX,MouseX,MouseY:Integer;
  PaintHeight,PaintWidth,TopY,BottomY,LeftX,RightX:Integer;
  MaxJg,MinJg,DefaultWidth,DayCount:Integer;
  HeightXiShu:Double;
  CurrentCode:String;
  BeginDate,EndDate,LeftDate,RightDate,CurrentDate:Integer;
  PageTopY,PageMidY,PageLowY:Integer;
  DayPathName:String;

  //证券信息数据
  ZqdmData,ZqjcData,ZqkjmData:Array of String;
  ZqzgbData,ZqltgbData:Array of Integer;
  ZqRecordNo,ZqRecordCount:Integer;
  //日线数据定义
  DayData:Array of Array of Integer;

implementation

uses UnitShuJuYuan;

{$R *.DFM}


Function ZqdmFind(Zqdm:String):Integer;
Var I:Integer;
Begin
   ZqdmFind:=-1;
   I:=0;
   While (I<ZqRecordCount) Do
   Begin
      If Trim(UpperCase(ZqdmData[I]))<>Trim(UpperCase(Zqdm)) Then
         I:=I+1
      Else
         Begin
         ZqdmFind:=I;
         ZqRecordNo:=I;
         Exit;
         End;
   End;
End;

Function ZqkjmFind(Zqkjm:String):Integer;
Var I:Integer;
Begin
   ZqkjmFind:=-1;
   I:=0;
   While (I<ZqRecordCount) Do
   Begin
      If Trim(UpperCase(ZqkjmData[I]))<>Trim(UpperCase(Zqkjm)) Then
         I:=I+1
      Else
         Begin
         ZqkjmFind:=I;
         ZqRecordNo:=I;
         Exit;
         End;
   End;
End;


procedure TFormKXianMain.FormShow(Sender: TObject);
Var ShuJuYuanFile,ZqxxFile:TextFile;
Var TempString:String;
Var I:integer;
begin
  Try
    PaintHeight:=PaintBoxMain.Height;
    PaintWidth:=PaintBoxMain.Width;
    DefaultWidth:=9;
    LeftX:=100;
    RightX:=120;
    TopY:=20;
    BottomY:=20;
    DayPathName:='';
    DayCount:=-1;
    CurrentCode:='';
    BeginDate:=0;
    EndDate:=0;
    LeftDate:=0;
    RightDate:=0;


    If FileExists('ShuJu.Txt') Then
    Begin
       AssignFile(ShuJuYuanFile, 'ShuJu.Txt');
       FileMode:=0;  //Set file access to read only
       Reset(ShuJuYuanFile);
       Readln(ShuJuYuanFile,TempString);
       DayPathName:=TempString;
       CloseFile(ShuJuYuanFile);
    End;
    If FileExists('Zqxx.Txt') Then
    Begin
       AssignFile(ZqxxFile, 'Zqxx.Txt');
       FileMode := 0;  //Set file access to read only
       Reset(ZqxxFile);
       ZqRecordCount:=0;
       while not Eof(ZqxxFile) do
         Begin
         Readln(ZqxxFile,TempString);
         Readln(ZqxxFile,TempString);
         Readln(ZqxxFile,TempString);
         Readln(ZqxxFile,TempString);
         Readln(ZqxxFile,TempString);
         ZqRecordCount:=ZqRecordCount+1;
         End;
       SetLength(ZqdmData,ZqRecordCount);
       SetLength(ZqjcData,ZqRecordCount);
       SetLength(ZqkjmData,ZqRecordCount);
       SetLength(ZqzgbData,ZqRecordCount);
       SetLength(ZqltgbData,ZqRecordCount);
       Reset(ZqxxFile);
       I:=0;
       while not Eof(ZqxxFile) do
       Begin
         Readln(ZqxxFile,TempString);
         ZqdmData[I]:=TempString;
         Readln(ZqxxFile,TempString);
         ZqjcData[I]:=TempString;
         Readln(ZqxxFile,TempString);
         ZqkjmData[I]:=TempString;
         Readln(ZqxxFile,TempString);
         ZqzgbData[I]:=StrToInt(TempString);
         Readln(ZqxxFile,TempString);
         ZqltgbData[I]:=StrToInt(TempString);
         I:=I+1;
       End;
    End;
    EditCode.Left:=PaintWidth-EditCode.Width-5;
    LabelCode.Left:=EditCode.Left-LabelCode.Width-2;
    Canvas.Brush.Color:=clblack;
    Canvas.Brush.style:=bsSolid;
    Canvas.FillRect(Rect(0,0,PaintWidth,PaintHeight));
    ActiveControl:=EditCode;
  Except
  MessageDlg('初始化失败,程序退出!', mtInformation,[mbOk], 0);
  End;
end;


Procedure  TFormKXianMain.ReadData(Sender: Tobject);
Var I:Integer;
Var FileName:String;
Var DataFile:File;
Var DataDate: LongWord;
Var DataOpen: LongWord;
Var DataHigh: LongWord;
Var DataLow: LongWord;
Var DataClose: LongWord;
Var DataShuLiang: LongWord;
Var DataJinE: LongWord;
Var DataNoOne: LongWord;
Var DataNoTwo: LongWord;
Var DataNoThree: LongWord;
Begin
  Try
    DayCount:=0;
    FileName:=DayPathName+'\'+CurrentCode+'.day';
    If FileExists(FileName) Then
    Begin
    AssignFile(DataFile, Filename);
    Reset(DataFile,1);
    DayCount:=Round(FileSize(DataFile)/40);
    //基本数据
    SetLength(DayData,7);
    For I := Low(DayData) to High(DayData) do
       SetLength(DayData[I],DayCount);
    I:=0;
    while not Eof(DataFile) do
    Begin
        BlockRead(DataFile, DataDate, SizeOf(DataDate));
        DayData[0][I]:=Not DataDate;
        BlockRead(DataFile, DataOpen, SizeOf(DataOpen));
        DayData[1][I]:=Not DataOpen; //Open
        BlockRead(DataFile, DataClose, SizeOf(DataHigh));
        DayData[4][I]:=Not DataClose; //Close
        BlockRead(DataFile, DataHigh, SizeOf(DataLow));
        DayData[2][I]:=Not DataHigh;  //High
        BlockRead(DataFile, DataLow, SizeOf(DataClose));
        DayData[3][I]:=Not DataLow; //Low
        BlockRead(DataFile, DataJinE, SizeOf(DataShuLiang));
        DayData[5][I]:=Not DataJinE;//Jin E
        BlockRead(DataFile, DataShuLiang, SizeOf(DataJinE));
        DayData[6][I]:=Not DataShuLiang;//Shu Liang
        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);
Var I,FlagExit,x1:Integer;
Begin
    If DayCount>0 Then
    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);
Var kpjg,spjg,zgjg,zdjg:Integer;
Var x1,x2,y1,y2,x3,y3,x4,y4:Integer;
Var I,Kheight:Integer;
Var TempString,OutStr:String;
Var TempLen,StrLen:Integer;
Begin
    If DayCount>0 Then
    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
           If DayData[2][I]>MaxJg Then
              MaxJg:=DayData[2][I];
           If DayData[3][I]<MinJg Then
              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);
      If TempString[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);
      If TempString[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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -