Polished DataProvider & Converter, RTTI field access

This commit is contained in:
Michael Schimmel
2025-07-15 01:56:44 +02:00
parent 4247fde7cd
commit 1a2b6cf8a0
15 changed files with 687 additions and 1044 deletions
+16 -15
View File
@@ -6,7 +6,8 @@ uses
System.SysUtils,
System.Math,
Myc.Trade.Types,
Myc.Trade.DataArray;
Myc.Trade.DataArray,
Myc.Trade.DataConverter;
type
// Result for the Moving Average Convergence Divergence (MACD) indicator.
@@ -36,19 +37,19 @@ type
class function CalculateWMA(const Series: TMycDataArray<Double>; const Period: Integer): Double; static;
public
// Simple Moving Average
class function CreateSMA(Period: Integer): TIndicatorFunc<Double, Double>; static;
class function CreateSMA(Period: Integer): TConstFunc<Double, Double>; static;
// Exponential Moving Average
class function CreateEMA(Period: Integer): TIndicatorFunc<Double, Double>; static;
class function CreateEMA(Period: Integer): TConstFunc<Double, Double>; static;
// Hull Moving Average
class function CreateHMA(Period: Integer): TIndicatorFunc<Double, Double>; static;
class function CreateHMA(Period: Integer): TConstFunc<Double, Double>; static;
// Relative Strength Index
class function CreateRSI(Period: Integer): TIndicatorFunc<Double, Double>; static;
class function CreateRSI(Period: Integer): TConstFunc<Double, Double>; static;
// Moving Average Convergence Divergence
class function CreateMACD(FastPeriod, SlowPeriod, SignalPeriod: Integer): TIndicatorFunc<Double, TMacdResult>; static;
class function CreateMACD(FastPeriod, SlowPeriod, SignalPeriod: Integer): TConstFunc<Double, TMacdResult>; static;
// Stochastic Oscillator
class function CreateStochastic(KPeriod, DPeriod: Integer): TIndicatorFunc<TOhlcItem, TStochasticResult>; static;
class function CreateStochastic(KPeriod, DPeriod: Integer): TConstFunc<TOhlcItem, TStochasticResult>; static;
// Bollinger Bands
class function CreateBollingerBands(Period: Integer; Multiplier: Double): TIndicatorFunc<Double, TBollingerBandsResult>; static;
class function CreateBollingerBands(Period: Integer; Multiplier: Double): TConstFunc<Double, TBollingerBandsResult>; static;
end;
implementation
@@ -112,7 +113,7 @@ begin
Result := numerator / denominator;
end;
class function TIndicators.CreateBollingerBands(Period: Integer; Multiplier: Double): TIndicatorFunc<Double, TBollingerBandsResult>;
class function TIndicators.CreateBollingerBands(Period: Integer; Multiplier: Double): TConstFunc<Double, TBollingerBandsResult>;
begin
var sourceData := TMycDataArray<Double>.CreateEmpty;
Result :=
@@ -135,7 +136,7 @@ begin
end;
end;
class function TIndicators.CreateEMA(Period: Integer): TIndicatorFunc<Double, Double>;
class function TIndicators.CreateEMA(Period: Integer): TConstFunc<Double, Double>;
begin
var lastEma: Double := Double.NaN;
var sourceData := TMycDataArray<Double>.CreateEmpty;
@@ -166,7 +167,7 @@ begin
end;
end;
class function TIndicators.CreateHMA(Period: Integer): TIndicatorFunc<Double, Double>;
class function TIndicators.CreateHMA(Period: Integer): TConstFunc<Double, Double>;
begin
var periodHalf := Period div 2;
var periodSqrt := Round(Sqrt(Period));
@@ -208,7 +209,7 @@ begin
end;
end;
class function TIndicators.CreateMACD(FastPeriod, SlowPeriod, SignalPeriod: Integer): TIndicatorFunc<Double, TMacdResult>;
class function TIndicators.CreateMACD(FastPeriod, SlowPeriod, SignalPeriod: Integer): TConstFunc<Double, TMacdResult>;
begin
var emaFast := CreateEMA(FastPeriod);
var emaSlow := CreateEMA(SlowPeriod);
@@ -240,7 +241,7 @@ begin
end;
end;
class function TIndicators.CreateRSI(Period: Integer): TIndicatorFunc<Double, Double>;
class function TIndicators.CreateRSI(Period: Integer): TConstFunc<Double, Double>;
begin
var avgGain: Double := Double.NaN;
var avgLoss: Double := Double.NaN;
@@ -299,7 +300,7 @@ begin
end;
end;
class function TIndicators.CreateSMA(Period: Integer): TIndicatorFunc<Double, Double>;
class function TIndicators.CreateSMA(Period: Integer): TConstFunc<Double, Double>;
begin
var sourceData := TMycDataArray<Double>.CreateEmpty;
Result :=
@@ -313,7 +314,7 @@ begin
end;
end;
class function TIndicators.CreateStochastic(KPeriod, DPeriod: Integer): TIndicatorFunc<TOhlcItem, TStochasticResult>;
class function TIndicators.CreateStochastic(KPeriod, DPeriod: Integer): TConstFunc<TOhlcItem, TStochasticResult>;
begin
var sourceData := TMycDataArray<TOhlcItem>.CreateEmpty;
var smaD := CreateSMA(DPeriod);