unit Myc.Trade.DataProvider; interface uses Myc.Signals, Myc.Lazy, Myc.Trade.DataPoint, Myc.Trade.DataStream; type TDataStreamProvider = class(TInterfacedObject, TMutable>.IMutable) private FStream: IDataStream; FDataSeries: TDataSeries; FNewDataAvailable: TFlag; FHasDataSubscription: TSignal.TSubscription; FLookback: Int64; function GetChanged: TSignal; function GetValue: TDataSeries; public constructor Create(ALookback: Int64; const AStream: IDataStream); destructor Destroy; override; end; TDataStreamProvider = record class function Create(Lookback: Int64; const Stream: IDataStream): TMutable>; static; end; implementation { TDataStreamProvider } constructor TDataStreamProvider.Create(ALookback: Int64; const AStream: IDataStream); begin inherited Create; FLookback := ALookback; FStream := AStream; FHasDataSubscription := FStream.HasData.Subscribe(FNewDataAvailable); FDataSeries := TDataSeries.Create( ALookback ); end; destructor TDataStreamProvider.Destroy; begin FHasDataSubscription.Unsubscribe; inherited; end; function TDataStreamProvider.GetChanged: TSignal; begin Result := FStream.HasData; end; function TDataStreamProvider.GetValue: TDataSeries; begin if FNewDataAvailable.Reset then begin var Data: array[0..1024 - 1] of TDataPoint; var cnt := FStream.GetChunk(Data); while cnt > 0 do begin FDataSeries.Add(Data, cnt); cnt := FStream.GetChunk(Data); end; end; Result := FDataSeries; end; { TDataStreamProvider } class function TDataStreamProvider.Create(Lookback: Int64; const Stream: IDataStream): TMutable>; begin Result := TDataStreamProvider.Create(Lookback, Stream); end; end.