diff --git a/Include/MyIncludes/TSI_Calculator.mqh b/Include/MyIncludes/TSI_Calculator.mqh index 33fb9d2..7a7247b 100644 --- a/Include/MyIncludes/TSI_Calculator.mqh +++ b/Include/MyIncludes/TSI_Calculator.mqh @@ -1,219 +1,65 @@ //+------------------------------------------------------------------+ //| TSI_Calculator.mqh | -//| Calculation engine for Standard and Heikin Ashi TSI. | +//| Wrapper for the TSI_Engine to produce TSI output. | //| Copyright 2025, xxxxxxxx | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, xxxxxxxx" -#include +#include -//+==================================================================+ -//| | -//| CLASS 1: CTSICalculator (Base Class) | -//| | -//+==================================================================+ -class CTSICalculator +//--- Abstract base class for polymorphism +class CTSICalculatorBase { -protected: - int m_slow_p, m_fast_p, m_signal_p; - ENUM_MA_METHOD m_signal_ma_type; - double m_price[]; - - virtual bool PreparePriceSeries(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[]); - public: - CTSICalculator(void) {}; - virtual ~CTSICalculator(void) {}; - - bool Init(int slow_p, int fast_p, int signal_p, ENUM_MA_METHOD signal_ma); - void Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], - double &tsi_buffer[], double &signal_buffer[]); + virtual bool Init(int slow_p, int fast_p, int signal_p, ENUM_MA_METHOD signal_ma)=0; + virtual void Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], + double &tsi_buffer[], double &signal_buffer[])=0; + virtual ~CTSICalculatorBase() {}; // Virtual destructor }; -//+------------------------------------------------------------------+ -//| CTSICalculator: Initialization | -//+------------------------------------------------------------------+ -bool CTSICalculator::Init(int slow_p, int fast_p, int signal_p, ENUM_MA_METHOD signal_ma) +//--- Standard version +class CTSICalculator_Std : public CTSICalculatorBase { - m_slow_p = (slow_p < 1) ? 1 : slow_p; - m_fast_p = (fast_p < 1) ? 1 : fast_p; - m_signal_p = (signal_p < 1) ? 1 : signal_p; - m_signal_ma_type = signal_ma; - return true; - } - -//+------------------------------------------------------------------+ -//| CTSICalculator: Main Calculation Method (Shared Logic) | -//+------------------------------------------------------------------+ -void CTSICalculator::Calculate(int rates_total, ENUM_APPLIED_PRICE price_type, const double &open[], const double &high[], const double &low[], const double &close[], - double &tsi_buffer[], double &signal_buffer[]) - { - if(rates_total <= m_slow_p + m_fast_p + m_signal_p) - return; - if(!PreparePriceSeries(rates_total, price_type, open, high, low, close)) - return; - - double momentum[], abs_momentum[]; - ArrayResize(momentum, rates_total); - ArrayResize(abs_momentum, rates_total); - for(int i=1; i 0) - tsi_buffer[i] = 100 * (ema2_mtm[i] / ema2_abs[i]); - } - - int signal_start = tsi_start + m_signal_p - 1; - for(int i = signal_start; i < rates_total; i++) - { - switch(m_signal_ma_type) - { - case MODE_EMA: - case MODE_SMMA: - if(i == signal_start) - { - double sum=0; - for(int j=0; j0) signal_buffer[i]=sum/w_sum;} - break; - default: - {double sum=0; for(int j=0; j