Adwizard/Utils/NewBarEvent.mqh

147 lines
12 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| NewBarEvent.mqh |
//| Copyright 2022, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.00"
#include "Macros.mqh"
//+------------------------------------------------------------------+
//| ;0AA >?@545;5=8O =>2>3> 10@0 4;O :>=:@5B=>3> A8<2>;0 |
//+------------------------------------------------------------------+
class CSymbolNewBarEvent {
private:
string m_symbol; // BA;568205<K9 A8<2>;
long m_timeFrames[]; // 0AA82 >BA;568205<KE B09<D@59<>2 4;O A8<2>;0
long m_timeLast[]; // 0AA82 2@5<5= =0ABC?;5=8O ?>A;54=8E 10@>2 4;O B09<D@59<>2
bool m_res[]; // 0AA82 ?@87=0:>2 =0ABC?;5=8O =>2>3> 10@0 4;O B09<D@59<>2
// 5B>4 @538AB@0F88 =>2>3> >BA;568205<>3> B09<D@59<0 4;O A8<2>;0
int Register(ENUM_TIMEFRAMES p_timeframe) {
APPEND(m_timeFrames, p_timeframe); // >102;O5< 53> 2 <0AA82 B09<D@59<>2
APPEND(m_timeLast, 0); // @5<O ?>A;54=53> 10@0 ?> =5<C ?>:0 =58725AB=>
APPEND(m_res, false); // >2>3> 10@0 ?> =5<C ?>:0 =5B
Update(); // 1=>2;O5< ?@87=0:8 =>2>3> 10@0
return ArraySize(m_timeFrames) - 1;
}
public:
// >=AB@C:B>@
CSymbolNewBarEvent(string p_symbol) :
m_symbol(p_symbol) // #AB0=02;8205< A8<2>;
{}
// 5B>4 >1=>2;5=8O ?@87=0:>2 =>2>3> 10@0
bool Update() {
bool res = (ArraySize(m_res) == 0);
FOREACH(m_timeFrames) {
// >;CG05< 2@5<O B5:CI53> 10@0
long time = iTime(m_symbol, (ENUM_TIMEFRAMES) m_timeFrames[i], 0);
// A;8 =5 A>2?0405B A 70?><=5==K< - B> MB> =>2K9 10@
m_res[i] = (time != m_timeLast[i]);
res |= m_res[i];
// 0?><8=05< =>2>5 2@5<O
m_timeLast[i] = time;
}
return res;
}
// 5B>4 ?>;CG5=8O ?@87=0:0 =>2>3> 10@0
bool IsNewBar(ENUM_TIMEFRAMES p_timeframe) {
int index;
// I5< 8=45:A =C6=>3> B09<D@59<0
FIND(m_timeFrames, p_timeframe, index);
// A;8 =5 =0945=, B> 70@538AB@8@C5< =>2K9 B09<D@59<
if(index == -1) {
PrintFormat(__FUNCTION__" | Register new event handler for %s %s", m_symbol, EnumToString(p_timeframe));
index = Register(p_timeframe);
}
// >72@0I05< ?@87=0: =>2>3> 10@0 4;O =C6=>3> B09<D@59<0
return m_res[index];
}
};
//+------------------------------------------------------------------+
//| !B0B8G5A:89 :;0AA >?@545;5=8O =>2>3> 10@0 4;O 2A5E |
//| A8<2>;>2 8 B09<D@59<>2 |
//+------------------------------------------------------------------+
class CNewBarEvent {
private:
// 0AA82 >1J5:B>2 4;O >?@545;5=8O =>2>3> 10@0 4;O >4=>3> A8<2>;0
static CSymbolNewBarEvent *m_symbolNewBarEvent[];
// 0AA82 =C6=KE A8<2>;>2
static string m_symbols[];
// 5B>4 @538AB@0F88 =>2>3> A8<2>;0 8 B09<D@59<0 4;O >BA;56820=8O =>2>3> 10@0
static int Register(string p_symbol) {
APPEND(m_symbols, p_symbol);
APPEND(m_symbolNewBarEvent, new CSymbolNewBarEvent(p_symbol));
return ArraySize(m_symbols) - 1;
}
public:
// 1J5:BK MB>3> :;0AA0 A>74020BL =5 ?>=04>18BAO - C40;O5< :>=AB@C:B>@
CNewBarEvent() = delete;
// 5B>4 >1=>2;5=8O ?@87=0:>2 =>2>3> 10@0
static bool Update() {
bool res = (ArraySize(m_symbolNewBarEvent) == 0);
FOREACH(m_symbols) res |= m_symbolNewBarEvent[i].Update();
return res;
}
// 5B>4 >A2>1>645=8O ?0<OB8 4;O 02B><0B8G5A:8 A>740==KE >1J5:B>2
static void Destroy() {
FOREACH(m_symbols) delete m_symbolNewBarEvent[i];
ArrayResize(m_symbols, 0);
ArrayResize(m_symbolNewBarEvent, 0);
}
// 5B>4 ?>;CG5=8O ?@87=0:0 =>2>3> 10@0
static bool IsNewBar(string p_symbol, ENUM_TIMEFRAMES p_timeframe) {
int index;
// I5< 8=45:A =C6=>3> A8<2>;0
FIND(m_symbols, p_symbol, index);
// A;8 =5 =0945=, B> 70@538AB@8@C5< =>2K9 A8<2>;
if(index == -1) index = Register(p_symbol);
// >72@0I05< ?@87=0: =>2>3> 10@0 4;O =C6=>3> A8<2>;0 8 B09<D@59<0
return m_symbolNewBarEvent[index].IsNewBar(p_timeframe);
}
};
// =8F80;870F8O AB0B8G5A:8E G;5=>2 :;0AA0 CSymbolNewBarEvent;
CSymbolNewBarEvent* CNewBarEvent::m_symbolNewBarEvent[];
string CNewBarEvent::m_symbols[];
//+------------------------------------------------------------------+
//| $C=:F8O ?@>25@:8 =0ABC?;5=8O =>2>3> 10@0 |
//+------------------------------------------------------------------+
bool IsNewBar(string p_symbol, ENUM_TIMEFRAMES p_timeframe) {
return CNewBarEvent::IsNewBar(p_symbol, p_timeframe);
}
//+------------------------------------------------------------------+
//| $C=:F8O >1=>2;5=8O 8=D>@<0F88 > =>2KE 10@0E |
//+------------------------------------------------------------------+
bool UpdateNewBar() {
return CNewBarEvent::Update();
}
//+------------------------------------------------------------------+
//| $C=:F8O C40;5=8O >1J5:B>2 >BA;56820=8O =>2>3> 10@0 |
//+------------------------------------------------------------------+
void DestroyNewBar() {
CNewBarEvent::Destroy();
}
//+------------------------------------------------------------------+