Removed bottleneck in DataStream

This commit is contained in:
Michael Schimmel
2025-07-16 22:27:53 +02:00
parent 120c62083e
commit abad66ae52
4 changed files with 578 additions and 247 deletions
+53 -35
View File
@@ -2,6 +2,8 @@ unit MainForm;
interface
{.$define TICKDATA}
uses
System.SysUtils,
System.Types,
@@ -88,14 +90,22 @@ type
private
FOnEvent: TNotifyEvent;
{ Private declarations }
{$ifdef TICKDATA}
FServer: IDataServer<TAuraAskBidFileItem>;
{$else}
FServer: IDataServer<TOhlcItem>;
{$endif}
FSymbols: TFuture<TArray<String>>;
FTerminate: TEvent;
FProcessDone: TState;
FApplication: IAuraApplication;
FModulesItem: TTreeViewItem;
function SelectedSymbol: String;
function ExecuteStrategy(const Symbol: String; const Processor: IMycProcessor<TArray<TDataPoint<TAskBidItem>>>): TState;
function ExecuteStrategy(
const Symbol: String;
Timeframe: TTimeframe;
const Processor: IMycProcessor<TDataPoint<TOhlcItem>>
): TState;
public
procedure NewWorkspace;
@@ -215,7 +225,11 @@ begin
FTerminate := TEvent.CreateEvent;
// Create an instance of the TAuraTABFileServer. The server can be reused for multiple stream creations. [364]
{$ifdef TICKDATA}
FServer := TAuraTABFileServer.Create('\\COFFEE\TickData\Pepperstone');
{$else}
FServer := TAuraM1FileServer.Create('\\COFFEE\TickData\Pepperstone');
{$endif}
SymbolsComboBox.Enabled := false;
ChartButton.Enabled := false;
@@ -299,13 +313,27 @@ begin
Result := Res;
end;
function TForm1.ExecuteStrategy(const Symbol: String; const Processor: IMycProcessor<TArray<TDataPoint<TAskBidItem>>>): TState;
var
dataProvider: TConverter<TArray<TDataPoint<TAuraAskBidFileItem>>, TArray<TDataPoint<TAskBidItem>>>;
function TForm1.ExecuteStrategy(const Symbol: String; Timeframe: TTimeframe; const Processor: IMycProcessor<TDataPoint<TOhlcItem>>): TState;
begin
var terminated := TFlag.CreateObserver(FTerminate.Signal).State;
dataProvider :=
{$ifdef TICKDATA}
var ticker := TConverter.CreateTicker<TDataPoint<TAskBidItem>>;
var lastPrice :=
ticker.Chain<TDataPoint<Double>>(
function(const Tick: TDataPoint<TAskBidItem>): TDataPoint<Double>
begin
Result.Time := Tick.Time;
Result.Data := 0.5 * (Tick.Data.Ask + Tick.Data.Bid);
end
);
var OhlcPoint := lastPrice.Chain<TDataPoint<TOhlcItem>>(TConverter.CreateTickAggregation(Timeframe));
OhlcPoint.Sender.Link(Processor);
var dataProvider :=
TConverter<TArray<TDataPoint<TAuraAskBidFileItem>>, TArray<TDataPoint<TAskBidItem>>>.CreateGeneric(
function(const Values: TArray<TDataPoint<TAuraAskBidFileItem>>): TArray<TDataPoint<TAskBidItem>>
begin
@@ -319,9 +347,20 @@ begin
end
);
dataProvider.Sender.Link(Processor);
dataProvider.Sender.Link(ticker);
Result := FServer.ProcessData(Symbol, terminated, dataProvider);
{$else}
var ticker := TConverter.CreateTicker<TDataPoint<TOhlcItem>>;
var OhlcPoint := ticker.Chain<TDataPoint<TOhlcItem>>(TConverter.CreateOhlcAggregation(Timeframe));
OhlcPoint.Sender.Link(Processor);
Result := FServer.ProcessData(Symbol, terminated, ticker);
{$endif}
end;
function TForm1.SelectedSymbol: String;
@@ -350,20 +389,9 @@ begin
/////
var timeframe := TTimeframe.M15;
var OhlcPoint := TConverter.CreateIdentity<TDataPoint<TOhlcItem>>;
var ticker := TConverter.CreateTicker<TDataPoint<TAskBidItem>>;
var lastPrice :=
ticker.Chain<TDataPoint<Double>>(
function(const Tick: TDataPoint<TAskBidItem>): TDataPoint<Double>
begin
Result.Time := Tick.Time;
Result.Data := 0.5 * (Tick.Data.Ask + Tick.Data.Bid);
end
);
var OhlcPoint := lastPrice.Chain<TDataPoint<TOhlcItem>>(TConverter.CreateAggregation(timeframe));
var timeframe := TTimeframe.H;
var Timestamps := OhlcPoint.Field<TDateTime>('Time');
var Ohlc := OhlcPoint.Field<TOhlcItem>('Data');
@@ -425,7 +453,7 @@ begin
}
/////
var done := ExecuteStrategy(Symbol, ticker);
var done := ExecuteStrategy(Symbol, timeframe, OhlcPoint);
FProcessDone := TState.All([FProcessDone, done]);
end;
@@ -437,19 +465,12 @@ type
Entry: Double;
pnl: Double;
end;
var
panel: TMycChart.TPanel;
begin
var timeframe := TTimeframe.M15;
var ticker := TConverter.CreateTicker<TDataPoint<TAskBidItem>>;
var lastPrice :=
ticker.Chain<TDataPoint<Double>>(
TConverter.CreateDataPointConverter<TAskBidItem, Double>(
function(const Tick: TAskBidItem): Double begin Result := 0.5 * (Tick.Ask + Tick.Bid); end
)
);
var OhlcPoint := lastPrice.Chain<TDataPoint<TOhlcItem>>(TConverter.CreateAggregation(timeframe)).MakeParallel;
var OhlcPoint := TConverter.CreateIdentity<TDataPoint<TOhlcItem>>;
var Ohlc := TConverter.CreateSequence<TOhlcItem>(2, OhlcPoint.Field<TOhlcItem>('Data').Sender);
@@ -575,16 +596,13 @@ begin
chart.SetXAxisSeries(M15, OhlcPoint.Field<TDateTime>('Time').Sender);
var panel := chart.AddPanel;
panel := chart.AddPanel;
panel.AddOhlcSeries(Ohlc[0].Sender);
panel.AddDoubleSeries(Hull.Sender, TAlphaColors.Cornflowerblue, 2);
panel.AddDoubleSeries(Sma.Sender, TAlphaColors.Brown, 1.5);
panel.AddDoubleSeries(Signal.Field<Double>('SL').Sender, TAlphaColors.Red, 2);
panel.AddDoubleSeries(Signal.Field<Double>('Entry').Sender, TAlphaColors.Green, 1);
// panel := chart.AddPanel;
// panel.AddDoubleSeries( equity.Sender, TAlphaColors.Blue, 3 );
var pnlChart := TMycChart.Create(Self);
AlignControl(pnlChart);
pnlChart.Height := Layout.ChildrenRect.Width * 9 / 24;
@@ -597,7 +615,7 @@ begin
/////
var done := ExecuteStrategy(Symbol, ticker);
var done := ExecuteStrategy(Symbol, timeframe, OhlcPoint);
FProcessDone := TState.All([FProcessDone, done]);
end;