//+------------------------------------------------------------------+ //| 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 MQLARTICLES_UTILS_FA_BARCONTROLER_MQH #define MQLARTICLES_UTILS_FA_BARCONTROLER_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "FuncionesBases.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ datetime CBarControlerNextTimeM(const datetime& curr_time) { MqlDateTime tm; CTimeUtils::TimeToStructFast(curr_time, tm); tm.mon++; if(tm.mon > 12) { tm.mon = 1; tm.year++; } tm.day = 1; tm.hour = 0; tm.sec = 0; tm.min = 0; return CTimeUtils::CreateDateTimeByStruct(tm); } //+------------------------------------------------------------------+ //| Class to control the opening of a candle | //+------------------------------------------------------------------+ class CBarControler { private: const string symbol; datetime next_time; datetime prev_time; const ENUM_TIMEFRAMES bar_timeframe; const 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 datetime GetNextPrevBarTime() const { return prev_time; } //--- bool IsNewBar(const datetime& curr_time); }; //+------------------------------------------------------------------+ CBarControler::CBarControler(ENUM_TIMEFRAMES _timeframe, string _symbol) : next_time(wrong_datetime), prev_time(wrong_datetime), period_in_seconds(PeriodSecondsFast(_timeframe)), symbol(_symbol), bar_timeframe(_timeframe) { } //+------------------------------------------------------------------+ bool CBarControler::IsNewBar(const datetime& curr_time) { if(curr_time >= next_time) { prev_time = next_time; next_time = bar_timeframe == PERIOD_MN1 ? CBarControlerNextTimeM(curr_time) : (::iTime(symbol, bar_timeframe, 0) + period_in_seconds); return true; } return false; } //+------------------------------------------------------------------+ //| Class to control the opening of a candle ("fast") | //+------------------------------------------------------------------+ class CBarControlerFast { private: const string symbol; datetime next_time; const ENUM_TIMEFRAMES bar_timeframe; const int period_in_seconds; const bool is_mn1; public: CBarControlerFast(ENUM_TIMEFRAMES _timeframe, string _symbol); //--- inline ENUM_TIMEFRAMES Timeframe() const { return bar_timeframe; } __forceinline datetime NextTime() const { return next_time; } //--- bool IsNewBar(const datetime& curr_time); }; //+------------------------------------------------------------------+ CBarControlerFast::CBarControlerFast(ENUM_TIMEFRAMES _timeframe, string _symbol) : next_time(wrong_datetime), period_in_seconds(PeriodSecondsFast(_timeframe)), bar_timeframe(_timeframe), symbol(_symbol), is_mn1((_timeframe == PERIOD_MN1)) { } //+------------------------------------------------------------------+ bool CBarControlerFast::IsNewBar(const datetime& curr_time) { if(curr_time >= next_time) { next_time = is_mn1 ? CBarControlerNextTimeM(curr_time) : (::iTime(symbol, bar_timeframe, 0) + period_in_seconds); return true; } return false; } #endif // MQLARTICLES_UTILS_FA_BARCONTROLER_MQH //+------------------------------------------------------------------+