From fdebb399312153c5facc25a17015eb0b8c745ae7 Mon Sep 17 00:00:00 2001 From: kenorb Date: Mon, 28 Aug 2023 21:10:37 +0100 Subject: [PATCH] Adds ROC --- Stg_Oscillator.mq5 | 1 + Stg_Oscillator.mqh | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Stg_Oscillator.mq5 b/Stg_Oscillator.mq5 index 23ecb5c..3259c71 100644 --- a/Stg_Oscillator.mq5 +++ b/Stg_Oscillator.mq5 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include diff --git a/Stg_Oscillator.mqh b/Stg_Oscillator.mqh index 6fd4a52..4c8e037 100644 --- a/Stg_Oscillator.mqh +++ b/Stg_Oscillator.mqh @@ -20,6 +20,7 @@ enum ENUM_STG_OSCILLATOR_TYPE { STG_OSCILLATOR_TYPE_MOM, // MOM: Momentum STG_OSCILLATOR_TYPE_OBV, // OBV: On Balance Volume STG_OSCILLATOR_TYPE_PVT, // PVT: Price and Volume Trend + STG_OSCILLATOR_TYPE_ROC, // ROC: Rate of Change STG_OSCILLATOR_TYPE_RSI, // RSI STG_OSCILLATOR_TYPE_STDDEV, // StdDev: Standard Deviation STG_OSCILLATOR_TYPE_STOCH, // Stochastic @@ -108,6 +109,11 @@ INPUT_GROUP("Oscillator strategy: PVT oscillator params"); INPUT ENUM_APPLIED_VOLUME Oscillator_Indi_PVT_InpVolumeType = VOLUME_TICK; // Volumes INPUT int Oscillator_Indi_PVT_Shift = 0; // Shift INPUT ENUM_IDATA_SOURCE_TYPE Oscillator_Indi_PVT_SourceType = IDATA_BUILTIN; // Source type +INPUT_GROUP("Oscillator strategy: ROC oscillator params"); +INPUT int Oscillator_Indi_ROC_Period = 16; // Period +INPUT ENUM_APPLIED_PRICE Oscillator_Indi_ROC_Applied_Price = PRICE_WEIGHTED; // Applied Price +INPUT int Oscillator_Indi_ROC_Shift = 0; // Shift +INPUT ENUM_IDATA_SOURCE_TYPE Oscillator_Indi_ROC_SourceType = IDATA_BUILTIN; // Source type INPUT_GROUP("Oscillator strategy: RSI oscillator params"); INPUT int Oscillator_Indi_RSI_Period = 16; // Period INPUT ENUM_APPLIED_PRICE Oscillator_Indi_RSI_Applied_Price = PRICE_WEIGHTED; // Applied Price @@ -225,6 +231,10 @@ class Stg_Oscillator : public Strategy { _result &= dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift) && dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift + 1); break; + case STG_OSCILLATOR_TYPE_ROC: + _result &= dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift) && + dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift + 1); + break; case STG_OSCILLATOR_TYPE_RSI: _result &= dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift) && dynamic_cast(_indi).GetFlag(INDI_ENTRY_FLAG_IS_VALID, _shift + 1); @@ -371,6 +381,14 @@ class Stg_Oscillator : public Strategy { SetIndicator(new Indi_PriceVolumeTrend(_indi_params), ::Oscillator_Type); break; } + case STG_OSCILLATOR_TYPE_ROC: // ROC + { + IndiRateOfChangeParams _indi_params(::Oscillator_Indi_ROC_Period, ::Oscillator_Indi_ROC_Applied_Price, ::Oscillator_Indi_ROC_Shift); + _indi_params.SetDataSourceType(::Oscillator_Indi_ROC_SourceType); + _indi_params.SetTf(Get(STRAT_PARAM_TF)); + SetIndicator(new Indi_RateOfChange(_indi_params), ::Oscillator_Type); + break; + } case STG_OSCILLATOR_TYPE_RSI: // RSI { IndiRSIParams _indi_params(::Oscillator_Indi_RSI_Period, ::Oscillator_Indi_RSI_Applied_Price,