From 0c295d9315efa16f2869245d4138c6790d206cf3 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Fri, 19 Dec 2025 11:14:15 +0100 Subject: [PATCH] refactor: Fixed %D smoothing offset --- .../MyIncludes/StochasticFast_Calculator.mqh | 102 +++++------------- 1 file changed, 28 insertions(+), 74 deletions(-) diff --git a/Include/MyIncludes/StochasticFast_Calculator.mqh b/Include/MyIncludes/StochasticFast_Calculator.mqh index 1dc14ae..2397efd 100644 --- a/Include/MyIncludes/StochasticFast_Calculator.mqh +++ b/Include/MyIncludes/StochasticFast_Calculator.mqh @@ -1,37 +1,38 @@ //+------------------------------------------------------------------+ //| StochasticFast_Calculator.mqh| -//| VERSION 1.20: Optimized for incremental calculation. | +//| VERSION 2.10: Fixed %D smoothing offset. | //| Copyright 2025, xxxxxxxx | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, xxxxxxxx" -#include +#include //+==================================================================+ -//| CLASS 1: CStochasticFastCalculator (Base Class) | +//| CLASS: CStochasticFastCalculator | //+==================================================================+ class CStochasticFastCalculator { protected: - int m_k_period, m_d_period; - ENUM_MA_METHOD m_d_ma_type; + int m_k_period; - //--- Persistent Buffers for Incremental Calculation + //--- Composition: Use MA Engine for %D smoothing + CMovingAverageCalculator m_ma_engine; + + //--- Persistent Buffers double m_src_high[], m_src_low[], m_src_close[]; double Highest(int period, int current_pos); double Lowest(int period, int current_pos); - //--- Updated: Accepts start_index virtual bool PrepareSourceData(int rates_total, int start_index, const double &open[], const double &high[], const double &low[], const double &close[]); public: CStochasticFastCalculator(void) {}; virtual ~CStochasticFastCalculator(void) {}; - bool Init(int k_p, int d_p, ENUM_MA_METHOD d_ma); + //--- Init now takes ENUM_MA_TYPE (extended types) + bool Init(int k_p, int d_p, ENUM_MA_TYPE d_ma); - //--- Updated: Accepts prev_calculated void Calculate(int rates_total, int prev_calculated, const double &open[], const double &high[], const double &low[], const double &close[], double &k_buffer[], double &d_buffer[]); }; @@ -39,31 +40,26 @@ public: //+------------------------------------------------------------------+ //| Init | //+------------------------------------------------------------------+ -bool CStochasticFastCalculator::Init(int k_p, int d_p, ENUM_MA_METHOD d_ma) +bool CStochasticFastCalculator::Init(int k_p, int d_p, ENUM_MA_TYPE d_ma) { m_k_period = (k_p < 1) ? 1 : k_p; - m_d_period = (d_p < 1) ? 1 : d_p; - m_d_ma_type = d_ma; - return true; + +// Initialize the MA Engine for %D + return m_ma_engine.Init(d_p, d_ma); } //+------------------------------------------------------------------+ -//| Main Calculation (Optimized) | +//| Main Calculation | //+------------------------------------------------------------------+ void CStochasticFastCalculator::Calculate(int rates_total, int prev_calculated, 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_d_period) +// Ensure we have enough bars for K + D calculation + if(rates_total <= m_k_period + m_ma_engine.GetPeriod()) return; -//--- 1. Determine Start Index - int start_index; - if(prev_calculated == 0) - start_index = 0; - else - start_index = prev_calculated - 1; + int start_index = (prev_calculated == 0) ? 0 : prev_calculated - 1; -//--- 2. Resize Buffers if(ArraySize(m_src_high) != rates_total) { ArrayResize(m_src_high, rates_total); @@ -71,11 +67,10 @@ void CStochasticFastCalculator::Calculate(int rates_total, int prev_calculated, ArrayResize(m_src_close, rates_total); } -//--- 3. Prepare Source Data (Optimized) if(!PrepareSourceData(rates_total, start_index, open, high, low, close)) return; -//--- 4. Calculate %K (Fast %K) +//--- 1. Calculate %K (Fast %K) int loop_start_k = MathMax(m_k_period - 1, start_index); for(int i = loop_start_k; i < rates_total; i++) @@ -90,50 +85,17 @@ void CStochasticFastCalculator::Calculate(int rates_total, int prev_calculated, k_buffer[i] = (i > 0) ? k_buffer[i-1] : 50.0; } -//--- 5. Calculate %D (Signal Line) by smoothing %K - int d_start = m_k_period + m_d_period - 2; - int loop_start_d = MathMax(d_start, start_index); - - for(int i = loop_start_d; 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