From 857305ed9bdeefaf56960a2c52c2bd9dc8ad0266 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Thu, 1 Jan 2026 13:42:27 +0100 Subject: [PATCH] refactor(indicators): Restored Trend/Level outputs --- Include/MyIncludes/Holt_Calculator.mqh | 38 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/Include/MyIncludes/Holt_Calculator.mqh b/Include/MyIncludes/Holt_Calculator.mqh index 6f8842a..92630f4 100644 --- a/Include/MyIncludes/Holt_Calculator.mqh +++ b/Include/MyIncludes/Holt_Calculator.mqh @@ -10,9 +10,14 @@ //--- Abstract base class for polymorphism class CHoltMACalculator { +protected: + //--- Dummy Buffers for unused outputs + double m_dummy_trend[]; + double m_dummy_level[]; + public: virtual bool Init(int period, double alpha, double beta, int forecast_p)=0; - virtual void Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], + virtual void Calculate(int rates_total, int prev_calculated, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], double &forecast_out[], double &upper_band_out[], double &lower_band_out[])=0; }; @@ -26,15 +31,21 @@ public: ~CHoltMACalculator_Std(void) { if(CheckPointer(m_engine)!=POINTER_INVALID) delete m_engine; } virtual bool Init(int period, double alpha, double beta, int forecast_p) override { return m_engine.Init(period, alpha, beta, forecast_p); } - virtual void Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], + virtual void Calculate(int rates_total, int prev_calculated, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], double &forecast_out[], double &upper_band_out[], double &lower_band_out[]) override { if(CheckPointer(m_engine)==POINTER_INVALID) return; - double dummy_trend[], dummy_level[]; - ArrayResize(dummy_trend, rates_total); - ArrayResize(dummy_level, rates_total); - m_engine.Calculate(rates_total, price_type, open, high, low, close, forecast_out, dummy_trend, dummy_level, upper_band_out, lower_band_out); + + if(ArraySize(m_dummy_trend) != rates_total) + { + ArrayResize(m_dummy_trend, rates_total); + ArrayResize(m_dummy_level, rates_total); + } + + // Pass dummy buffers for trend and level + m_engine.Calculate(rates_total, prev_calculated, price_type, open, high, low, close, + forecast_out, m_dummy_trend, m_dummy_level, upper_band_out, lower_band_out); } }; @@ -48,15 +59,20 @@ public: ~CHoltMACalculator_HA(void) { if(CheckPointer(m_engine)!=POINTER_INVALID) delete m_engine; } virtual bool Init(int period, double alpha, double beta, int forecast_p) override { return m_engine.Init(period, alpha, beta, forecast_p); } - virtual void Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], + virtual void Calculate(int rates_total, int prev_calculated, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], double &forecast_out[], double &upper_band_out[], double &lower_band_out[]) override { if(CheckPointer(m_engine)==POINTER_INVALID) return; - double dummy_trend[], dummy_level[]; - ArrayResize(dummy_trend, rates_total); - ArrayResize(dummy_level, rates_total); - m_engine.Calculate(rates_total, price_type, open, high, low, close, forecast_out, dummy_trend, dummy_level, upper_band_out, lower_band_out); + + if(ArraySize(m_dummy_trend) != rates_total) + { + ArrayResize(m_dummy_trend, rates_total); + ArrayResize(m_dummy_level, rates_total); + } + + m_engine.Calculate(rates_total, prev_calculated, price_type, open, high, low, close, + forecast_out, m_dummy_trend, m_dummy_level, upper_band_out, lower_band_out); } }; //+------------------------------------------------------------------+