重金求购股票分析软件k线图形显示的实现方法。(200分)

  • 主题发起人 主题发起人 huangbaili
  • 开始时间 开始时间
H

huangbaili

Unregistered / Unconfirmed
GUEST, unregistred user!
重金求购股票分析软件k线图形显示的实现方法。
 
这里有源码:
http://delphi.mychangshu.com/dispdoc.asp?id=266
 
自己写吧,远没有想象中的难
 
给个信箱huang!
 
{**********************************************************************}
{*程序描述: 如何用Delphi读钱龙数据画股票k线图范例 *}
{* 程序 : 战晓冬 *}
{* 编译器 : Borland Delphi Enterprise 5.0 (Build5.62)*}
{* Copyright(C) : 战晓冬 2000 *}
{**********************************************************************}
unit StockUn;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, Menus, ExtCtrls, TeeProcs, TeEngine, Chart, mxgraph,
Series, StdCtrls, ArrowCha, Buttons;
type
TStockRec = packed record {定义一个记录,保存股票信息。}
Date: Longint; {时间}
Open:longint; {开盘}
High:longint; {最高价}
Low:longint; {最低价}
Close:longint; {收盘}
Amount:longint; {成交额}
Volume:longint; {成交量}
Topiece:longint;
X1:longint;
X2:longint;
end;

TRecordStream = class(TFileStream)
private
function GetNumRecs: Longint;
function GetCurRec: Longint;
procedure SetCurRec(RecNo: Longint);
protected
function GetRecSize: Longint; virtual;
public
function SeekRec(RecNo: Longint; Origin: Word): Longint;
function WriteRec(const Rec): Longint;
function AppendRec(const Rec): Longint;
function ReadRec(var Rec): Longint;
procedure First;
procedure Last;
procedure NextRec;
procedure PreviousRec;
property NumRecs: Longint read GetNumRecs;
property CurRec: Longint read GetCurRec write SetCurRec;
end;

TStockForm = class(TForm)
StatusBar1: TStatusBar;
Chart1: TChart;
Series1: TLineSeries;
Series2: TFastLineSeries;
Series3: TFastLineSeries;
Series4: TFastLineSeries;
SpeedButton1: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Series1AfterDrawValues(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Chart1AfterDraw(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
OldX,OldY:Longint;
CrossHairColor:TColor;
CrossHairStyle:TPenStyle;
stockRec: TstockRec;
RecordStream: TRecordStream;
DayFile:File of TStockRec;
Fname:String;
procedure ChartADDData;
procedure DrawCross(AX,AY:Integer);
end;


var
StockForm: TStockForm;

implementation

function TRecordStream.GetRecSize:Longint; {返回记录长度}
begin
Result := SizeOf(TStockRec);
end;

function TRecordStream.GetNumRecs: Longint; {返回记录个数}
begin
Result := Size div GetRecSize;
end;

{返回当前记录位置,文件指针通常在记录的开始,而非Position div GetRecSize处。}
function TRecordStream.GetCurRec: Longint;
begin
Result := (Position div GetRecSize) + 1;
end;

procedure TRecordStream.SetCurRec(RecNo: Longint); {通过RecNo将记录定位}
begin
if RecNo > 0 then
Position := (RecNo - 1) * GetRecSize
else
Raise Exception.Create('Cannot go beyond beginning of file.');
end;

{通过RecNo将文件指针定位}
function TRecordStream.SeekRec(RecNo: Longint; Origin: Word): Longint;
begin
Result := Seek(RecNo * GetRecSize, Origin);
end;

function TRecordStream.WriteRec(Const Rec): Longint; {将记录Rec写入流中}
begin
Result := Write(Rec, GetRecSize);
end;

function TRecordStream.AppendRec(Const Rec): Longint; {将记录Rec写入流中}
begin
Seek(0, 2);
Result := Write(Rec, GetRecSize);
end;

function TRecordStream.ReadRec(var Rec): Longint; {从流中读取记录并将指针返回记录开始}
begin
Result := Read(Rec, GetRecSize);
Seek(-GetRecSize, 1);
end;

procedure TRecordStream.First; {将指针返回流的开始}
begin
Seek(0, 0);
end;

procedure TRecordStream.Last; {将指针返回流的末尾}
begin
Seek(0, 2);
Seek(-GetRecSize, 1);
end;

procedure TRecordStream.NextRec; {只要未到文件末尾,就将文件指针定在下一记录处}
begin
if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then
raise Exception.Create('Cannot read beyond end of file')
else
Seek(GetRecSize, 1);
end;

procedure TRecordStream.PreviousRec;{只要未到文件开始,就将文件指针定在前一记录处}
begin
if (Position - GetRecSize >= 0) then
Seek(-GetRecSize, 1)
else
Raise Exception.Create('Cannot read beyond beginning of the file.');
end;


{$R *.DFM}

procedure TStockForm.Chart1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
tmpX,tmpY:Double;
begin
if (OldX<>-1) then
begin
DrawCross(OldX,OldY); {画小十字鼠标}
OldX:=-1;
end;
{检查鼠标是否在图表区}
if PtInRect( Chart1.ChartRect, Point(X-Chart1.Width3D,Y+Chart1.Height3D)) then
begin
DrawCross(x,y); {在当前位置画十字准线}
OldX:=x; {保存旧位置}
OldY:=y;
With Series1 do {设置标签文本}
begin
GetCursorValues(tmpX,tmpY); {获取鼠标位置数据}
Label1.Caption:=GetVertAxis.LabelValue(tmpY)+' '+
GetHorizAxis.LabelValue(tmpX);
end;
end;
end;


procedure TStockForm.FormCreate(Sender: TObject);
begin
OldX:=-1; {初始化变量}
CrossHairColor:=clRed; {颜色}
CrossHairStyle:=psSolid; {线形}
Fname:='600734.Day';
if FileExists(FName) then
RecordStream := TRecordStream.Create(FName, fmOpenReadWrite)
else
RecordStream := TRecordStream.Create(FName, fmCreate);
end;

procedure TStockForm.FormDestroy(Sender: TObject);
begin
RecordStream.Free;
end;

procedure TStockForm.FormActivate(Sender: TObject);
begin
RecordStream.Last;
ChartADDData;
while (((RecordStream.Position + 40) div 40) > RecordStream.NumRecs-9) do
begin
RecordStream.PreviousRec;
ChartADDData;
end;
end;

procedure TStockForm.ChartADDData;
var
FormatDayLineDateYear,FormatDayLineDateMonth,
FormatDayLineDateDay,FormatDayLineDate,DayLineDate:string;
begin
RecordStream.ReadRec(stockRec);
DayLineDate:=IntToStr(StockRec.Date);{将日期数转化成字符串}
FormatDayLineDateYear:=Copy(DayLineDate,2,2);{分离出年}
FormatDayLineDateMonth:=Copy(DayLineDate,5,2);{分离处月}
FormatDayLineDateDay:=Copy(DayLineDate,7,2); {分离出日}
FormatDayLineDate:=Concat(FormatDayLineDateYear,'-',FormatDayLineDateMonth,'-',FormatDayLineDateDay);

Series1.Add((stockRec.open / 1000),FormatDayLineDate,clBlack);
Series2.Add((stockRec.close / 1000),FormatDayLineDate,clTeeColor);
Series3.Add((stockRec.Low / 1000),FormatDayLineDate,clTeeColor);
Series4.Add((stockRec.High / 1000),FormatDayLineDate,clTeeColor);
end;

procedure TStockForm.DrawCross(AX,AY:Integer); {画十字线鼠标}
begin
With Chart1,Canvas do
begin
Pen.Color:=CrossHairColor; {画笔颜色}
Pen.Style:=CrossHairStyle; {画笔类型}
Pen.Mode:=pmXor; {如何画线}
Pen.Width:=1; {画笔宽度}
MoveTo(ax,ChartRect.Top-Height3D);
LineTo(ax,ChartRect.Bottom-Height3D);
MoveTo(ChartRect.Left+Width3D,ay);
LineTo(ChartRect.Right+Width3D,ay);
end;
end;

procedure TStockForm.Series1AfterDrawValues(Sender: TObject);
begin
OldX:=-1; {重置鼠标原来位置}
end;

procedure TStockForm.SpeedButton1Click(Sender: TObject);
begin
Series1.Clear;
RecordStream.First;
ChartADDData;
while ((RecordStream.Position + 40) div 40) < RecordStream.NumRecs do
begin
RecordStream.NextRec;
ChartADDData;
end;
RecordStream.last;
ChartADDData;
end;

procedure TStockForm.Chart1AfterDraw(Sender: TObject); {画阴阳线}
var
XValueNO:integer; {X轴点}
begin
With Chart1,Canvas do
begin
for XValueNO:=0 to Series1.LastValueIndex do
begin
begin
if (Series1.CalcyPos(XValueNO) < Series2.CalcyPos(XValueNO)) then
begin
Brush.Color:=clWhite;
Pen.Color:=clWhite; {画笔颜色}
end
else
begin
Brush.Color:=clRed;
Pen.Color:=clRed;
end;
end;
Pen.Style:=pssolid; {画笔类型}
Pen.Width:=1;
begin
MoveTo(Series3.CalcXPos(XValueNO) ,Series3.CalcyPos(XValueNO));
LineTo(Series4.CalcXPos(XValueNO) ,Series4.CalcyPos(XValueNO));
Rectangle(Series1.CalcXPos(XValueNO)-5,Series1.CalcyPos(xValueNO),
Series1.CalcXPos(XValueNO)+5,Series2.CalcyPos(xValueNO));
end;
end;
end;
end;

end.
 
用teechar很容易实现
 
blockread->list->:)
 
找一个Teechart Pro版本,里面提供了画K线图的方法,Delphi带的是标准版不提供该功能!
 
让你10分钟可以开发出一套自己的股票分析软件
我花了几年的时间,终于开发了一组证券分析专用的VCL,比分析家更为开发的平台,是用BCB写的。
普通分析软件有的不说了,分析家及后来的分析软件都有的自定义指标也不谈。
有什么特色?
一、C语言脚本
支持变量(简化标准C的类型定义,所有变量声明成Var,没有char int float 之分),
支持if else 分支(可内嵌多层),支持for循环(可内嵌多层),支持自定义函数。
一句话,除了复杂易错的类型定义和指针外,标准C所有的功能我的脚本都支持。
二、插件技术
你只要按一定的规范写一个DLL话在指定的地方,系统会自动加载并在菜单上显示调用,
而且,你的DLL可以访问所有的需要的资源,与系统内部写的功能块并无两样,你可以
取得行情相关的所有数据,可以取得指标计算的结果,可以直接调用C语言脚本解释器,
你可以……
三、窗口自由分割
一个窗口是一个完整的分析系统,而每个窗口又可以一分为二,二分为三或为四……,
分割后的窗口还是一个完整的分析系统,还可以再一分为二……,这功能在国内还少见,
但国外的一些期货软件早就有这功能了。
四、彻头彻尾的二次开发
前面提到的C语言脚本可以支持二次开发,但如果你想做一个全新的系统的话,有一个更好
的途径: 完整的分析功能最后整合到一个控件中(象做记事本时使用的TMemo或TRichEdit),
你可以在五分钟之内做成一个完整的分析软件,当然,你可以花更多的时间去制作你自己
特有的功能,而且,你可以调用前面提到的所有功能,得到前面提到的所有好处,什么指标
呀脚本呀所有的数据呀……,而且,你可以把你做的系统再次推广应用。

想看看效果吗?
http://www.StockViews.Info/Test/Index.htm (大小写敏感,建议直接拷贝到IE的地址框中)
 
StockExplorer:
你好,效果不错,能进一步沟通一下吗?
luhaiyan@x263.net
 
如果需要,请在晚上上MSN找我,我的账号是 StockViews@msn.com
有控件(包括数据接收、存储和管理),还有各控件的测试用例,你说的示例项目一定是有的。
但提醒一下,控件的功能还没有十分完善,而文档还不是足够,所以第一次使用时最好在MSN上
与你聊聊安装及使用的方法。如果没有特殊情况,我每天晚上都在线的。
 
zhihuali
能了源码吗?谢了!
mylhb2002@yahoo.com.cn
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部