From 4ef523959796a53877a5ecdd64a435693f373d62 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Tue, 30 Sep 2025 18:08:23 +0200 Subject: [PATCH] new files added --- .../MyIncludes/StochasticSlow_Calculator.mqh | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 Include/MyIncludes/StochasticSlow_Calculator.mqh diff --git a/Include/MyIncludes/StochasticSlow_Calculator.mqh b/Include/MyIncludes/StochasticSlow_Calculator.mqh new file mode 100644 index 0000000..f2286dd --- /dev/null +++ b/Include/MyIncludes/StochasticSlow_Calculator.mqh @@ -0,0 +1,221 @@ +//+------------------------------------------------------------------+ +//| StochasticSlow_Calculator.mqh| +//| Calculation engine for Standard and Heikin Ashi Slow Stochastic. | +//| Copyright 2025, xxxxxxxx | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" + +#include + +//+==================================================================+ +//| | +//| CLASS 1: CStochasticSlowCalculator (Base Class) | +//| | +//+==================================================================+ +class CStochasticSlowCalculator + { +protected: + int m_k_period, m_d_period, m_slowing_period; + ENUM_MA_METHOD m_slowing_ma_type, m_d_ma_type; + double m_src_high[], m_src_low[], m_src_close[]; + + double Highest(int period, int current_pos); + double Lowest(int period, int current_pos); + + virtual bool PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]); + +public: + CStochasticSlowCalculator(void) {}; + virtual ~CStochasticSlowCalculator(void) {}; + + bool Init(int k_p, int slow_p, ENUM_MA_METHOD slow_ma, 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[], + double &k_buffer[], double &d_buffer[]); + }; + +//+------------------------------------------------------------------+ +//| CStochasticSlowCalculator: Initialization | +//+------------------------------------------------------------------+ +bool CStochasticSlowCalculator::Init(int k_p, int slow_p, ENUM_MA_METHOD slow_ma, int d_p, ENUM_MA_METHOD d_ma) + { + m_k_period = (k_p < 1) ? 1 : k_p; + m_slowing_period = (slow_p < 1) ? 1 : slow_p; + m_slowing_ma_type = slow_ma; + m_d_period = (d_p < 1) ? 1 : d_p; + m_d_ma_type = d_ma; + return true; + } + +//+------------------------------------------------------------------+ +//| CStochasticSlowCalculator: Main Calculation Method (Shared Logic)| +//+------------------------------------------------------------------+ +void CStochasticSlowCalculator::Calculate(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[], + double &k_buffer[], double &d_buffer[]) + { + if(rates_total <= m_k_period + m_slowing_period + m_d_period) + return; + if(!PrepareSourceData(rates_total, open, high, low, close)) + return; + + double raw_k[]; + ArrayResize(raw_k, rates_total); + +//--- STEP 1: Calculate Raw %K (Fast %K) + for(int i = m_k_period - 1; i < rates_total; i++) + { + double highest_h = Highest(m_k_period, i); + double lowest_l = Lowest(m_k_period, i); + double range = highest_h - lowest_l; + if(range > 0) + raw_k[i] = (m_src_close[i] - lowest_l) / range * 100.0; + else + raw_k[i] = (i > 0) ? raw_k[i-1] : 50.0; + } + +//--- STEP 2: Calculate Slow %K (Main Line) by smoothing Raw %K + int k_slow_start = m_k_period + m_slowing_period - 2; + for(int i = k_slow_start; i < rates_total; i++) + { + switch(m_slowing_ma_type) + { + case MODE_EMA: + case MODE_SMMA: + if(i == k_slow_start) + { + double sum=0; + for(int j=0; j0) k_buffer[i]=sum/w_sum;} + break; + default: + {double sum=0; for(int j=0; j0) d_buffer[i]=sum/w_sum;} + break; + default: + {double sum=0; for(int j=0; j m_src_low[index]) + res = m_src_low[index]; + } + return(res); + } + +//+==================================================================+ +//| | +//| CLASS 2: CStochasticSlowCalculator_HA (Heikin Ashi) | +//| | +//+==================================================================+ +class CStochasticSlowCalculator_HA : public CStochasticSlowCalculator + { +private: + CHeikinAshi_Calculator m_ha_calculator; +protected: + virtual bool PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]) override; + }; + +//+------------------------------------------------------------------+ +//| CStochasticSlowCalculator_HA: Prepares the HA source data. | +//+------------------------------------------------------------------+ +bool CStochasticSlowCalculator_HA::PrepareSourceData(int rates_total, const double &open[], const double &high[], const double &low[], const double &close[]) + { + double ha_open[]; + ArrayResize(ha_open, rates_total); + ArrayResize(m_src_high, rates_total); + ArrayResize(m_src_low, rates_total); + ArrayResize(m_src_close, rates_total); + m_ha_calculator.Calculate(rates_total, open, high, low, close, ha_open, m_src_high, m_src_low, m_src_close); + return true; + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+