MQLArticles/Utils/FA/BarControler.mqh

121 lines
4.3 KiB
MQL5
Raw Permalink Normal View History

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