diff --git a/Include/MyIncludes/WPR_Calculator.mqh b/Include/MyIncludes/WPR_Calculator.mqh new file mode 100644 index 0000000..e035247 --- /dev/null +++ b/Include/MyIncludes/WPR_Calculator.mqh @@ -0,0 +1,107 @@ +//+------------------------------------------------------------------+ +//| WPR_Calculator.mqh | +//| Adapter for the StochasticFast_Calculator to produce WPR. | +//| Copyright 2025, xxxxxxxx | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" + +#include // Re-use the Fast Stoch engine + +//+==================================================================+ +//| | +//| CLASS 1: CWPRCalculator (Base Class) | +//| | +//+==================================================================+ +class CWPRCalculator + { +protected: + CStochasticFastCalculator *m_stoch_calculator; + +public: + CWPRCalculator(void); + virtual ~CWPRCalculator(void); + + bool Init(int wpr_p, 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 &wpr_buffer[], double &signal_buffer[]); + }; + +//+------------------------------------------------------------------+ +//| CWPRCalculator: Constructor | +//+------------------------------------------------------------------+ +CWPRCalculator::CWPRCalculator(void) + { + m_stoch_calculator = new CStochasticFastCalculator(); + } + +//+------------------------------------------------------------------+ +//| CWPRCalculator: Destructor | +//+------------------------------------------------------------------+ +CWPRCalculator::~CWPRCalculator(void) + { + if(CheckPointer(m_stoch_calculator) != POINTER_INVALID) + delete m_stoch_calculator; + } + +//+------------------------------------------------------------------+ +//| CWPRCalculator: Initialization | +//+------------------------------------------------------------------+ +bool CWPRCalculator::Init(int wpr_p, int signal_p, ENUM_MA_METHOD signal_ma) + { + if(CheckPointer(m_stoch_calculator) == POINTER_INVALID) + return false; +// WPR Period is Fast Stoch %K Period, Signal Period is Fast Stoch %D Period + return m_stoch_calculator.Init(wpr_p, signal_p, signal_ma); + } + +//+------------------------------------------------------------------+ +//| CWPRCalculator: Main Calculation Method | +//+------------------------------------------------------------------+ +void CWPRCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], + double &wpr_buffer[], double &signal_buffer[]) + { + if(CheckPointer(m_stoch_calculator) == POINTER_INVALID) + return; + + double k_buffer[], d_buffer[]; + ArrayResize(k_buffer, rates_total); + ArrayResize(d_buffer, rates_total); + + m_stoch_calculator.Calculate(rates_total, open, high, low, close, k_buffer, d_buffer); + + for(int i = 0; i < rates_total; i++) + { + if(k_buffer[i] != EMPTY_VALUE) + wpr_buffer[i] = k_buffer[i] - 100.0; + else + wpr_buffer[i] = EMPTY_VALUE; + + if(d_buffer[i] != EMPTY_VALUE) + signal_buffer[i] = d_buffer[i] - 100.0; + else + signal_buffer[i] = EMPTY_VALUE; + } + } + +//+==================================================================+ +//| | +//| CLASS 2: CWPRCalculator_HA (Heikin Ashi) | +//| | +//+==================================================================+ +class CWPRCalculator_HA : public CWPRCalculator + { +public: + CWPRCalculator_HA(void); + }; + +//+------------------------------------------------------------------+ +//| CWPRCalculator_HA: Constructor | +//+------------------------------------------------------------------+ +CWPRCalculator_HA::CWPRCalculator_HA(void) + { + if(CheckPointer(m_stoch_calculator) != POINTER_INVALID) + delete m_stoch_calculator; + m_stoch_calculator = new CStochasticFastCalculator_HA(); + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+