Removed bottleneck in DataStream
This commit is contained in:
+53
-35
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user