diff --git a/Include/MyIncludes/UltimateOscillator_Calculator.mqh b/Include/MyIncludes/UltimateOscillator_Calculator.mqh index 2e1e4f8..8fe66d5 100644 --- a/Include/MyIncludes/UltimateOscillator_Calculator.mqh +++ b/Include/MyIncludes/UltimateOscillator_Calculator.mqh @@ -15,8 +15,8 @@ class CUltimateOscillatorCalculator { protected: - int m_p1, m_p2, m_p3; - //--- CORRECTED: Removed invalid const member initialization + int m_p1, m_p2, m_p3, m_signal_p; + ENUM_MA_METHOD m_signal_ma_type; double m_src_high[], m_src_low[], m_src_close[]; virtual bool PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]); @@ -25,32 +25,36 @@ public: CUltimateOscillatorCalculator(void) {}; virtual ~CUltimateOscillatorCalculator(void) {}; - bool Init(int p1, int p2, int p3); - void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], double &uo_buffer[]); + bool Init(int p1, int p2, int p3, int signal_p, ENUM_MA_METHOD signal_ma); + void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], + double &uo_buffer[], double &signal_buffer[]); }; //+------------------------------------------------------------------+ //| CUltimateOscillatorCalculator: Initialization | //+------------------------------------------------------------------+ -bool CUltimateOscillatorCalculator::Init(int p1, int p2, int p3) +bool CUltimateOscillatorCalculator::Init(int p1, int p2, int p3, int signal_p, ENUM_MA_METHOD signal_ma) { - m_p1 = (p1 < 1) ? 1 : p1; - m_p2 = (p2 < 1) ? 1 : p2; - m_p3 = (p3 < 1) ? 1 : p3; + m_p1 = (p1 < 1) ? 1 : p1; + m_p2 = (p2 < 1) ? 1 : p2; + m_p3 = (p3 < 1) ? 1 : p3; + m_signal_p = (signal_p < 1) ? 1 : signal_p; + m_signal_ma_type = signal_ma; return true; } //+------------------------------------------------------------------+ //| CUltimateOscillatorCalculator: Main Calculation Method | //+------------------------------------------------------------------+ -void CUltimateOscillatorCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], double &uo_buffer[]) +void CUltimateOscillatorCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], + double &uo_buffer[], double &signal_buffer[]) { - if(rates_total <= MathMax(m_p1, MathMax(m_p2, m_p3))) + int max_period = MathMax(m_p1, MathMax(m_p2, m_p3)); + if(rates_total <= max_period) return; if(!PrepareSourceData(rates_total, open, high, low, close)) return; -//--- CORRECTED: Define constants locally inside the method const double W1=4.0, W2=2.0, W3=1.0, W_SUM=7.0; double bp[], tr[]; @@ -87,7 +91,7 @@ void CUltimateOscillatorCalculator::Calculate(int rates_total, const double &ope sum_bp3-=bp[i-m_p3]; sum_tr3-=tr[i-m_p3]; } - if(i >= m_p3) + if(i >= max_period) { double avg1 = (sum_tr1 > 0) ? sum_bp1 / sum_tr1 : 0; double avg2 = (sum_tr2 > 0) ? sum_bp2 / sum_tr2 : 0; @@ -95,6 +99,41 @@ void CUltimateOscillatorCalculator::Calculate(int rates_total, const double &ope uo_buffer[i] = 100.0 * (W1*avg1 + W2*avg2 + W3*avg3) / W_SUM; } } + +//--- Calculate Signal Line + int signal_start = max_period + m_signal_p - 1; + for(int i = signal_start; i < rates_total; i++) + { + switch(m_signal_ma_type) + { + case MODE_EMA: + case MODE_SMMA: + if(i == signal_start) + { + double sum=0; + for(int j=0; j0) signal_buffer[i]=sum/w_sum;} + break; + default: + {double sum=0; for(int j=0; j