DataPoint

This commit is contained in:
Michael Schimmel
2025-06-24 08:11:46 +02:00
parent 6c7cc2569b
commit a3da63ad6a
14 changed files with 902 additions and 633 deletions
+71 -53
View File
@@ -9,6 +9,7 @@ uses
System.Classes,
System.Variants,
System.DateUtils,
System.Generics.Collections,
FMX.Types,
FMX.Controls,
FMX.Forms,
@@ -27,9 +28,12 @@ uses
Myc.Futures,
Myc.Trade.DataStream,
Myc.Trade.DataPoint,
Myc.Trade.DataProvider,
Myc.Signals,
Myc.Lazy,
Myc.Signals.FMX,
FMX.ListBox;
FMX.ListBox,
FMX.Layouts;
type
TForm1 = class(TForm)
@@ -39,10 +43,20 @@ type
Path1: TPath;
SymbolsComboBox: TComboBox;
LoadButton: TButton;
FlowLayout: TFlowLayout;
procedure RandomButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LoadButtonClick(Sender: TObject);
private
const
cnt = 20;
type
TRndItem = record
Stream: IDataStream<TAskBidItem>;
Data: TMutable<TDataSeries<TAskBidItem>>;
Labl: TLabel;
end;
private
FOnEvent: TNotifyEvent;
{ Private declarations }
@@ -51,9 +65,7 @@ type
FStreamUpdate: TFMXValidationState;
FSymbols: TFuture<TArray<String>>;
FStream: IDataStream<TAskBidItem>;
FRandomStream: array[0..19] of IDataStream<TAskBidItem>;
FStreamIdx: Integer;
procedure DoIdle(Sender: TObject; var Done: Boolean);
FRandom: TList<TRndItem>;
public
{ Public declarations }
published
@@ -69,6 +81,8 @@ implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
FRandom := TList<TRndItem>.Create;
// Create an instance of the TAuraTABFileServer. The server can be reused for multiple stream creations. [364]
FServer := TAuraTABFileServer.Create('\\COFFEE\TickData\Pepperstone');
@@ -97,76 +111,80 @@ begin
end;
end
);
Application.OnIdle := DoIdle;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.OnIdle := nil;
FSymbolsValid.Free;
FRandom.Free;
end;
procedure TForm1.LoadButtonClick(Sender: TObject);
begin
FStream := FServer.CreateStream(FSymbols.WaitFor[SymbolsComboBox.ItemIndex]);
FStreamUpdate := TFMXValidationState.Create(Path1, FStream.HasData,
procedure
var
Data: array [0..5] of TDataPoint<TAskBidItem>;
begin
var cnt := FStream.GetChunk(Data);
if cnt = 0 then exit;
FStreamUpdate :=
TFMXValidationState.Create(
Path1,
FStream.HasData,
procedure
var
Data: array[0..200] of TDataPoint<TAskBidItem>;
begin
var cnt := FStream.GetChunk(Data);
if cnt = 0 then
exit;
for var i:=0 to cnt-1 do
Path1.Data.LineTo( PointF(Path1.Data.Count, Data[i].Data.Ask) );
end);
for var i := 0 to cnt - 1 do
Path1.Data.LineTo(PointF(Path1.Data.Count, Data[i].Data.Ask));
end
);
end;
procedure TForm1.RandomButtonClick(Sender: TObject);
begin
var tst: TFlag := TFlag.CreateObserver( TSignal.Null );
var rnd: TRndItem;
var ass := FSymbols.WaitFor;
FRandomStream[FStreamIdx] := FServer.CreateStream(ass[Random(Length(ass))]);
rnd.Stream := FServer.CreateStream(ass[Random(Length(FSymbols.WaitFor))]);
rnd.Data := TDataStreamProvider.Create<TAskBidItem>(3000, 100, rnd.Stream);
for var i := 0 to High(FRandomStream) do
if LogMemo.Lines.Count = i then
LogMemo.Lines.Add('');
LogMemo.Lines[FStreamIdx] := FRandomStream[FStreamIdx].Symbol + ' loading...';
rnd.Labl := TLabel.Create(Self);
rnd.Labl.Parent := FlowLayout;
rnd.Labl.Align := TAlignLayout.None;
rnd.Labl.WordWrap := false;
rnd.Labl.Width := 300;
rnd.Labl.Text := rnd.Stream.Symbol + ' loading...';
FRandom.Add(rnd);
FStreamIdx := (FStreamIdx + 1) mod Length(FRandomStream);
end;
procedure TForm1.DoIdle(Sender: TObject; var Done: Boolean);
var
Items: TArray<TDataPoint<TAskBidItem>>;
begin
SetLength(Items, 200);
LogMemo.BeginUpdate;
try
for var i := 0 to High(FRandomStream) do
var Proc :=
procedure(idx: Integer)
begin
var str := '';
if LogMemo.Lines.Count > i then
str := LogMemo.Lines[i]
else
LogMemo.Lines.Add('');
if Assigned(FRandomStream[i]) then
begin
var cnt := FRandomStream[i].GetChunk(Items);
if cnt > 0 then
begin
var d := Items[cnt - 1];
str := FRandomStream[i].Symbol + ' ' + cnt.ToString + ' ' + d.Time.ToString + ': ' + d.Data.Ask.ToString;
end;
end;
LogMemo.Lines[i] := str;
TFMXValidationState.Create(
FRandom[idx].Labl,
FRandom[idx].Stream.HasData,
procedure
begin
var data := FRandom[idx].Data.Value;
if data.Count > 0 then
begin
var dp := data[0];
FRandom[idx].Labl.Text :=
FRandom[idx].Stream.Symbol
+ ' '
+ dp.Time.ToString
+ ' '
+ data.TotalCount.ToString
+ ' '
+ dp.Data.Ask.ToString;
end;
end
);
end;
finally
LogMemo.EndUpdate;
end;
Proc(FRandom.Count - 1);
end;
end.