Refactoring DataStream
This commit is contained in:
@@ -5,7 +5,7 @@ interface
|
||||
uses
|
||||
System.SysUtils, System.Classes, System.Generics.Collections, System.StrUtils,
|
||||
Myc.Futures,
|
||||
Myc.Trade.DataSeries, Myc.OHLCCache;
|
||||
Myc.Trade.DataPoint, Myc.Trade.DataStream, Myc.OHLCCache;
|
||||
|
||||
type
|
||||
TTimeframeSetting = record
|
||||
@@ -16,22 +16,23 @@ type
|
||||
|
||||
TChartDataController = class
|
||||
private
|
||||
FTickDataArray: TArray<TAskBid.TTick>;
|
||||
FTickDataArray: TArray<TDataRecord<TAskBidItem>>;
|
||||
FOHLCCacheList: TList<TOHLC>;
|
||||
FTimeframeSettingsArray: TArray<TTimeframeSetting>; // Now includes registered generic builders
|
||||
FMemoLog: TStrings;
|
||||
FGenericBuilders: TDictionary<string, IGenericCandleBuilder>; // Keyed by TTimeframeSetting.Caption
|
||||
FDataServer: IDataServer<TAskBidItem>;
|
||||
|
||||
procedure InitializeBaseTimeframeSettings; // Renamed for clarity
|
||||
function GetGenericBuilder(const ABuilderCaption: string): IGenericCandleBuilder;
|
||||
public
|
||||
constructor Create(AMemoTarget: TStrings);
|
||||
constructor Create(const ADataServer: IDataServer<TAskBidItem>; AMemoTarget: TStrings);
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure LoadTickDataSeries(const AFileName: string);
|
||||
|
||||
// GetOrBuildCache now uses a single ASelectedTimeframeCaption for all types of timeframes.
|
||||
function GetOrBuildCache(const ASelectedTimeframeCaption: string; // e.g., "M1", "Auto", "Every 20 Ticks"
|
||||
function GetOrBuildCache( const ASelectedTimeframeCaption: string; // e.g., "M1", "Auto", "Every 20 Ticks"
|
||||
AAutoAggCandleWidth: Integer;
|
||||
AAutoAggCandleSpacing: Integer;
|
||||
AAutoAggPaintBoxClientWidth: Integer;
|
||||
@@ -40,7 +41,7 @@ type
|
||||
procedure ClearAllDataAndCaches;
|
||||
function GetTickDataCount: Integer;
|
||||
function GetTickDataLength: Integer;
|
||||
function GetTickDataItem(AIndex: Integer): TAskBid.TTick;
|
||||
function GetTickDataItem(AIndex: Integer): TDataRecord<TAskBidItem>;
|
||||
function HasData: Boolean;
|
||||
|
||||
// ABuilderCaption is the unique key used for FTimeframeSettingsArray.Caption and FGenericBuilders key.
|
||||
@@ -61,11 +62,12 @@ const
|
||||
|
||||
{ TChartDataController }
|
||||
|
||||
constructor TChartDataController.Create(AMemoTarget: TStrings);
|
||||
constructor TChartDataController.Create(const ADataServer: IDataServer<TAskBidItem>; AMemoTarget: TStrings);
|
||||
var
|
||||
I: Integer; // Standard loop variable
|
||||
begin
|
||||
inherited Create;
|
||||
FDataServer:=ADataServer;
|
||||
FMemoLog := AMemoTarget;
|
||||
FGenericBuilders := TDictionary<string, IGenericCandleBuilder>.Create;
|
||||
|
||||
@@ -210,7 +212,7 @@ procedure TChartDataController.LoadTickDataSeries(const AFileName: string);
|
||||
begin
|
||||
ClearAllDataAndCaches();
|
||||
try
|
||||
FTickDataArray := TAskBid.LoadDataSeries(AFileName).WaitFor();
|
||||
FTickDataArray := FDataServer.LoadDataSeries(AFileName).WaitFor();
|
||||
if FMemoLog <> nil then
|
||||
FMemoLog.Add(Format('DataController: Loading tick records from series: %s',
|
||||
[AFileName]));
|
||||
@@ -405,7 +407,7 @@ begin
|
||||
Result := Length(FTickDataArray);
|
||||
end;
|
||||
|
||||
function TChartDataController.GetTickDataItem(AIndex: Integer): TAskBid.TTick;
|
||||
function TChartDataController.GetTickDataItem(AIndex: Integer): TDataRecord<TAskBidItem>;
|
||||
begin
|
||||
if (AIndex >= 0) and (AIndex < Length(FTickDataArray)) then
|
||||
Result := FTickDataArray[AIndex]
|
||||
@@ -413,7 +415,7 @@ begin
|
||||
begin
|
||||
if FMemoLog <> nil then
|
||||
FMemoLog.Add(Format('DataController: Attempted to access invalid tick data index %d. Count is %d.', [AIndex, Length(FTickDataArray)]));
|
||||
Result := Default(TAskBid.TTick);
|
||||
Result := Default(TDataRecord<TAskBidItem>);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
+13
-13
@@ -35,7 +35,7 @@ interface
|
||||
uses
|
||||
System.Classes, System.SysUtils, System.Math,
|
||||
System.Generics.Collections, System.DateUtils,
|
||||
Myc.Trade.DataSeries;
|
||||
Myc.Trade.DataStream, Myc.Trade.DataPoint;
|
||||
|
||||
const
|
||||
TF_AUTO_AGGREGATION = 0;
|
||||
@@ -56,8 +56,8 @@ type
|
||||
|
||||
// Interface for generic candle building logic
|
||||
IGenericCandleBuilder = interface
|
||||
function Init(const ADataSet: TArray<TAskBid.TTick>): Boolean; // Changed DataSet to ADataSet for clarity
|
||||
function IsNewBar(AIndex: Integer; const ATick: TAskBid.TTick): Boolean; // Changed Idx to AIndex, Tick to ATick
|
||||
function Init(const ADataSet: TArray<TDataRecord<TAskBidItem>>): Boolean; // Changed DataSet to ADataSet for clarity
|
||||
function IsNewBar(AIndex: Integer; const ATick: TDataRecord<TAskBidItem>): Boolean; // Changed Idx to AIndex, Tick to ATick
|
||||
function GetCaption: string; // Method for the Caption property
|
||||
property Caption: string read GetCaption;
|
||||
end;
|
||||
@@ -80,7 +80,7 @@ type
|
||||
public
|
||||
constructor Create;
|
||||
procedure ClearCache;
|
||||
procedure Build(const ATickData: TArray<TAskBid.TTick>;
|
||||
procedure Build(const ATickData: TArray<TDataRecord<TAskBidItem>>;
|
||||
ASelectedTimeframeSeconds: Int64;
|
||||
AAutoAggCandleWidth: Integer;
|
||||
AAutoAggCandleSpacing: Integer;
|
||||
@@ -188,7 +188,7 @@ begin
|
||||
Result := Length(FCachedCandles);
|
||||
end;
|
||||
|
||||
procedure TOHLC.Build(const ATickData: TArray<TAskBid.TTick>;
|
||||
procedure TOHLC.Build(const ATickData: TArray<TDataRecord<TAskBidItem>>;
|
||||
ASelectedTimeframeSeconds: Int64;
|
||||
AAutoAggCandleWidth: Integer; AAutoAggCandleSpacing: Integer; AAutoAggPaintBoxClientWidth: Integer;
|
||||
AMemoForLogging: TStrings; AGenericCandleBuilder: IGenericCandleBuilder = nil); // Parameter changed
|
||||
@@ -200,7 +200,7 @@ var
|
||||
CandleList: TList<TCachedCandle>;
|
||||
TempCandle: TCachedCandle;
|
||||
LogTimePerCandleStr: string;
|
||||
CurrentTick: TAskBid.TTick;
|
||||
CurrentTick: TDataRecord<TAskBidItem>;
|
||||
begin
|
||||
if AMemoForLogging <> nil then
|
||||
AMemoForLogging.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + Format(' - TOHLC.Build: TF Secs: %d...',
|
||||
@@ -353,8 +353,8 @@ begin
|
||||
SetLength(FCachedCandles, NumCandlesToCacheAuto);
|
||||
if (NumDataPoints > 1) and (NumCandlesToCacheAuto > 0) then
|
||||
begin
|
||||
var FirstTickTimeVal_A := ATickData[0].OADateTime;
|
||||
var LastTickTimeVal_A := ATickData[High(ATickData)].OADateTime;
|
||||
var FirstTickTimeVal_A := ATickData[0].TimeStamp;
|
||||
var LastTickTimeVal_A := ATickData[High(ATickData)].TimeStamp;
|
||||
var TotalDataDurationDaysVal_A := LastTickTimeVal_A - FirstTickTimeVal_A;
|
||||
if NumCandlesToCacheAuto > 0 then // Avoid division by zero if NumCandlesToCacheAuto is somehow 0 here
|
||||
begin
|
||||
@@ -432,7 +432,7 @@ begin
|
||||
CurrentTickIndex := 0;
|
||||
while CurrentTickIndex <= High(ATickData) do
|
||||
begin
|
||||
BucketStartTimeOADate := Floor(ATickData[CurrentTickIndex].OADateTime / TimeframeIntervalOADays) * TimeframeIntervalOADays;
|
||||
BucketStartTimeOADate := Floor(ATickData[CurrentTickIndex].TimeStamp / TimeframeIntervalOADays) * TimeframeIntervalOADays;
|
||||
BucketEndTimeOADate := BucketStartTimeOADate + TimeframeIntervalOADays;
|
||||
|
||||
DataIndexStart := CurrentTickIndex;
|
||||
@@ -444,8 +444,8 @@ begin
|
||||
|
||||
// Iterate through ticks that fall into the current bucket
|
||||
while (CurrentTickIndex <= High(ATickData)) and
|
||||
(ATickData[CurrentTickIndex].OADateTime >= BucketStartTimeOADate) and
|
||||
(ATickData[CurrentTickIndex].OADateTime < BucketEndTimeOADate) do
|
||||
(ATickData[CurrentTickIndex].TimeStamp >= BucketStartTimeOADate) and
|
||||
(ATickData[CurrentTickIndex].TimeStamp < BucketEndTimeOADate) do
|
||||
begin
|
||||
if ATickData[CurrentTickIndex].Data.Ask > HighPrice then HighPrice := ATickData[CurrentTickIndex].Data.Ask; // Changed
|
||||
if ATickData[CurrentTickIndex].Data.Ask < LowPrice then LowPrice := ATickData[CurrentTickIndex].Data.Ask; // Changed
|
||||
@@ -492,8 +492,8 @@ begin
|
||||
|
||||
if Length(ATickData) > 0 then
|
||||
begin
|
||||
var FirstTickTimeVal := ATickData[0].OADateTime;
|
||||
var LastTickTimeVal := ATickData[High(ATickData)].OADateTime;
|
||||
var FirstTickTimeVal := ATickData[0].TimeStamp;
|
||||
var LastTickTimeVal := ATickData[High(ATickData)].TimeStamp;
|
||||
FTotalDataTimeSpanText := FormatTimeSpanFromSeconds((LastTickTimeVal - FirstTickTimeVal) * SecsPerDay_Double);
|
||||
if AMemoForLogging <> nil then
|
||||
AMemoForLogging.Add(Format('TOHLC.Build: Total data time span: %s.', [FTotalDataTimeSpanText]));
|
||||
|
||||
Reference in New Issue
Block a user