forked from nique_372/MQLArticles
121 lines
4.3 KiB
MQL5
121 lines
4.3 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| 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
| |
//+------------------------------------------------------------------+
|