From 9bdf5ccfe61d443377b832439cdd5de4d4a2a7c7 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Tue, 3 Feb 2026 18:34:13 +0100 Subject: [PATCH] new files added --- Include/MyIncludes/RVOL_Calculator.mqh | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Include/MyIncludes/RVOL_Calculator.mqh diff --git a/Include/MyIncludes/RVOL_Calculator.mqh b/Include/MyIncludes/RVOL_Calculator.mqh new file mode 100644 index 0000000..8064118 --- /dev/null +++ b/Include/MyIncludes/RVOL_Calculator.mqh @@ -0,0 +1,79 @@ +//+------------------------------------------------------------------+ +//| RVOL_Calculator.mqh | +//| Engine for Relative Volume calculation. | +//| Copyright 2026, xxxxxxxx | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2026, xxxxxxxx" +#property version "1.00" // No changes needed + +//+==================================================================+ +//| CLASS: CRVOLCalculator | +//+==================================================================+ +class CRVOLCalculator + { +protected: + int m_period; + +public: + CRVOLCalculator(void) {} + ~CRVOLCalculator(void) {} + + bool Init(int period); + + void Calculate(int rates_total, + int prev_calculated, + const long &volume[], + double &out_buffer[]); + }; + +//+------------------------------------------------------------------+ +//| Initialization | +//+------------------------------------------------------------------+ +bool CRVOLCalculator::Init(int period) + { + m_period = (period < 1) ? 1 : period; + return true; + } + +//+------------------------------------------------------------------+ +//| Main Calculation Logic | +//+------------------------------------------------------------------+ +void CRVOLCalculator::Calculate(int rates_total, + int prev_calculated, + const long &volume[], + double &out_buffer[]) + { + if(rates_total <= m_period) + return; + + int limit; + if(prev_calculated == 0) + { + limit = m_period; + } + else + { + limit = prev_calculated - 1; + } + + for(int i = limit; i < rates_total; i++) + { + double sum = 0; + for(int j = 1; j <= m_period; j++) + { + sum += (double)volume[i - j]; + } + + double average_volume = sum / m_period; + + if(average_volume > 0) + { + out_buffer[i] = (double)volume[i] / average_volume; + } + else + { + out_buffer[i] = 1.0; + } + } + } +//+------------------------------------------------------------------+