From 6a114f77c58e6efd3b31f01c88e942d67081e73b Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Thu, 24 Jul 2025 07:59:41 +0200 Subject: [PATCH] Refactoring identifiers --- AuraTrader/MainForm.pas | 49 +++++++++++++++++--------------- AuraTrader/StrategyTest.pas | 2 +- Src/Myc.Trade.DataPoint.Impl.pas | 36 +++++++++++------------ Src/Myc.Trade.DataPoint.pas | 48 ++++++++++++++++--------------- 4 files changed, 70 insertions(+), 65 deletions(-) diff --git a/AuraTrader/MainForm.pas b/AuraTrader/MainForm.pas index a532e8a..6d8de84 100644 --- a/AuraTrader/MainForm.pas +++ b/AuraTrader/MainForm.pas @@ -299,7 +299,7 @@ begin var ticker := TConverter.CreateIdentity>; Result := ticker; - var OhlcPoint := ticker.Sender.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); + var OhlcPoint := ticker.DataProvider.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); var Ohlc := OhlcPoint.Field('Data'); @@ -426,7 +426,7 @@ begin conv.Chain(Signal); - var pnl := Signal.Sender.Field('pnl'); + var pnl := Signal.DataProvider.Field('pnl'); var FEquity: Double := 10000; var FInit: Boolean := false; @@ -470,21 +470,21 @@ begin panel.AddOhlcSeries(Ohlc); panel.AddDoubleSeries(Hull, TAlphaColors.Cornflowerblue, 2); panel.AddDoubleSeries(Sma, TAlphaColors.Brown, 1.5); - panel.AddDoubleSeries(Signal.Sender.Field('Entry'), TAlphaColors.Green, 1); - panel.AddDoubleSeries(Signal.Sender.Field('SL'), TAlphaColors.Red, 2); + panel.AddDoubleSeries(Signal.DataProvider.Field('Entry'), TAlphaColors.Green, 1); + panel.AddDoubleSeries(Signal.DataProvider.Field('SL'), TAlphaColors.Red, 2); var mean := TConverter, Double>.CreateGeneric(TIndicators.CreateMean()); TConverter.Join([Hull, Sma]).Chain(mean); - panel.AddDoubleSeries(mean.Sender, TAlphaColors.Blue, 5); + panel.AddDoubleSeries(mean.DataProvider, TAlphaColors.Blue, 5); var pnlChart := TMycChart.Create(Self); AlignControl(pnlChart); pnlChart.Height := Layout.ChildrenRect.Width * 9 / 24; pnlChart.Lookback.Value := 50000; - pnlChart.SetXAxisCounter(equity.Sender); + pnlChart.SetXAxisCounter(equity.DataProvider); //////////// var EMAFactory := TEMA.Create; @@ -498,7 +498,7 @@ begin var equityEMA := equity - .Sender + .DataProvider .Chain(TConverter.FieldToRecord(EMAFactory.Input, 'Price')) .Chain(EMAConv) .Chain(TConverter.FieldOfRecord(EMAFactory.Output, 'MA')); @@ -506,7 +506,7 @@ begin ////////////// panel := pnlChart.AddPanel; - panel.AddDoubleSeries(equity.Sender, TAlphaColors.Blue, 3); + panel.AddDoubleSeries(equity.DataProvider, TAlphaColors.Blue, 3); panel.AddDoubleSeries(equityEMA, TAlphaColors.Gray, 2); ///// @@ -550,7 +550,7 @@ begin ); var OhlcPoint := lastPrice.Chain>(TConverter.CreateTickAggregation(Timeframe)); - OhlcPoint.Sender.Link(Processor); + OhlcPoint.DataProvider.Link(Processor); var dataProvider := TConverter>, TArray>>.CreateGeneric( @@ -566,14 +566,14 @@ begin end ); - dataProvider.Sender.Link(ticker); + dataProvider.DataProvider.Link(ticker); FProcessDone := FProcessDone + FServer.ProcessData(Symbol, terminated, dataProvider); {$else} var ticker := TConverter.CreateTicker>; - ticker.Sender.Chain(Processor); + ticker.DataProvider.Chain(Processor); FProcessDone := FProcessDone + FServer.ProcessData(Symbol, terminated, ticker); {$endif} @@ -605,23 +605,26 @@ begin ///// - var OhlcTicker := TConverter.CreateIdentity>; - - var OhlcPoint := OhlcTicker.Sender; - var timeframe := TTimeframe.H; + var ticker := TConverter.CreateIdentity>; + + var OhlcPoint := ticker.DataProvider.Chain>(TConverter.CreateOhlcAggregation(timeframe)); + + // var OhlcTicker := TConverter.CreateIdentity>; + // var OhlcPoint := OhlcTicker.Sender; + var Timestamps := OhlcPoint.Field('Time'); var Ohlc := OhlcPoint.Field('Data'); var Closes := Ohlc.Field('Close'); - var Hull := Closes.MakeParallel.Chain(TIndicators.CreateHMA(150)); - var Sma := Closes.MakeParallel.Chain(TIndicators.CreateSMA(50)); - var Ema := Closes.MakeParallel.Chain(TIndicators.CreateEMA(21)); + var Hull := Closes.Chain(TIndicators.CreateHMA(150)); + var Sma := Closes.Chain(TIndicators.CreateSMA(50)); + var Ema := Closes.Chain(TIndicators.CreateEMA(21)); var Boli := Closes.MakeParallel.Chain(TIndicators.CreateBollingerBands(20, 2.0)); - var Rsi := Closes.MakeParallel.Chain(TIndicators.CreateRSI(14)); + var Rsi := Closes.Chain(TIndicators.CreateRSI(14)); var Macd := Closes.MakeParallel.Chain(TIndicators.CreateMACD(12, 26, 9)); - var Stoch := Ohlc.MakeParallel.Chain(TIndicators.CreateStochastic(14, 3)); + var Stoch := Ohlc.Chain(TIndicators.CreateStochastic(14, 3)); chart.SetXAxisSeries(timeframe, Timestamps); @@ -671,7 +674,7 @@ begin } ///// - ExecuteStrategy(Symbol, timeframe, OhlcTicker); + ExecuteStrategy(Symbol, timeframe, ticker); end; procedure TForm1.Strat2ButtonClick(Sender: TObject); @@ -695,10 +698,10 @@ begin pnlChart.Height := Layout.ChildrenRect.Width * 9 / 24; pnlChart.Lookback.Value := 50000; - pnlChart.SetXAxisCounter(tstStrat.Sender); + pnlChart.SetXAxisCounter(tstStrat.DataProvider); var panel := pnlChart.AddPanel; - panel.AddDoubleSeries(tstStrat.Sender, TAlphaColors.Blue, 3); + panel.AddDoubleSeries(tstStrat.DataProvider, TAlphaColors.Blue, 3); end; end. diff --git a/AuraTrader/StrategyTest.pas b/AuraTrader/StrategyTest.pas index 322330b..d82bc80 100644 --- a/AuraTrader/StrategyTest.pas +++ b/AuraTrader/StrategyTest.pas @@ -30,7 +30,7 @@ type begin var ticker := TConverter.CreateIdentity>; - var OhlcPoint := ticker.Sender.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); + var OhlcPoint := ticker.DataProvider.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); var Ohlc := OhlcPoint.Field('Data'); diff --git a/Src/Myc.Trade.DataPoint.Impl.pas b/Src/Myc.Trade.DataPoint.Impl.pas index 01457cd..085af95 100644 --- a/Src/Myc.Trade.DataPoint.Impl.pas +++ b/Src/Myc.Trade.DataPoint.Impl.pas @@ -59,8 +59,8 @@ type // Abstract base class for components that process data of type S and provide data of type T. TMycConverter = class abstract(TMycProcessor, IConverter) private - FSender: TMycContainedDataProvider; - function GetSender: IDataProvider; + FDataProvider: TMycContainedDataProvider; + function GetDataProvider: IDataProvider; protected function ProcessData(const Value: S): TState; override; abstract; // Broadcasts the given data to all linked processors. @@ -68,13 +68,13 @@ type public constructor Create; destructor Destroy; override; - property Sender: IDataProvider read GetSender; + property DataProvider: IDataProvider read GetDataProvider; end; // Null object implementation for IConverter. TNullConverter = class(TInterfacedObject, IConverter) private - function GetSender: IDataProvider; + function GetDataProvider: IDataProvider; public function ProcessData(const Value: S): TState; end; @@ -234,14 +234,14 @@ type Queue: TQueue; end; - FSender: TMycContainedDataProvider>; + FDataProvider: TMycContainedDataProvider>; FLock: TSpinLock; FCount: Integer; function ProcessData(Idx: Integer; const Value: T): TState; public constructor Create(const ADataProviders: TArray>); destructor Destroy; override; - property Sender: TMycContainedDataProvider> read FSender implements IDataProvider>; + property DataProvider: TMycContainedDataProvider> read FDataProvider implements IDataProvider>; end; TMycComposedConverter = class(TMycProcessor, IConverter) @@ -250,7 +250,7 @@ type FDataProvider: TDataProvider; protected function ProcessData(const Value: S): TState; override; - function GetSender: IDataProvider; + function GetDataProvider: IDataProvider; public constructor Create(const AProcessor: IMycProcessor; const ADataProvider: TDataProvider); end; @@ -352,28 +352,28 @@ end; constructor TMycConverter.Create; begin inherited Create; - FSender := TMycContainedDataProvider.Create(Self); + FDataProvider := TMycContainedDataProvider.Create(Self); end; destructor TMycConverter.Destroy; begin - FSender.Free; + FDataProvider.Free; inherited Destroy; end; function TMycConverter.Broadcast(const Value: T): TState; begin - Result := FSender.Broadcast(Value); + Result := FDataProvider.Broadcast(Value); end; -function TMycConverter.GetSender: IDataProvider; +function TMycConverter.GetDataProvider: IDataProvider; begin - Result := FSender; + Result := FDataProvider; end; { TNullConverter } -function TNullConverter.GetSender: IDataProvider; +function TNullConverter.GetDataProvider: IDataProvider; begin Result := TDataProvider.Null; end; @@ -847,7 +847,7 @@ begin FLock := TSpinLock.Create(false); FCount := Length(FReceivers); - FSender := TMycContainedDataProvider>.Create(Self); + FDataProvider := TMycContainedDataProvider>.Create(Self); var cFunc := function(Idx: Integer): TConstFunc @@ -875,7 +875,7 @@ begin Queue.Free; end; - FSender.Free; + FDataProvider.Free; inherited; end; @@ -908,7 +908,7 @@ begin end; if Arr <> nil then - FSender.Broadcast(Arr); + FDataProvider.Broadcast(Arr); end; constructor TMycGenericAggregator.Create(const AFunc: TConstFunc.TBroadcastProc, TState>); @@ -919,7 +919,7 @@ end; function TMycGenericAggregator.ProcessData(const Value: S): TState; begin - Result := FFunc(Value, function(const Value: T): TState begin Result := FSender.Broadcast(Value); end); + Result := FFunc(Value, function(const Value: T): TState begin Result := FDataProvider.Broadcast(Value); end); end; constructor TMycComposedConverter.Create(const AProcessor: IMycProcessor; const ADataProvider: TDataProvider); @@ -929,7 +929,7 @@ begin FDataProvider := ADataProvider; end; -function TMycComposedConverter.GetSender: IDataProvider; +function TMycComposedConverter.GetDataProvider: IDataProvider; begin Result := FDataProvider; end; diff --git a/Src/Myc.Trade.DataPoint.pas b/Src/Myc.Trade.DataPoint.pas index bf7ac97..23f4a82 100644 --- a/Src/Myc.Trade.DataPoint.pas +++ b/Src/Myc.Trade.DataPoint.pas @@ -22,14 +22,16 @@ type end; IConverter = interface(IMycProcessor) - function GetSender: IDataProvider; - property Sender: IDataProvider read GetSender; + {$region 'private'} + function GetDataProvider: IDataProvider; + {$endregion} + property DataProvider: IDataProvider read GetDataProvider; end; // Interface helper for IDataProvider providing the null object pattern. TDataProvider = record type - TLink = record + TSubscription = record private FDataProvider: IDataProvider; FTag: TTag; @@ -54,7 +56,7 @@ type class operator Implicit(const A: IDataProvider): TDataProvider; overload; class operator Implicit(const A: TDataProvider): IDataProvider; overload; - function Link(const Receiver: IMycProcessor): TLink; inline; + function Link(const Receiver: IMycProcessor): TSubscription; inline; function Chain(const Next: IMycProcessor): IMycProcessor; overload; inline; function Chain(const Next: IConverter): TDataProvider; overload; inline; @@ -90,7 +92,7 @@ type class constructor CreateClass; private FConverter: IConverter; - function GetSender: TDataProvider; inline; + function GetDataProvider: TDataProvider; inline; public constructor Create(const AConverter: IConverter); @@ -103,13 +105,13 @@ type class function CreateGeneric(const Func: TConstFunc): TConverter; static; class function CreateAggregation(const Func: TConstFunc): TConverter; static; - function Sequence(Count: Integer): IMycDataSequence; overload; + function CreateSequence(Count: Integer): IMycDataSequence; overload; function Sequence(const Items: TArray>): IMycDataSequence; overload; // Provides access to the null object instance. class property Null: IConverter read FNull; - // Wrapper for IConverter.Sender - property Sender: TDataProvider read GetSender; + // Wrapper for IConverter.DataProvider + property DataProvider: TDataProvider read GetDataProvider; end; // Factory for creating specific converter instances. @@ -158,6 +160,15 @@ uses { TDataProvider } +procedure TDataProvider.TSubscription.Unlink; +begin + if FTag <> nil then + begin + FDataProvider.Unlink(FTag); + FTag := nil; + end; +end; + class constructor TDataProvider.CreateClass; begin // Create the singleton null object instance. @@ -180,7 +191,7 @@ end; function TDataProvider.Chain(const Next: IConverter): TDataProvider; begin FDataProvider.Link(Next); - Result := Next.Sender; + Result := Next.DataProvider; end; function TDataProvider.Chain(const Func: TConstFunc): TDataProvider; @@ -213,7 +224,7 @@ begin Result := A.FDataProvider; end; -function TDataProvider.Link(const Receiver: IMycProcessor): TLink; +function TDataProvider.Link(const Receiver: IMycProcessor): TSubscription; begin Result.FDataProvider := FDataProvider; Result.FTag := FDataProvider.Link(Receiver); @@ -253,15 +264,15 @@ begin Result := TMycGenericConverter.Create(Func); end; -function TConverter.GetSender: TDataProvider; +function TConverter.GetDataProvider: TDataProvider; begin - Result := FConverter.Sender; + Result := FConverter.DataProvider; end; -function TConverter.Sequence(Count: Integer): IMycDataSequence; +function TConverter.CreateSequence(Count: Integer): IMycDataSequence; begin Result := TMycSequence.Create(Count); - FConverter.Sender.Link(Result); + FConverter.DataProvider.Link(Result); end; function TConverter.Sequence(const Items: TArray>): IMycDataSequence; @@ -416,13 +427,4 @@ begin RecProvider.Link(Result); end; -procedure TDataProvider.TLink.Unlink; -begin - if FTag <> nil then - begin - FDataProvider.Unlink(FTag); - FTag := nil; - end; -end; - end.