173 lines
4.8 KiB
ObjectPascal
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.
|