Adwizard/Utils/SymbolsMonitor.mqh

110 lines
8.2 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| SymbolsMonitor.mqh |
//| Copyright 2022-2024, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022-2024, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.00"
#include <Trade\SymbolInfo.mqh>
#include "Macros.mqh"
#include "NewBarEvent.mqh"
//+------------------------------------------------------------------+
//| ;0AA ?>;CG5=8O 8=D>@<0F88 > B>@3>2KE 8=AB@C<5=B0E (A8<2>;0E) |
//+------------------------------------------------------------------+
class CSymbolsMonitor {
protected:
// !B0B8G5A:89 C:070B5;L =0 548=AB25==K9 M:75<?;O@ 40==>3> :;0AA0
static CSymbolsMonitor *s_instance;
// 0AA82 8=D>@<0F8>==KE >1J5:B>2 4;O @07=KE A8<2>;>2
CSymbolInfo *m_symbols[];
//--- '0AB=K5 <5B>4K
CSymbolsMonitor() {} // 0:@KBK9 :>=AB@C:B>@
public:
~CSymbolsMonitor(); // 5AB@C:B>@
//--- !B0B8G5A:85 <5B>4K
static
CSymbolsMonitor *Instance(); // !8=3;B>= - A>740=85 8 ?>;CG5=85 548=AB25==>3> M:75<?;O@0
// 1@01>B:0 B8:0 4;O >1J5:B>2 @07=KE A8<2>;>2
void Tick();
// ?5@0B>@ ?>;CG5=8O >1J5:B0 A 8=D>@<0F859 > :>=:@5B=>< A8<2>;5
CSymbolInfo* operator[](const string &symbol);
};
// =8F80;870F8O AB0B8G5A:>3> C:070B5;O =0 548=AB25==K9 M:75<?;O@ 40==>3> :;0AA0
CSymbolsMonitor *CSymbolsMonitor::s_instance = NULL;
//+------------------------------------------------------------------+
//| !8=3;B>= - A>740=85 8 ?>;CG5=85 548=AB25==>3> M:75<?;O@0 |
//+------------------------------------------------------------------+
CSymbolsMonitor* CSymbolsMonitor::Instance() {
if(!s_instance) {
s_instance = new CSymbolsMonitor();
}
return s_instance;
}
//+------------------------------------------------------------------+
//| 5AB@C:B>@ |
//+------------------------------------------------------------------+
CSymbolsMonitor::~CSymbolsMonitor() {
// #40;O5< 2A5 A>740==K5 8=D>@<0F8>==K5 >1J5:BK 4;O A8<2>;>2
FOREACH(m_symbols) if(!!m_symbols[i]) delete m_symbols[i];
}
//+------------------------------------------------------------------+
//| 1@01>B:0 B8:0 4;O <0AA820 28@BC0;L=KE >@45@>2 (?>78F89) |
//+------------------------------------------------------------------+
void CSymbolsMonitor::Tick() {
// 1=>2;O5< :>B8@>2:8 :064CN <8=CBC 8 A?5F8D8:0F8N @07 2 45=L
FOREACH(m_symbols) {
if(IsNewBar(m_symbols[i].Name(), PERIOD_D1)) {
m_symbols[i].Refresh();
}
if(IsNewBar(m_symbols[i].Name(), PERIOD_M1)) {
m_symbols[i].RefreshRates();
}
}
}
//+------------------------------------------------------------------+
//| ?5@0B>@ ?>;CG5=8O >1J5:B0 A 8=D>@<0F859 > :>=:@5B=>< A8<2>;5 |
//+------------------------------------------------------------------+
CSymbolInfo* CSymbolsMonitor::operator[](const string &name) {
// I5< 8=D>@<0F8>==K9 >1J5:B 4;O 40==>3> A8<2>;0 2 <0AA825
int i;
SEARCH(m_symbols, m_symbols[i].Name() == name, i);
// A;8 =0H;8, B> 2>72@0I05< 53>
if(i != -1) {
return m_symbols[i];
} else {
// =0G5 A>740Q< =>2K9 8=D>@<0F8>==K9 >1J5:B
CSymbolInfo *s = new CSymbolInfo();
// K18@05< 4;O =53> =C6=K9 A8<2>;
if(s.Name(name)) {
// A;8 2K1@0;8 CA?5H=>, B> >1=>2;O5< A?5F8D8:0F8N
s.RefreshRates();
// >102;O5< 2 <0AA82 8=D>@<0F8>==KE >1J5:B>2 8 2>72@0I05< 53>
APPEND(m_symbols, s);
// 538AB@8@C5< >1@01>BG8: A>1KB8O =>2>3> 10@0 =0 <8=8<0;L=>< B09<D@59<5
IsNewBar(name, PERIOD_M1);
return s;
} else {
PrintFormat(__FUNCTION__" | ERROR: can't create symbol with name [%s]", name);
}
}
return NULL;
}
//+------------------------------------------------------------------+