будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?
будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?
Нет. В советнике создаёте или указатель на объект или переменную типа объект и это время разное в разных объектах.
Это переменная
CNewBar newBar(_Symbol, timeFrames);
Это указатель. Символ берётся из массива который получили из списка.
class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО
и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if.
Когда-то Артём писал мне этот класс. Я в подробностях объяснить как работает не могу. Но Артём увидев вспомнит и сможет объяснить. В общем вот сам класс
#include <Arrays\ArrayObj.mqh>
/********************************************************************\
| Класс Новый бар |
\********************************************************************/class CNewBar : public CObject
{
private:
string m_symbol;
ENUM_TIMEFRAMES m_timeframe;
datetime m_time;
datetime Time(void); // Возвращает время нулевого бараstringSymbol(void) { returnthis.m_symbol; }
public:
ENUM_TIMEFRAMES Timeframe(void) { returnthis.m_timeframe; }
datetime GetTime(void) { returnthis.m_time; } // Возвращает время последнего обращенияbool IsNewBar(void); // Основная функция класса
CNewBar(conststring symbol,constENUM_TIMEFRAMES timeframe);
~CNewBar(void){;}
};
//+------------------------------------------------------------------+//| Конструктор |//+------------------------------------------------------------------+
CNewBar::CNewBar(conststring symbol,constENUM_TIMEFRAMES timeframe) : m_time(0)
{
this.m_symbol = symbol;
this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
}
//+------------------------------------------------------------------+//| CNewBar Time Возвращает время нулевого бара |//+------------------------------------------------------------------+datetime CNewBar::Time(void)
{
datetime array[1], ret;
ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
return(array[0]);
}
//+------------------------------------------------------------------+//| CNewBar IsNewBar Основная функция класса |//+------------------------------------------------------------------+bool CNewBar::IsNewBar(void)
{
datetime tm = this.Time();
if(tm == 0)
returnfalse;
if(tm != this.m_time)
{
this.m_time = tm;
returntrue;
}
returnfalse;
}
И вот цикл создания указателей в OnInit()
for(int i = 0; i < ArraySize(Rates); i++)
{
CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
if(nb != NULL)
{
list_new_bar.Add(nb);
Print(nb.IsNewBar(), " ***** ", Rates[i].m_Symbols, " ***** ", nb.Time());
}
}
и в OnTimer()
voidOnTimer()
{
int total = list_new_bar.Total();
for(int i = 0; i < ArraySize(Rates); i++)
{
CNewBar* nb = list_new_bar.At(i);
if(nb == NULL)
continue;
bool new_bar = nb.IsNewBar();
if(new_bar)
{// и дальше………
ArraySize(Rates) это размер массива структур в котором перечислены символы с которыми надо работать.
class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО
и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if.
Всё это правильно ровно до того момента пока не начали писать мультивалютный советник. По настоящему мультивалютный…
Потом под каждый символ надо писать свою функцию, а когда количество символов и какие символы в этом советнике будут работать неизвестно на стадии написания кода, вот тогда и приходит понимание, что лучше иметь такой класс и двумя строками всё решать не задумываясь, чем заниматься ан…ом.
Никаких особых ухищрений не надо.
Переменная
будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?
Переменная
будет проинициализирована значением времени нового бара для для, скажем M15 EurUsd, а на следующем шаге я её переинициализирую значением M30 GbpUsd. В таком случае о каком запоминании может идти речь? Или я что-тот не понимаю?
Нет. В советнике создаёте или указатель на объект или переменную типа объект и это время разное в разных объектах.
Это переменная
CNewBar newBar(_Symbol, timeFrames);Это указатель. Символ берётся из массива который получили из списка.
CNewBar *nb=new CNewBar(arrSymbols[i],timeFrame);Самый простой способ для двух символов
А если советник установлен на EURUSD а мне надо получить новый бар на GBPUSD тогда как? Писать новый класс?
первый входной пераметр же по символу
когда я его использовал, там передавался номер в Перечислениях
add
и никаких множителей объектов для мультисимволов
Нет. В советнике создаёте или указатель на объект или переменную типа объект и это время разное в разных объектах.
Это переменная
Это указатель. Символ берётся из массива который получили из списка.
Самый простой способ для двух символов
Я что-то упустил. Можно полный код класса и советника?
Ради шутки
я вот смотрю, и в этой ветке ни разу не отписались реальные известные тут на форуме, смотрят как на зоопарк)
если того же сабера считать профи, нет он не профи.
class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО
и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if.
всё в том же дерьмовом процедурном стиле и горе лесенок if.
не процедурка тоже плохо выглядит, 3 строки на вызов каждой функции, минимум
можно конечно так писать, но это Ради создания большой библиотеки
Я что-то упустил. Можно полный код класса и советника?
Давно уже выложено и обсуждено…
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2021.08.04 21:44
Когда-то Артём писал мне этот класс. Я в подробностях объяснить как работает не могу. Но Артём увидев вспомнит и сможет объяснить. В общем вот сам класс
И вот цикл создания указателей в OnInit()
и в OnTimer()
ArraySize(Rates) это размер массива структур в котором перечислены символы с которыми надо работать.
вот пример ООП)))))))))))))
в три строки можно было уложить
Артем прости меня
class СNewBar - способ породить класс на ровном месте..ничуть и ничем не лучше функции. Ни по скорости, ни по читаемости, ни по компактности. Зато целый класс и потуга в ОО
и использоваться будет так-же как функция - всё в том же дерьмовом процедурном стиле и горе лесенок if.
Всё это правильно ровно до того момента пока не начали писать мультивалютный советник. По настоящему мультивалютный…
Потом под каждый символ надо писать свою функцию, а когда количество символов и какие символы в этом советнике будут работать неизвестно на стадии написания кода, вот тогда и приходит понимание, что лучше иметь такой класс и двумя строками всё решать не задумываясь, чем заниматься ан…ом.