Polished DataProvider & Converter, RTTI field access
This commit is contained in:
@@ -4,7 +4,6 @@ interface
|
||||
|
||||
uses
|
||||
System.SysUtils,
|
||||
System.SyncObjs,
|
||||
System.UITypes,
|
||||
FMX.Graphics,
|
||||
Myc.Signals,
|
||||
@@ -12,18 +11,11 @@ uses
|
||||
Myc.Trade.Types,
|
||||
Myc.Trade.DataArray,
|
||||
Myc.Trade.DataPoint,
|
||||
Myc.Trade.DataConverter,
|
||||
Myc.Trade.Core.DataConverter,
|
||||
Myc.Fmx.Chart;
|
||||
|
||||
type
|
||||
TChartSeriesCounter<T> = class(TMycConverter<T, Int64>)
|
||||
private
|
||||
FCount: Int64;
|
||||
protected
|
||||
function ProcessData(const Value: T): TState; override;
|
||||
public
|
||||
constructor Create;
|
||||
end;
|
||||
|
||||
TChartSeriesReceiver<T> = class(TMycProcessor<T>)
|
||||
strict private
|
||||
FCurrData: TMycDataArray<T>;
|
||||
@@ -40,19 +32,18 @@ type
|
||||
TChartSeriesProcessor<T> = class(TMycChart.TSeries)
|
||||
strict private
|
||||
FDataSeries: TMycDataArray<T>;
|
||||
FLock: TSpinLock;
|
||||
private
|
||||
FData: TMycDataArray<T>;
|
||||
FDataProvider: IMycDataProvider<T>;
|
||||
FDataProvider: TDataProvider<T>;
|
||||
FReceiver: TChartSeriesReceiver<T>;
|
||||
FReceiverTag: TTag;
|
||||
FReceiverTag: TDataProvider<T>.TTag;
|
||||
protected
|
||||
function GetCount: Int64; override;
|
||||
function GetTotalCount: Int64; override;
|
||||
procedure Update;
|
||||
|
||||
public
|
||||
constructor Create(const ADataProvider: IMycDataProvider<T>; const ALookback: TMutable<Int64>);
|
||||
constructor Create(const ADataProvider: TDataProvider<T>; const ALookback: TMutable<Int64>);
|
||||
destructor Destroy; override;
|
||||
property Data: TMycDataArray<T> read FData;
|
||||
end;
|
||||
@@ -65,10 +56,14 @@ type
|
||||
function GetSeries: TMycChart.TSeries; override;
|
||||
function GetValueRange(First, Last: Int64; out MinValue, MaxValue: Double): Boolean; override; abstract;
|
||||
procedure Update; override;
|
||||
procedure Paint(const Canvas: TCanvas; First, Last: Int64; const XForm: TFunc<Int64, Single>; const YForm: TFunc<Double, Single>);
|
||||
override; abstract;
|
||||
procedure Paint(
|
||||
const Canvas: TCanvas;
|
||||
First, Last: Int64;
|
||||
const XForm: TFunc<Int64, Single>;
|
||||
const YForm: TFunc<Double, Single>
|
||||
); override; abstract;
|
||||
public
|
||||
constructor Create(AParent: TMycChart.TPanel; const ADataProvider: IMycDataProvider<T>);
|
||||
constructor Create(AParent: TMycChart.TPanel; const ADataProvider: TDataProvider<T>);
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
@@ -79,11 +74,16 @@ type
|
||||
FDownColor: TMutable<TAlphaColor>;
|
||||
protected
|
||||
function GetValueRange(First, Last: Int64; out MinValue, MaxValue: Double): Boolean; override;
|
||||
procedure Paint(const Canvas: TCanvas; First, Last: Int64; const XForm: TFunc<Int64, Single>; const YForm: TFunc<Double, Single>); override;
|
||||
procedure Paint(
|
||||
const Canvas: TCanvas;
|
||||
First, Last: Int64;
|
||||
const XForm: TFunc<Int64, Single>;
|
||||
const YForm: TFunc<Double, Single>
|
||||
); override;
|
||||
public
|
||||
constructor Create(
|
||||
AParent: TMycChart.TPanel;
|
||||
const ADataProvider: IMycDataProvider<TOhlcItem>;
|
||||
const ADataProvider: TDataProvider<TOhlcItem>;
|
||||
const AUpColor, ADownColor: TMutable<TAlphaColor>
|
||||
);
|
||||
end;
|
||||
@@ -95,11 +95,16 @@ type
|
||||
FLineWidth: Single;
|
||||
protected
|
||||
function GetValueRange(First, Last: Int64; out MinValue, MaxValue: Double): Boolean; override;
|
||||
procedure Paint(const Canvas: TCanvas; First, Last: Int64; const XForm: TFunc<Int64, Single>; const YForm: TFunc<Double, Single>); override;
|
||||
procedure Paint(
|
||||
const Canvas: TCanvas;
|
||||
First, Last: Int64;
|
||||
const XForm: TFunc<Int64, Single>;
|
||||
const YForm: TFunc<Double, Single>
|
||||
); override;
|
||||
public
|
||||
constructor Create(
|
||||
AParent: TMycChart.TPanel;
|
||||
const ADataProvider: IMycDataProvider<Double>;
|
||||
const ADataProvider: TDataProvider<Double>;
|
||||
const ALineColor: TAlphaColor;
|
||||
ALineWidth: Single
|
||||
);
|
||||
@@ -114,7 +119,7 @@ type
|
||||
procedure Update; override;
|
||||
function GetCaption(Idx: Int64): String; override; abstract;
|
||||
public
|
||||
constructor Create(AOwner: TMycChart; const ADataProvider: IMycDataProvider<T>);
|
||||
constructor Create(AOwner: TMycChart; const ADataProvider: TDataProvider<T>);
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
@@ -126,7 +131,7 @@ type
|
||||
// Provide a formatted timestamp string for a given data index.
|
||||
function GetCaption(Idx: Int64): String; override; final;
|
||||
public
|
||||
constructor Create(AOwner: TMycChart; ATimeframe: TTimeframe; const ADataProvider: IMycDataProvider<TDateTime>);
|
||||
constructor Create(AOwner: TMycChart; ATimeframe: TTimeframe; const ADataProvider: TDataProvider<TDateTime>);
|
||||
end;
|
||||
|
||||
implementation
|
||||
@@ -136,18 +141,6 @@ uses
|
||||
System.Math,
|
||||
FMX.Types;
|
||||
|
||||
constructor TChartSeriesCounter<T>.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FCount := 0;
|
||||
end;
|
||||
|
||||
function TChartSeriesCounter<T>.ProcessData(const Value: T): TState;
|
||||
begin
|
||||
Result := Broadcast(FCount);
|
||||
inc(FCount);
|
||||
end;
|
||||
|
||||
{ TChartSeriesReceiver<T> }
|
||||
|
||||
constructor TChartSeriesReceiver<T>.Create(const ALookback: TMutable<Int64>);
|
||||
@@ -167,13 +160,13 @@ end;
|
||||
|
||||
{ TChartSeriesProcessor<T> }
|
||||
|
||||
constructor TChartSeriesProcessor<T>.Create(const ADataProvider: IMycDataProvider<T>; const ALookback: TMutable<Int64>);
|
||||
constructor TChartSeriesProcessor<T>.Create(const ADataProvider: TDataProvider<T>; const ALookback: TMutable<Int64>);
|
||||
begin
|
||||
inherited Create;
|
||||
FDataProvider := ADataProvider;
|
||||
FLock := TSpinLock.Create(false);
|
||||
FDataSeries := TMycDataArray<T>.CreateEmpty;
|
||||
FData := FDataSeries;
|
||||
|
||||
FReceiver := TChartSeriesReceiver<T>.Create(ALookback);
|
||||
FReceiverTag := FDataProvider.Link(FReceiver);
|
||||
end;
|
||||
@@ -203,7 +196,7 @@ end;
|
||||
|
||||
constructor TChartLineLayer.Create(
|
||||
AParent: TMycChart.TPanel;
|
||||
const ADataProvider: IMycDataProvider<Double>;
|
||||
const ADataProvider: TDataProvider<Double>;
|
||||
const ALineColor: TAlphaColor;
|
||||
ALineWidth: Single
|
||||
);
|
||||
@@ -231,8 +224,12 @@ begin
|
||||
Result := (MinValue < MaxValue);
|
||||
end;
|
||||
|
||||
procedure TChartLineLayer.Paint(const Canvas: TCanvas; First, Last: Int64; const XForm: TFunc<Int64, Single>; const YForm: TFunc<Double,
|
||||
Single>);
|
||||
procedure TChartLineLayer.Paint(
|
||||
const Canvas: TCanvas;
|
||||
First, Last: Int64;
|
||||
const XForm: TFunc<Int64, Single>;
|
||||
const YForm: TFunc<Double, Single>
|
||||
);
|
||||
var
|
||||
points: TPathData;
|
||||
n: Int64;
|
||||
@@ -249,13 +246,13 @@ begin
|
||||
if n < Last then
|
||||
begin
|
||||
points.MoveTo(TPointF.Create(XForm(n), YForm(FSeries.Data[n])));
|
||||
inc( n );
|
||||
inc(n);
|
||||
while n <= Last do
|
||||
begin
|
||||
if IsNaN(FSeries.Data[n]) then
|
||||
break;
|
||||
points.LineTo(TPointF.Create(XForm(n), YForm(FSeries.Data[n])));
|
||||
inc( n );
|
||||
inc(n);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@@ -273,7 +270,7 @@ end;
|
||||
|
||||
constructor TChartOhlcLayer.Create(
|
||||
AParent: TMycChart.TPanel;
|
||||
const ADataProvider: IMycDataProvider<TOhlcItem>;
|
||||
const ADataProvider: TDataProvider<TOhlcItem>;
|
||||
const AUpColor, ADownColor: TMutable<TAlphaColor>
|
||||
);
|
||||
begin
|
||||
@@ -301,8 +298,12 @@ begin
|
||||
Result := (MinValue <> MaxDouble);
|
||||
end;
|
||||
|
||||
procedure TChartOhlcLayer.Paint(const Canvas: TCanvas; First, Last: Int64; const XForm: TFunc<Int64, Single>; const YForm: TFunc<Double,
|
||||
Single>);
|
||||
procedure TChartOhlcLayer.Paint(
|
||||
const Canvas: TCanvas;
|
||||
First, Last: Int64;
|
||||
const XForm: TFunc<Int64, Single>;
|
||||
const YForm: TFunc<Double, Single>
|
||||
);
|
||||
var
|
||||
i: Int64;
|
||||
x, candleWidth: Single;
|
||||
@@ -340,7 +341,7 @@ end;
|
||||
|
||||
{ TChartCustomLayer }
|
||||
|
||||
constructor TChartCustomLayer<T>.Create(AParent: TMycChart.TPanel; const ADataProvider: IMycDataProvider<T>);
|
||||
constructor TChartCustomLayer<T>.Create(AParent: TMycChart.TPanel; const ADataProvider: TDataProvider<T>);
|
||||
begin
|
||||
inherited Create(AParent);
|
||||
FSeries := TChartSeriesProcessor<T>.Create(ADataProvider, AParent.Owner.Lookback.AsMutable);
|
||||
@@ -364,7 +365,7 @@ end;
|
||||
|
||||
{ TChartXAxisLayer }
|
||||
|
||||
constructor TChartXAxisLayer<T>.Create(AOwner: TMycChart; const ADataProvider: IMycDataProvider<T>);
|
||||
constructor TChartXAxisLayer<T>.Create(AOwner: TMycChart; const ADataProvider: TDataProvider<T>);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FSeries := TChartSeriesProcessor<T>.Create(ADataProvider, AOwner.Lookback.AsMutable);
|
||||
@@ -386,7 +387,7 @@ begin
|
||||
FSeries.Update;
|
||||
end;
|
||||
|
||||
constructor TChartXAxisTimestampLayer.Create(AOwner: TMycChart; ATimeframe: TTimeframe; const ADataProvider: IMycDataProvider<TDateTime>);
|
||||
constructor TChartXAxisTimestampLayer.Create(AOwner: TMycChart; ATimeframe: TTimeframe; const ADataProvider: TDataProvider<TDateTime>);
|
||||
begin
|
||||
inherited Create(AOwner, ADataProvider);
|
||||
FTimeframe := ATimeframe;
|
||||
|
||||
Reference in New Issue
Block a user