//+------------------------------------------------------------------+ //| BarControler.mqh | //| Copyright 2025, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372/news | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372/news" #property strict #ifndef UTILS_FA_BAR_CONTROLER_MQH #define UTILS_FA_BAR_CONTROLER_MQH #include "FuncionesBases.mqh" //+------------------------------------------------------------------+ //| Class to control the opening of a candle | //+------------------------------------------------------------------+ class CBarControler { private: string symbol; datetime next_time; datetime prev_time; ENUM_TIMEFRAMES bar_timeframe; int period_in_seconds; public: CBarControler(ENUM_TIMEFRAMES _timeframe, string _symbol); inline int PeriodsInSeconds()const { return period_in_seconds; } inline ENUM_TIMEFRAMES Timeframe() const { return bar_timeframe; } inline bool IsNewBar(datetime curr_time); inline datetime GetNextPrevBarTime() const { return prev_time; } }; //+------------------------------------------------------------------+ CBarControler::CBarControler(ENUM_TIMEFRAMES _timeframe, string _symbol) : next_time(wrong_datetime), prev_time(wrong_datetime), period_in_seconds(PeriodSeconds(_timeframe)) { this.bar_timeframe = _timeframe; this.symbol = _symbol; } //+------------------------------------------------------------------+ inline bool CBarControler::IsNewBar(datetime curr_time) { if(curr_time >= next_time) { prev_time = next_time; this.next_time = iTime(symbol, bar_timeframe, 0) + (this.bar_timeframe == PERIOD_MN1 ? SecondsInMonth(curr_time) : period_in_seconds); return true; } return false; } //+------------------------------------------------------------------+ //| Class to control the opening of a candle ("fast") | //+------------------------------------------------------------------+ class CBarControlerFast { private: string symbol; datetime next_time; ENUM_TIMEFRAMES bar_timeframe; int period_in_seconds; bool is_mn1; public: CBarControlerFast(ENUM_TIMEFRAMES _timeframe, string _symbol); inline ENUM_TIMEFRAMES Timeframe() const { return bar_timeframe; } inline bool IsNewBar(datetime curr_time); }; //+------------------------------------------------------------------+ CBarControlerFast::CBarControlerFast(ENUM_TIMEFRAMES _timeframe, string _symbol) : next_time(wrong_datetime), period_in_seconds(PeriodSeconds(_timeframe)) { bar_timeframe = _timeframe; symbol = _symbol; is_mn1 = _timeframe == PERIOD_MN1; } //+------------------------------------------------------------------+ bool CBarControlerFast::IsNewBar(datetime curr_time) { if(curr_time >= next_time) { next_time = iTime(symbol, bar_timeframe, 0) + (!is_mn1 ? period_in_seconds : SecondsInMonth(curr_time)); return true; } return false; } #endif