简易能显示股票K线的代码,能否改为通达信股票数据?

文章描述了一位用户尝试将一个由台湾人编写的、显示K线、成交量及MACD指标的简易股票软件的数据格式从DAT改为通达信的DAY格式,但修改后无法正常显示K线图。用户提供了部分源码,并寻求技术专家的帮助,希望能指导如何正确修改代码以适应DAY格式并恢复K线图的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在本站下站了一个简易股票小软件,据说是台湾人编写的,能显示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线图。请高手指教,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值