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

📄 ohlchart.pas

📁 Delphi TeeChartPro.6.01的源代码
💻 PAS
字号:
{**********************************************}
{   TOHLCSeries (derived from TCustomSeries)   }
{   Copyright (c) 1995-2003 by David Berneda   }
{**********************************************}
unit OHLChart;
{$I TeeDefs.inc}

interface

Uses Classes,
     {$IFDEF CLX}
     QGraphics,
     {$ELSE}
     Graphics,
     {$ENDIF}
     Chart, Series, TeEngine;

{ WARNING:
  NOTE FOR TeeChart Pro users since version 4.

  The logic in OHLC series has been changed.
  Now the default "Y" values correspond to the Close values,
  before they were referred to Open values.
  This change should be transparent to your code unless you're
  accessing directly the "Y" values.
}

{ Used in financial applications, OHLC stands for Open,High,Low & Close.
  These are the prices a particular financial product has in a given time
  period.

  TOHLCSeries extends the basic TCustomSeries adding new lists for
  High, Low & Open prices, and preserving the default Y values for Close
  prices.

  Overrides the basic list functions (Add, Clear & Delete) plus the
  FillSampleValues method, used in design mode to show some fictional
  values to the user.

  Publishes the High, Low & Open values lists and "overrides" the XValues
  property to be DateValues and the YValues to be CloseValues.
}

type
  TOHLCSeries=class(TCustomSeries)
  private { assumed YValues = CloseValues }
    FHighValues  : TChartValueList;
    FLowValues   : TChartValueList;
    FOpenValues  : TChartValueList;
    Function GetCloseValues:TChartValueList;
    Function GetDateValues:TChartValueList;
    Procedure SetCloseValues(Value:TChartValueList);
    Procedure SetDateValues(Value:TChartValueList);
    Procedure SetHighValues(Value:TChartValueList);
    Procedure SetLowValues(Value:TChartValueList);
    Procedure SetOpenValues(Value:TChartValueList);
  protected
    Procedure AddSampleValues(NumValues:Integer); override;
  public
    Constructor Create(AOwner: TComponent); override;

    Function AddOHLC( Const ADate:TDateTime;
                      Const AOpen,AHigh,ALow,AClose:Double):Integer; overload;
    Function AddOHLC(Const AOpen,AHigh,ALow,AClose:Double):Integer; overload;

    Function IsValidSourceOf(Value:TChartSeries):Boolean; override;
    Function MaxYValue:Double; override;
    Function MinYValue:Double; override;
    Function NumSampleValues:Integer; override;
  published
    property CloseValues:TChartValueList read GetCloseValues write SetCloseValues;
    property DateValues:TChartValueList read GetDateValues write SetDateValues;
    property HighValues:TChartValueList read FHighValues write SetHighValues;
    property LowValues:TChartValueList read FLowValues write SetLowValues;
    property OpenValues:TChartValueList read FOpenValues write SetOpenValues;
  end;

{ returns random values for Open,Close,High and Low prices. Used for demos }
Procedure GetRandomOHLC(AOpen:Double; Var AClose,AHigh,ALow:Double; Const YRange:Double);

implementation

Uses Math, SysUtils, TeCanvas, TeeProCo;

type TValueListAccess=class(TChartValueList);

{ TOHLCSeries }
Constructor TOHLCSeries.Create(AOwner: TComponent);
Begin
  inherited;

  TValueListAccess(XValues).InitDateTime(True);
  XValues.Name:=TeeMsg_ValuesDate;
  YValues.Name:=TeeMsg_ValuesClose;

  FHighValues :=TChartValueList.Create(Self,TeeMsg_ValuesHigh);
  FLowValues  :=TChartValueList.Create(Self,TeeMsg_ValuesLow);
  FOpenValues :=TChartValueList.Create(Self,TeeMsg_ValuesOpen);
end;

Function TOHLCSeries.GetDateValues:TChartValueList;
Begin
  result:=XValues; { overrides default XValues }
end;

Procedure TOHLCSeries.SetDateValues(Value:TChartValueList);
begin
  SetXValues(Value); { overrides default XValues }
end;

Function TOHLCSeries.GetCloseValues:TChartValueList;
Begin
  result:=YValues; { overrides default YValues }
end;

Procedure TOHLCSeries.SetCloseValues(Value:TChartValueList);
begin
  SetYValues(Value); { overrides default YValues }
end;

Procedure TOHLCSeries.SetHighValues(Value:TChartValueList);
Begin
  SetChartValueList(FHighValues,Value);
end;

Procedure TOHLCSeries.SetLowValues(Value:TChartValueList);
Begin
  SetChartValueList(FLowValues,Value);
end;

Procedure TOHLCSeries.SetOpenValues(Value:TChartValueList);
Begin
  SetChartValueList(FOpenValues,Value);
end;

Function TOHLCSeries.AddOHLC( Const ADate:TDateTime;
                              Const AOpen,AHigh,ALow,AClose:Double):Integer;
Begin
  HighValues.TempValue:=AHigh;
  LowValues.TempValue:=ALow;
  OpenValues.TempValue:=AOpen;
  result:=AddXY(ADate,AClose);
end;

Function TOHLCSeries.AddOHLC(Const AOpen,AHigh,ALow,AClose:Double):Integer;
begin
  DateValues.DateTime:=False;
  HighValues.TempValue:=AHigh;
  LowValues.TempValue:=ALow;
  OpenValues.TempValue:=AOpen;
  result:=Add(AClose);
end;

Function TOHLCSeries.MaxYValue:Double;
Begin
  result:=Math.Max(CloseValues.MaxValue,HighValues.MaxValue);
  result:=Math.Max(result,LowValues.MaxValue);
  result:=Math.Max(result,OpenValues.MaxValue);
End;

Function TOHLCSeries.MinYValue:Double;
Begin
  result:=Math.Min(CloseValues.MinValue,HighValues.MinValue);
  result:=Math.Min(result,LowValues.MinValue);
  result:=Math.Min(result,OpenValues.MinValue);
End;

// Returns random OHLC values
Procedure GetRandomOHLC(AOpen:Double; Var AClose,AHigh,ALow:Double; Const YRange:Double);
var tmpY     : Integer;
    tmpFixed : Double;
Begin
  tmpY:=Abs(Round(YRange/400.0));
  AClose:=AOpen+Random(Round(YRange/25.0))-(YRange/50.0); { imagine a close price... }
  { and imagine the high and low session price }
  tmpFixed:=3*Round(Abs(AClose-AOpen)/10.0);
  if AClose>AOpen then
  Begin
    AHigh:=AClose+tmpFixed+Random(tmpY);
    ALow:=AOpen-tmpFixed-Random(tmpY);
  end
  else
  begin
    AHigh:=AOpen+tmpFixed+Random(tmpY);
    ALow:=AClose-tmpFixed-Random(tmpY);
  end;
end;

Procedure TOHLCSeries.AddSampleValues(NumValues:Integer);
Var AOpen  : Double;
    AHigh  : Double;
    ALow   : Double;
    AClose : Double;
    t      : Integer;
Begin
  With RandomBounds(NumValues) do
  begin
    AOpen:=MinY+Random(Round(DifY)); { starting open price }
    for t:=1 to NumValues do
    Begin
      { Generate random figures }
      GetRandomOHLC(AOpen,AClose,AHigh,ALow,DifY);
      { call the standard add method }
      AddOHLC(tmpX,AOpen,AHigh,ALow,AClose);
      tmpX:=tmpX+StepX;  { <-- next point X value }
      { tomorrow, the market will open at today's close plus/minus something }
      AOpen:=AClose+Random(10)-5;
    end;
  end;
end;

Function TOHLCSeries.NumSampleValues:Integer;
begin
  result:=40;
end;

Function TOHLCSeries.IsValidSourceOf(Value:TChartSeries):Boolean;
begin
  result:=Value is TOHLCSeries;
end;

end.

⌨️ 快捷键说明

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