From f537850f034b2f9dfbf38a588afa2b701a10df56 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Fri, 3 Oct 2025 15:30:08 +0200 Subject: [PATCH] refactor: --- Include/MyIncludes/CCI_Calculator.mqh | 243 ++++++++++++++++++++++---- 1 file changed, 210 insertions(+), 33 deletions(-) diff --git a/Include/MyIncludes/CCI_Calculator.mqh b/Include/MyIncludes/CCI_Calculator.mqh index dd02874..6d40a60 100644 --- a/Include/MyIncludes/CCI_Calculator.mqh +++ b/Include/MyIncludes/CCI_Calculator.mqh @@ -1,51 +1,228 @@ //+------------------------------------------------------------------+ //| CCI_Calculator.mqh | -//| Wrapper for the CCI_Engine to produce CCI output. | +//| Calculation engine for CCI Pro (CCI, Signal Line, BBands). | //| Copyright 2025, xxxxxxxx | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, xxxxxxxx" -#include +#include -//--- This class is an abstract base for polymorphism +//+==================================================================+ +//| | +//| CLASS 1: CCCI_Calculator (Base Class) | +//| | +//+==================================================================+ class CCCI_Calculator { -public: - virtual bool Init(int cci_p, int ma_p, ENUM_MA_METHOD ma_m)=0; - virtual void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, double &cci_buffer[], double &signal_buffer[])=0; - }; - -//--- Standard version uses the standard engine -class CCCI_Calculator_Std : public CCCI_Calculator - { protected: - CCCI_Engine *m_engine; -public: - CCCI_Calculator_Std(void) { m_engine = new CCCI_Engine(); } - ~CCCI_Calculator_Std(void) { if(CheckPointer(m_engine)!=POINTER_INVALID) delete m_engine; } + int m_cci_period, m_ma_period, m_bands_period; + ENUM_MA_METHOD m_ma_method; + double m_bands_dev; + double m_price[]; - virtual bool Init(int cci_p, int ma_p, ENUM_MA_METHOD ma_m) override { return m_engine.Init(cci_p, ma_p, ma_m); } - virtual void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, double &cci_buffer[], double &signal_buffer[]) override - { - if(CheckPointer(m_engine)!=POINTER_INVALID) - m_engine.Calculate(rates_total, open, high, low, close, price_type, cci_buffer, signal_buffer); - } + virtual bool PreparePriceSeries(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type); + +public: + CCCI_Calculator(void) {}; + virtual ~CCCI_Calculator(void) {}; + + bool Init(int cci_p, int ma_p, ENUM_MA_METHOD ma_m, int bands_p, double bands_dev); + void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, + double &cci_out[], double &signal_out[], double &upper_out[], double &lower_out[]); }; -//--- HA version uses the HA engine +//+------------------------------------------------------------------+ +//| CCCI_Calculator: Initialization | +//+------------------------------------------------------------------+ +bool CCCI_Calculator::Init(int cci_p, int ma_p, ENUM_MA_METHOD ma_m, int bands_p, double bands_dev) + { + m_cci_period = (cci_p < 1) ? 1 : cci_p; + m_ma_period = (ma_p < 1) ? 1 : ma_p; + m_ma_method = ma_m; + m_bands_period = (bands_p < 1) ? 1 : bands_p; + m_bands_dev = (bands_dev <= 0) ? 2.0 : bands_dev; + return true; + } + +//+------------------------------------------------------------------+ +//| CCCI_Calculator: Main Calculation Method (Shared Logic) | +//+------------------------------------------------------------------+ +void CCCI_Calculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, + double &cci_out[], double &signal_out[], double &upper_out[], double &lower_out[]) + { + if(rates_total <= m_cci_period + m_bands_period) + return; + if(!PreparePriceSeries(rates_total, open, high, low, close, price_type)) + return; + + double buffer_sma[], buffer_mad[]; + ArrayResize(buffer_sma, rates_total); + ArrayResize(buffer_mad, rates_total); + const double CCI_CONSTANT = 0.015; + +//--- Calculate CCI --- + double sma_sum = 0; + for(int i = 0; i < rates_total; i++) + { + sma_sum += m_price[i]; + if(i >= m_cci_period) + sma_sum -= m_price[i - m_cci_period]; + if(i >= m_cci_period - 1) + buffer_sma[i] = sma_sum / m_cci_period; + } + for(int i = m_cci_period - 1; i < rates_total; i++) + { + double deviation_sum = 0; + for(int j = 0; j < m_cci_period; j++) + deviation_sum += MathAbs(m_price[i - j] - buffer_sma[i]); + buffer_mad[i] = deviation_sum / m_cci_period; + } + for(int i = m_cci_period - 1; i < rates_total; i++) + { + if(buffer_mad[i] > 0) + cci_out[i] = (m_price[i] - buffer_sma[i]) / (CCI_CONSTANT * buffer_mad[i]); + } + +//--- Calculate Signal Line (MA of CCI) --- + int ma_start_pos = m_cci_period + m_ma_period - 2; + for(int i = ma_start_pos; i < rates_total; i++) + { + switch(m_ma_method) + { + case MODE_EMA: + case MODE_SMMA: + if(i == ma_start_pos) + { + double sum=0; + for(int j=0; j0) signal_out[i]=sum/w_sum;} + break; + default: + {double sum=0; for(int j=0; j