diff --git a/Include/MyIncludes/TSI_Engine.mqh b/Include/MyIncludes/TSI_Engine.mqh new file mode 100644 index 0000000..5c2aa14 --- /dev/null +++ b/Include/MyIncludes/TSI_Engine.mqh @@ -0,0 +1,224 @@ +//+------------------------------------------------------------------+ +//| TSI_Engine.mqh | +//| Core calculation engine for all TSI-based indicators. | +//| Copyright 2025, xxxxxxxx | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" + +#include + +//+==================================================================+ +//| | +//| CLASS 1: CTSICalculator (Base Class) | +//| | +//+==================================================================+ +class CTSICalculator + { +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[]); + + int GetPeriodSlow() const { return m_slow_p; } + int GetPeriodFast() const { return m_fast_p; } + int GetPeriodSignal() const { return m_signal_p; } + }; + +// ... (A teljes Init, Calculate, PreparePriceSeries metódusok ide másolva a javított TSI_Calculator.mqh-ból) ... +//+------------------------------------------------------------------+ +//| CTSICalculator: Initialization | +//+------------------------------------------------------------------+ +bool CTSICalculator::Init(int slow_p, int fast_p, int signal_p, ENUM_MA_METHOD signal_ma) + { + 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