Type System
This commit is contained in:
+192
-245
@@ -350,57 +350,24 @@ implementation
|
||||
|
||||
class constructor TSMA.CreateClass;
|
||||
begin
|
||||
{ var params := TDataType.RecordOf( [TRecordField.Create( 'Period', TDataType.Ordinal )] );
|
||||
var args := TDataType.RecordOf( [TRecordField.Create( 'Value', TDataType.Float )] );
|
||||
var results := TDataType.RecordOf( [TRecordField.Create( 'SMA', TDataType.Float )] );
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf( args, results );
|
||||
var factoryMethod := TDataType.MethodOf( params, indicatorMethod );
|
||||
|
||||
FFactory := factoryMethod.CreateValue(
|
||||
function( const Params: IDataValue ): IDataValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
|
||||
var SMA := CreateSMA( period );
|
||||
|
||||
Result := indicatorMethod.CreateValue(
|
||||
function( const Args: IDataValue ): IDataValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
|
||||
var res := SMA( value );
|
||||
|
||||
Result := results.CreateValue( [TDataValue.FromFloat(res)] );
|
||||
end );
|
||||
end );
|
||||
}
|
||||
|
||||
// ....or....
|
||||
var params := TDataType.Ordinal;
|
||||
var args := TDataType.Float;
|
||||
var results := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(Params).AsOrdinal.Value;
|
||||
|
||||
var SMA := CreateSMA(period);
|
||||
|
||||
// Local variable is necessary here to capture the created function.
|
||||
var SMA := CreateSMA(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(Args).AsFloat.Value;
|
||||
|
||||
var res := SMA(value);
|
||||
|
||||
Result := results.CreateValue(res);
|
||||
Result := TDataType.FromFloat(SMA(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -483,28 +450,23 @@ end;
|
||||
|
||||
class constructor TEMA.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('EMA', TDataType.Float)]);
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
|
||||
var EMA := CreateEMA(period);
|
||||
|
||||
var EMA := CreateEMA(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := EMA(value);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(EMA(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -571,26 +533,23 @@ end;
|
||||
|
||||
class constructor TWMA.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('WMA', TDataType.Float)]);
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
var WMA := CreateWMA(period);
|
||||
var WMA := CreateWMA(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := WMA(value);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(WMA(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -669,26 +628,23 @@ end;
|
||||
|
||||
class constructor THMA.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('HMA', TDataType.Float)]);
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
var HMA := CreateHMA(period);
|
||||
var HMA := CreateHMA(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := HMA(value);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(HMA(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -740,26 +696,23 @@ end;
|
||||
|
||||
class constructor TRSI.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('RSI', TDataType.Float)]);
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
var RSI := CreateRSI(period);
|
||||
var RSI := CreateRSI(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := RSI(value);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(RSI(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -841,7 +794,7 @@ end;
|
||||
|
||||
class constructor TMACD.CreateClass;
|
||||
begin
|
||||
var params :=
|
||||
var paramsType :=
|
||||
TDataType.RecordOf(
|
||||
[
|
||||
TRecordField.Create('FastPeriod', TDataType.Ordinal),
|
||||
@@ -849,8 +802,8 @@ begin
|
||||
TRecordField.Create('SignalPeriod', TDataType.Ordinal)
|
||||
]
|
||||
);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results :=
|
||||
var argsType := TDataType.Float;
|
||||
var resultType :=
|
||||
TDataType.RecordOf(
|
||||
[
|
||||
TRecordField.Create('MacdLine', TDataType.Float),
|
||||
@@ -859,33 +812,34 @@ begin
|
||||
]
|
||||
);
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
paramsRec: IDataRecordValue;
|
||||
paramsRec: TDataRecordValue;
|
||||
begin
|
||||
paramsRec := TDataValue(Params).AsRecord;
|
||||
var fastPeriod := TDataValue(paramsRec.Items[0]).AsOrdinal.Value;
|
||||
var slowPeriod := TDataValue(paramsRec.Items[1]).AsOrdinal.Value;
|
||||
var signalPeriod := TDataValue(paramsRec.Items[2]).AsOrdinal.Value;
|
||||
var MACD := CreateMACD(fastPeriod, slowPeriod, signalPeriod);
|
||||
paramsRec := Params.AsRecord;
|
||||
var MACD :=
|
||||
CreateMACD(
|
||||
TDataType.TValue(paramsRec.Items[0]).AsOrdinal.Value,
|
||||
TDataType.TValue(paramsRec.Items[1]).AsOrdinal.Value,
|
||||
TDataType.TValue(paramsRec.Items[2]).AsOrdinal.Value
|
||||
);
|
||||
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := MACD(value);
|
||||
var res := MACD(Args.AsFloat.Value);
|
||||
Result :=
|
||||
results.CreateValue(
|
||||
resultType.CreateValue(
|
||||
[
|
||||
TDataValue.FromFloat(res.MacdLine),
|
||||
TDataValue.FromFloat(res.SignalLine),
|
||||
TDataValue.FromFloat(res.Histogram)
|
||||
TDataType.FromFloat(res.MacdLine),
|
||||
TDataType.FromFloat(res.SignalLine),
|
||||
TDataType.FromFloat(res.Histogram)
|
||||
]
|
||||
);
|
||||
end
|
||||
@@ -1007,7 +961,7 @@ end;
|
||||
|
||||
class constructor TStochastic.CreateClass;
|
||||
begin
|
||||
var params :=
|
||||
var paramsType :=
|
||||
TDataType.RecordOf([TRecordField.Create('KPeriod', TDataType.Ordinal), TRecordField.Create('DPeriod', TDataType.Ordinal)]);
|
||||
|
||||
var ohlcType :=
|
||||
@@ -1021,42 +975,43 @@ begin
|
||||
]
|
||||
);
|
||||
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', ohlcType)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('K', TDataType.Float), TRecordField.Create('D', TDataType.Float)]);
|
||||
var argsType := ohlcType;
|
||||
var resultType := TDataType.RecordOf([TRecordField.Create('K', TDataType.Float), TRecordField.Create('D', TDataType.Float)]);
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
paramsRec: IDataRecordValue;
|
||||
paramsRec: TDataRecordValue;
|
||||
begin
|
||||
paramsRec := TDataValue(Params).AsRecord;
|
||||
var kPeriod := TDataValue(paramsRec.Items[0]).AsOrdinal.Value;
|
||||
var dPeriod := TDataValue(paramsRec.Items[1]).AsOrdinal.Value;
|
||||
var Stochastic := CreateStochastic(kPeriod, dPeriod);
|
||||
paramsRec := Params.AsRecord;
|
||||
var Stochastic :=
|
||||
CreateStochastic(
|
||||
TDataType.TValue(paramsRec.Items[0]).AsOrdinal.Value,
|
||||
TDataType.TValue(paramsRec.Items[1]).AsOrdinal.Value
|
||||
);
|
||||
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
argRec, ohlcRec: IDataRecordValue;
|
||||
ohlcRec: TDataRecordValue;
|
||||
ohlcVal: TOhlcItem;
|
||||
begin
|
||||
argRec := TDataValue(Args).AsRecord;
|
||||
ohlcRec := TDataValue(argRec.Items[0]).AsRecord;
|
||||
ohlcRec := Args.AsRecord;
|
||||
|
||||
ohlcVal.Open := TDataValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
ohlcVal.Open := TDataType.TValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataType.TValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataType.TValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataType.TValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataType.TValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
|
||||
var res := Stochastic(ohlcVal);
|
||||
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res.K), TDataValue.FromFloat(res.D)]);
|
||||
Result := resultType.CreateValue([TDataType.FromFloat(res.K), TDataType.FromFloat(res.D)]);
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -1172,26 +1127,23 @@ end;
|
||||
|
||||
class constructor TStdDev.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('StdDev', TDataType.Float)]);
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var argsType := TDataType.Float;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
var StdDev := CreateStdDev(period);
|
||||
var StdDev := CreateStdDev(Params.AsOrdinal.Value);
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := StdDev(value);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(StdDev(Args.AsFloat.Value));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -1265,10 +1217,10 @@ end;
|
||||
|
||||
class constructor TBollingerBands.CreateClass;
|
||||
begin
|
||||
var params :=
|
||||
var paramsType :=
|
||||
TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal), TRecordField.Create('Multiplier', TDataType.Float)]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', TDataType.Float)]);
|
||||
var results :=
|
||||
var argsType := TDataType.Float;
|
||||
var resultType :=
|
||||
TDataType.RecordOf(
|
||||
[
|
||||
TRecordField.Create('UpperBand', TDataType.Float),
|
||||
@@ -1277,32 +1229,33 @@ begin
|
||||
]
|
||||
);
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
paramsRec: IDataRecordValue;
|
||||
paramsRec: TDataRecordValue;
|
||||
begin
|
||||
paramsRec := TDataValue(Params).AsRecord;
|
||||
var period := TDataValue(paramsRec.Items[0]).AsOrdinal.Value;
|
||||
var multiplier := TDataValue(paramsRec.Items[1]).AsFloat.Value;
|
||||
var BollingerBands := CreateBollingerBands(period, multiplier);
|
||||
paramsRec := Params.AsRecord;
|
||||
var BollingerBands :=
|
||||
CreateBollingerBands(
|
||||
TDataType.TValue(paramsRec.Items[0]).AsOrdinal.Value,
|
||||
TDataType.TValue(paramsRec.Items[1]).AsFloat.Value
|
||||
);
|
||||
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var value := TDataValue(TDataValue(Args).AsRecord.Items[0]).AsFloat.Value;
|
||||
var res := BollingerBands(value);
|
||||
var res := BollingerBands(Args.AsFloat.Value);
|
||||
Result :=
|
||||
results.CreateValue(
|
||||
resultType.CreateValue(
|
||||
[
|
||||
TDataValue.FromFloat(res.UpperBand),
|
||||
TDataValue.FromFloat(res.MiddleBand),
|
||||
TDataValue.FromFloat(res.LowerBand)
|
||||
TDataType.FromFloat(res.UpperBand),
|
||||
TDataType.FromFloat(res.MiddleBand),
|
||||
TDataType.FromFloat(res.LowerBand)
|
||||
]
|
||||
);
|
||||
end
|
||||
@@ -1359,8 +1312,7 @@ end;
|
||||
|
||||
class constructor TATR.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal)]);
|
||||
|
||||
var paramsType := TDataType.Ordinal;
|
||||
var ohlcType :=
|
||||
TDataType.RecordOf(
|
||||
[
|
||||
@@ -1371,35 +1323,32 @@ begin
|
||||
TRecordField.Create('Volume', TDataType.Float)
|
||||
]
|
||||
);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', ohlcType)]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('ATR', TDataType.Float)]);
|
||||
var argsType := ohlcType;
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var period := TDataValue(TDataValue(Params).AsRecord.Items[0]).AsOrdinal.Value;
|
||||
var ATR := CreateATR(period);
|
||||
var ATR := CreateATR(Params.AsOrdinal.Value);
|
||||
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
argRec, ohlcRec: IDataRecordValue;
|
||||
ohlcRec: TDataRecordValue;
|
||||
ohlcVal: TOhlcItem;
|
||||
begin
|
||||
argRec := TDataValue(Args).AsRecord;
|
||||
ohlcRec := TDataValue(argRec.Items[0]).AsRecord;
|
||||
ohlcVal.Open := TDataValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
var res := ATR(ohlcVal);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
ohlcRec := Args.AsRecord;
|
||||
ohlcVal.Open := TDataType.TValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataType.TValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataType.TValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataType.TValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataType.TValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
Result := TDataType.FromFloat(ATR(ohlcVal));
|
||||
end
|
||||
);
|
||||
end
|
||||
@@ -1455,7 +1404,7 @@ end;
|
||||
|
||||
class constructor TKeltnerChannels.CreateClass;
|
||||
begin
|
||||
var params :=
|
||||
var paramsType :=
|
||||
TDataType.RecordOf([TRecordField.Create('Period', TDataType.Ordinal), TRecordField.Create('Multiplier', TDataType.Float)]);
|
||||
var ohlcType :=
|
||||
TDataType.RecordOf(
|
||||
@@ -1467,8 +1416,8 @@ begin
|
||||
TRecordField.Create('Volume', TDataType.Float)
|
||||
]
|
||||
);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Value', ohlcType)]);
|
||||
var results :=
|
||||
var argsType := ohlcType;
|
||||
var resultType :=
|
||||
TDataType.RecordOf(
|
||||
[
|
||||
TRecordField.Create('UpperBand', TDataType.Float),
|
||||
@@ -1477,42 +1426,43 @@ begin
|
||||
]
|
||||
);
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
paramsRec: IDataRecordValue;
|
||||
paramsRec: TDataRecordValue;
|
||||
begin
|
||||
paramsRec := TDataValue(Params).AsRecord;
|
||||
var period := TDataValue(paramsRec.Items[0]).AsOrdinal.Value;
|
||||
var multiplier := TDataValue(paramsRec.Items[1]).AsFloat.Value;
|
||||
var KeltnerChannels := CreateKeltnerChannels(period, multiplier);
|
||||
paramsRec := Params.AsRecord;
|
||||
var KeltnerChannels :=
|
||||
CreateKeltnerChannels(
|
||||
TDataType.TValue(paramsRec.Items[0]).AsOrdinal.Value,
|
||||
TDataType.TValue(paramsRec.Items[1]).AsFloat.Value
|
||||
);
|
||||
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
argRec, ohlcRec: IDataRecordValue;
|
||||
ohlcRec: TDataRecordValue;
|
||||
ohlcVal: TOhlcItem;
|
||||
begin
|
||||
argRec := TDataValue(Args).AsRecord;
|
||||
ohlcRec := TDataValue(argRec.Items[0]).AsRecord;
|
||||
ohlcVal.Open := TDataValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
ohlcRec := Args.AsRecord;
|
||||
ohlcVal.Open := TDataType.TValue(ohlcRec.Items[0]).AsFloat.Value;
|
||||
ohlcVal.High := TDataType.TValue(ohlcRec.Items[1]).AsFloat.Value;
|
||||
ohlcVal.Low := TDataType.TValue(ohlcRec.Items[2]).AsFloat.Value;
|
||||
ohlcVal.Close := TDataType.TValue(ohlcRec.Items[3]).AsFloat.Value;
|
||||
ohlcVal.Volume := TDataType.TValue(ohlcRec.Items[4]).AsFloat.Value;
|
||||
|
||||
var res := KeltnerChannels(ohlcVal);
|
||||
Result :=
|
||||
results.CreateValue(
|
||||
resultType.CreateValue(
|
||||
[
|
||||
TDataValue.FromFloat(res.UpperBand),
|
||||
TDataValue.FromFloat(res.MiddleBand),
|
||||
TDataValue.FromFloat(res.LowerBand)
|
||||
TDataType.FromFloat(res.UpperBand),
|
||||
TDataType.FromFloat(res.MiddleBand),
|
||||
TDataType.FromFloat(res.LowerBand)
|
||||
]
|
||||
);
|
||||
end
|
||||
@@ -1576,35 +1526,32 @@ end;
|
||||
|
||||
class constructor TMean.CreateClass;
|
||||
begin
|
||||
var params := TDataType.RecordOf([]);
|
||||
var args := TDataType.RecordOf([TRecordField.Create('Values', TDataType.ArrayOf(TDataType.Float))]);
|
||||
var results := TDataType.RecordOf([TRecordField.Create('Mean', TDataType.Float)]);
|
||||
var paramsType := TDataType.RecordOf([]);
|
||||
var argsType := TDataType.ArrayOf(TDataType.Float);
|
||||
var resultType := TDataType.Float;
|
||||
|
||||
var indicatorMethod := TDataType.MethodOf(args, results);
|
||||
var factoryMethod := TDataType.MethodOf(params, indicatorMethod);
|
||||
var indicatorMethodType := TDataType.MethodOf(argsType, resultType);
|
||||
var factoryMethodType := TDataType.MethodOf(paramsType, indicatorMethodType);
|
||||
|
||||
FFactory :=
|
||||
factoryMethod.CreateValue(
|
||||
function(const Params: IDataValue): IDataValue
|
||||
factoryMethodType.CreateValue(
|
||||
function(const Params: TDataType.TValue): TDataType.TValue
|
||||
begin
|
||||
var Mean := CreateMean();
|
||||
Result :=
|
||||
indicatorMethod.CreateValue(
|
||||
function(const Args: IDataValue): IDataValue
|
||||
indicatorMethodType.CreateValue(
|
||||
function(const Args: TDataType.TValue): TDataType.TValue
|
||||
var
|
||||
i: Integer;
|
||||
argsRec: IDataRecordValue;
|
||||
valuesArray: IDataArrayValue;
|
||||
valuesArray: TDataArrayValue;
|
||||
values: TArray<Double>;
|
||||
begin
|
||||
argsRec := TDataValue(Args).AsRecord;
|
||||
valuesArray := TDataValue(argsRec.Items[0]).AsArray;
|
||||
valuesArray := Args.AsArray;
|
||||
SetLength(values, valuesArray.ElementCount);
|
||||
for i := 0 to valuesArray.ElementCount - 1 do
|
||||
values[i] := TDataValue(valuesArray.Items[i]).AsFloat.Value;
|
||||
values[i] := TDataType.TValue(valuesArray.Items[i]).AsFloat.Value;
|
||||
|
||||
var res := Mean(values);
|
||||
Result := results.CreateValue([TDataValue.FromFloat(res)]);
|
||||
Result := TDataType.FromFloat(Mean(values));
|
||||
end
|
||||
);
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user