在本站下站了一个简易股票小软件,据说是台湾人编写的,能显示K线、成交量及MACD指标,能看到源码,软件大小仅600K左右..。看很久,找到最一段源码是读取股票数据文件的(Result := '.\DATA\K\'+FStockName+'.DAT';)。数据格式是DAT,我把DAT格式换成通达信股票数据DAY的(Result := '.\DATA\K\'+FStockName+'.DAY';), 怎么不显示 K线图呢?源码哪下,请高手指点能否改为通达信股票数据DAY格式,并显示K线图。
原 源码如下:
unit fDef;
interface
uses Classes;
type
{ TArrayOfSingle }
TArrayOfSingle = array of Single;
TArrayOfInteger= array of Integer;
{ TStkDataRec }//0000,13100,13100X(nonEtron),13171X(nonBank),17100
PStkDataRec = ^TStkDataRec;
TStkDataRec = packed record
Date: TDateTime; //时间
OP,HP,LP,CP,VOL: Single; //Μ线,开盘价,最高价,最低价,收盘价,成交量
end;
{ IBaseDataFile }
IBaseDataFile = interface(IUnknown)
function getCount: Integer;
function getFileName: string;
function getHeader: Pointer;
function getHeaderSize: Integer;
function getRec(Index: Integer): Pointer;
function getRecSize: Integer;
procedure loadFromFile(const FileName: string);
procedure saveAs(FileName: string);
Function seek(Index: Integer): Pointer;
end;
{ TBaseDataFile }
TBaseDataFile = class(TInterfacedObject, IBaseDataFile)
protected
M: TMemoryStream;
protected
function getCount: Integer; virtual;
function getHeader: Pointer; virtual;
function getRec(Index: Integer): Pointer; virtual;
function seek(Index: Integer): Pointer; virtual;
procedure loadFromFile(const FileName: string); virtual;
procedure saveAs(FileName: string); virtual;
protected
function getFileName: string; virtual; abstract;
function getHeaderSize: Integer; virtual;
function getRecSize: Integer; virtual; abstract;
public
constructor Create; virtual;
destructor Destroy; override;
end;
{ IDataFile }
//function getData(Date: WORD): Pointer;->Date<MAX_DATADAY means Index from tail toward header, or Search data by Date
IDataFile = interface(IBaseDataFile)
function getData(Date: WORD): Pointer;
function getStockName: string;
function indexOf(Date: WORD): Integer; overload; //Search by Date, Index from header to tail
function indexOf(Date: WORD; L,H: Integer): Integer; overload;//Search by Date, Index from header to tail
function getCP: TArrayOfSingle;
function getUD: TArrayOfSingle;
function getVOL: TArrayOfSingle;
procedure save;
end;
{ TDataFile }
TDataFile = class(TBaseDataFile, IDataFile)
protected
FStockName: string;
function FindData(Date: WORD; L,H: Integer): Pointer; virtual;
function RecStart: Integer; virtual;
protected//implementation of interface function//
function getFileName: string; override;
function getRecSize: Integer; override;
function getData(Date: WORD): Pointer; virtual;
function getStockName: string; virtual;
function indexOf(Date: WORD): Integer; overload; //Search by Date, Index from header to tail
function indexOf(Date: WORD; L,H: Integer): Integer; overload;//Search by Date, Index from header to tail
procedure save; virtual;
function seek(Index: Integer): Pointer; override;
function getCP: TArrayOfSingle;
function getUD: TArrayOfSingle;
function getVOL:TArrayOfSingle;
public
constructor Create(const StockName: string); reintroduce;
end;
implementation
uses fUtils, SysUtils;
{ TBaseDataFile }
constructor TBaseDataFile.Create;
begin
inherited;
loadFromFile(getFileName);
end;
destructor TBaseDataFile.Destroy;
begin
_free_(M);
inherited;
end;
function TBaseDataFile.getCount: Integer;
begin
if M = nil then Result := 0 else Result := (M.Size-getHeaderSize) div getRecSize;
end;
function TBaseDataFile.getHeader: Pointer;
begin
if M <> nil then
begin
Result := M.Memory;
end
else
begin
Result := nil;
end;
end;
function TBaseDataFile.getHeaderSize: Integer;
begin
Result := 0;
end;
function TBaseDataFile.getRec(Index: Integer): Pointer;
begin
if (Index>-1) and (Index<getCount) then
begin
Result := Seek(Index);
end
else
begin
Result := nil;
end;
end;
procedure TBaseDataFile.loadFromFile(const FileName: string);
begin
_free_(M);
if FileExists(FileName) then
begin
M := TMemoryStream.Create;
M.LoadFromFile(FileName);
M.Position := 0;
end;
end;
procedure TBaseDataFile.saveAs(FileName: string);
begin
if M <> nil then
begin
M.SaveToFile(FileName);
end;
end;
function TBaseDataFile.seek(Index: Integer): Pointer;
begin
if M = nil then
begin
Result := nil;
end
else
begin
Result := Pointer(Integer(getHeader) + getHeaderSize + Index * getRecSize);
end;
end;
{ TDataFile }
constructor TDataFile.Create(const StockName: string);
begin
FStockName := Trim(StockName);
inherited Create;
end;
function TDataFile.getFileName: string;
begin
Result := '.\DATA\K\'+FStockName+'.DAT';
end;
我把结尾一段改为Result := '.\DATA\K\'+FStockName+'.day'; 为什么不能显示K线图。请高手指教,谢谢!