Files
MycLib/AuraTrader/MainForm.pas
T
Michael Schimmel a9aff8c41a AuraTrader Sample
2025-06-17 21:49:09 +02:00

173 lines
4.8 KiB
ObjectPascal

unit MainForm;
interface
uses
System.SysUtils,
System.Types,
System.UITypes,
System.Classes,
System.Variants,
System.DateUtils,
FMX.Types,
FMX.Controls,
FMX.Forms,
FMX.Graphics,
FMX.Dialogs,
FMX.Controls.Presentation,
FMX.StdCtrls,
FMX.ListView.Types,
FMX.ListView.Appearances,
FMX.ListView.Adapters.Base,
FMX.ListView,
FMX.Memo.Types,
FMX.ScrollBox,
FMX.Memo,
FMX.Objects,
Myc.Futures,
Myc.Trade.DataStream,
Myc.Trade.DataPoint,
Myc.Signals,
Myc.Signals.FMX,
FMX.ListBox;
type
TForm1 = class(TForm)
LogMemo: TMemo;
Panel1: TPanel;
RandomButton: TButton;
Path1: TPath;
SymbolsComboBox: TComboBox;
LoadButton: TButton;
procedure RandomButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure LoadButtonClick(Sender: TObject);
private
FOnEvent: TNotifyEvent;
{ Private declarations }
FServer: IDataServer<TAskBidItem>;
FSymbolsValid: TFMXValidationState;
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);
public
{ Public declarations }
published
property OnEvent: TNotifyEvent read FOnEvent write FOnEvent;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Create an instance of the TAuraTABFileServer. The server can be reused for multiple stream creations. [364]
FServer := TAuraTABFileServer.Create('\\COFFEE\TickData\Pepperstone');
SymbolsComboBox.Enabled := false;
FSymbols := FServer.EnumerateSymbols;
FSymbolsValid :=
TFMXValidationState.Create(
SymbolsComboBox,
FSymbols.Done,
procedure
begin
SymbolsComboBox.BeginUpdate;
try
SymbolsComboBox.Items.Clear;
SymbolsComboBox.Items.AddStrings(FSymbols.WaitFor);
if SymbolsComboBox.Items.Count > 0 then
begin
if SymbolsComboBox.ItemIndex < 0 then
SymbolsComboBox.ItemIndex := SymbolsComboBox.Items.IndexOf('GER40');
SymbolsComboBox.Enabled := true;
end;
finally
SymbolsComboBox.EndUpdate;
end;
end
);
Application.OnIdle := DoIdle;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.OnIdle := nil;
FSymbolsValid.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;
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 ass := FSymbols.WaitFor;
FRandomStream[FStreamIdx] := FServer.CreateStream(ass[Random(Length(ass))]);
for var i := 0 to High(FRandomStream) do
if LogMemo.Lines.Count = i then
LogMemo.Lines.Add('');
LogMemo.Lines[FStreamIdx] := FRandomStream[FStreamIdx].Symbol + ' loading...';
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
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;
end;
finally
LogMemo.EndUpdate;
end;
end;
end.