diff --git a/Include/MyIncludes/StochRSI_Fast_Calculator.mqh b/Include/MyIncludes/StochRSI_Fast_Calculator.mqh new file mode 100644 index 0000000..540484d --- /dev/null +++ b/Include/MyIncludes/StochRSI_Fast_Calculator.mqh @@ -0,0 +1,183 @@ +//+------------------------------------------------------------------+ +//| StochRSI_Fast_Calculator.mqh| +//| Calculation engine for Standard and Heikin Ashi Fast StochRSI. | +//| Copyright 2025, xxxxxxxx | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" + +#include // Re-use the RSI Pro engine + +//+==================================================================+ +//| | +//| CLASS 1: CStochRSI_Fast_Calculator (Base Class) | +//| | +//+==================================================================+ +class CStochRSI_Fast_Calculator + { +protected: + int m_rsi_period, m_k_period, m_d_period; + ENUM_MA_METHOD m_d_ma_type; + CRSIProCalculator *m_rsi_calculator; + + double Highest(const double &array[], int period, int current_pos); + double Lowest(const double &array[], int period, int current_pos); + +public: + CStochRSI_Fast_Calculator(void); + virtual ~CStochRSI_Fast_Calculator(void); + + bool Init(int rsi_p, int k_p, int d_p, ENUM_MA_METHOD d_ma); + void Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, + double &k_buffer[], double &d_buffer[]); + }; + +//+------------------------------------------------------------------+ +//| CStochRSI_Fast_Calculator: Constructor | +//+------------------------------------------------------------------+ +CStochRSI_Fast_Calculator::CStochRSI_Fast_Calculator(void) + { + m_rsi_calculator = new CRSIProCalculator(); + } + +//+------------------------------------------------------------------+ +//| CStochRSI_Fast_Calculator: Destructor | +//+------------------------------------------------------------------+ +CStochRSI_Fast_Calculator::~CStochRSI_Fast_Calculator(void) + { + if(CheckPointer(m_rsi_calculator) != POINTER_INVALID) + delete m_rsi_calculator; + } + +//+------------------------------------------------------------------+ +//| CStochRSI_Fast_Calculator: Initialization | +//+------------------------------------------------------------------+ +bool CStochRSI_Fast_Calculator::Init(int rsi_p, int k_p, int d_p, ENUM_MA_METHOD d_ma) + { + m_rsi_period = (rsi_p < 1) ? 1 : rsi_p; + m_k_period = (k_p < 1) ? 1 : k_p; + m_d_period = (d_p < 1) ? 1 : d_p; + m_d_ma_type = d_ma; + + if(CheckPointer(m_rsi_calculator) == POINTER_INVALID) + return false; + return m_rsi_calculator.Init(m_rsi_period, 1, MODE_SMA, 2.0); // Other params are not used + } + +//+------------------------------------------------------------------+ +//| CStochRSI_Fast_Calculator: Main Calculation Method | +//+------------------------------------------------------------------+ +void CStochRSI_Fast_Calculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], ENUM_APPLIED_PRICE price_type, + double &k_buffer[], double &d_buffer[]) + { + if(rates_total <= m_rsi_period + m_k_period + m_d_period) + return; + if(CheckPointer(m_rsi_calculator) == POINTER_INVALID) + return; + + double rsi_buffer[], dummy1[], dummy2[], dummy3[]; + ArrayResize(rsi_buffer, rates_total); + m_rsi_calculator.Calculate(rates_total, price_type, open, high, low, close, rsi_buffer, dummy1, dummy2, dummy3); + + int k_start = m_rsi_period + m_k_period - 2; + for(int i = k_start; i < rates_total; i++) + { + double highest_rsi = Highest(rsi_buffer, m_k_period, i); + double lowest_rsi = Lowest(rsi_buffer, m_k_period, i); + double range = highest_rsi - lowest_rsi; + if(range > 0.00001) + k_buffer[i] = (rsi_buffer[i] - lowest_rsi) / range * 100.0; + else + k_buffer[i] = (i > 0) ? k_buffer[i-1] : 50.0; + } + + int d_start = k_start + m_d_period - 1; + for(int i = d_start; i < rates_total; i++) + { + switch(m_d_ma_type) + { + case MODE_EMA: + case MODE_SMMA: + if(i == d_start) + { + double sum=0; + for(int j=0; j0) d_buffer[i]=sum/w_sum;} + break; + default: + {double sum=0; for(int j=0; j array[index]) + res = array[index]; + } + return(res); + } + +//+==================================================================+ +//| | +//| CLASS 2: CStochRSI_Fast_Calculator_HA (Heikin Ashi) | +//| | +//+==================================================================+ +class CStochRSI_Fast_Calculator_HA : public CStochRSI_Fast_Calculator + { +public: + CStochRSI_Fast_Calculator_HA(void); + }; + +//+------------------------------------------------------------------+ +//| CStochRSI_Fast_Calculator_HA: Constructor | +//+------------------------------------------------------------------+ +CStochRSI_Fast_Calculator_HA::CStochRSI_Fast_Calculator_HA(void) + { + if(CheckPointer(m_rsi_calculator) != POINTER_INVALID) + delete m_rsi_calculator; + m_rsi_calculator = new CRSIProCalculator_HA(); + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+