Вопросы по ООП в MQL5 - страница 87

 
Vladimir Simakov:
Вопрос. А зачем козе баян? Если в одном методе, одного класса, в сферическом коне, да в физическом вакууме (ну выпимши я)))), то да, имеет смысл. А если в реальном проекте, то, либо класс на глобальном уровне, либо одиночка, который всю эту трихомудину (сорри за лишний бурбон))))) обрабатывает в начале обработчика, и,запрашивай напрямую из него в любом месте)))

это класс-менеджер который раздает задания и получает результаты от небольшого подчиненного стада классов )))

в общем сложно по трезвому обьяснить

но вопрос актуальный - как осуществляется адресация общих полей если читать значения этих полей из разных методов и очень часто

 
Igor Makanu:

это класс-менеджер который раздает задания и получает результаты от небольшого подчиненного стада классов )))

в общем сложно по трезвому обьяснить

но вопрос актуальный - как осуществляется адресация общих полей если читать значения этих полей из разных методов и очень часто

Смотри. В начале обработчика, не важно какого, запускаешь gSomeGlobal.SomeEvent(...), или, если одиночка, Alone::SomeEvent(...), в этом методе делаешь нужную обработку состояния и, потом, просто запрашиваешь нужные данные через геттеры. Пока у тебя не высокочастотный скальпер, шлешь всех поборников скорости лесом, хотя здесь никаких особых оверхедов и нет)))
 
Vladimir Simakov:
Смотри. В начале обработчика, не важно какого, запускаешь gSomeGlobal.SomeEvent(...), или, если одиночка, Alone::SomeEvent(...), в этом методе делаешь нужную обработку состояния и, потом, просто запрашиваешь нужные данные через геттеры. Пока у тебя не высокочастотный скальпер, шлешь всех поборников скорости лесом, хотя здесь никаких особых оверхедов и нет)))

производительности МТ5 хватит и на 10500 ордеров в секунду, хватило бы канала

в общем истину искал, пришлось проверить...если хочешь что то сделать - сделай это сам!  )))

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"

#define TST_COUNT 1e10

#define   SpeedTest(count,msg,EX)   {uint mss=GetTickCount(); ulong lim = count; for(ulong cnt=0;cnt<lim&&!_StopFlag;cnt++){EX;} \
                                    printf("%s: loops = %llu ms=%u",msg,lim,GetTickCount()-mss);}
//+------------------------------------------------------------------+
class A
{
private:
   double            _Ask, _Bid;
   double            f1()  { return(_Ask + 1.0/(1.0+(double)rand())); }
   double            f2()  { return(_Bid + 1.0/(1.0+(double)rand())); }
   double            f3()  { return(_Ask/_Bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ _Ask = tick.ask; _Bid = tick.bid; return(f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private:
   double            f1(const MqlTick &t)  { return(t.ask + 1.0/(1.0+(double)rand())); }
   double            f2(const MqlTick &t)  { return(t.bid + 1.0/(1.0+(double)rand())); }
   double            f3(const MqlTick &t)  { return(t.ask/t.bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ return(f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for(int i=0; i<5; i++)
   {
      SpeedTest(TST_COUNT, "class A : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = a.calc(rnd_tick);
      );
   
      SpeedTest(TST_COUNT, "class B : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = b.calc(rnd_tick);
      );
   }
}
//+------------------------------------------------------------------+

2020.07.25 18:00:07.293 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38062

для оптимизации скорость работы критична, поэтому и вопрос возник

в общем по ссылке нужно передавать во все методы текущую цену



UPD:

//+------------------------------------------------------------------+
class C
{
private:
   double            f1(const double &a, const double &b)  { return(a + 1.0/(1.0+(double)rand())); }
   double            f2(const double &a, const double &b)  { return(b + 1.0/(1.0+(double)rand())); }
   double            f3(const double &a, const double &b)  { return(a/b + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){const double ask = tick.ask; const double bid = tick.bid; return(f1(ask,bid) + f2(ask,bid) + f3(ask,bid)); }
};
//+------------------------------------------------------------------+

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37985

 
Igor Makanu:

производительности МТ5 хватит и на 10500 ордеров в секунду, хватило бы канала

в общем истину искал, пришлось проверить...если хочешь что то сделать - сделай это сам!  )))

2020.07.25 18:00:07.293 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38062

для оптимизации скорость работы критична, поэтому и вопрос возник

в общем по ссылке нужно передавать во все методы текущую цену



UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37985

Для начала делаем одинаковые условия работы)))) А то, ты взял и запихнул абсолютно ненужный оператор присваивания (2 шт.), тем самым создав заведомо не оптимальный код)))

//+------------------------------------------------------------------+
class A
{
private:
   double            _Ask, _Bid;
   double            f1()  { return(_Ask + 1.0/(1.0+(double)rand())); }
   double            f2()  { return(_Bid + 1.0/(1.0+(double)rand())); }
   double            f3()  { return(_Ask/_Bid + 1.0/(1.0+(double)rand())); }
public:
   void              Init() {_Ask = 1.0 + 1.0 / (1.0 + (double)rand());
                             _Bid = 1.0 + 1.0 / (1.0 + (double)rand());}
   double            calc(){return(f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private:
   double            f1(const MqlTick &t)  { return(t.ask + 1.0/(1.0+(double)rand())); }
   double            f2(const MqlTick &t)  { return(t.bid + 1.0/(1.0+(double)rand())); }
   double            f3(const MqlTick &t)  { return(t.ask/t.bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ return(f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for(int i=0; i<5; i++)
   {
      SpeedTest(TST_COUNT, "class A : ",
               a.Init();
               double res = a.calc();
      );
   
      SpeedTest(TST_COUNT, "class B : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = b.calc(rnd_tick);
      );
   }
}

А теперь вопрос: тебе что удобней? Можно конечно таскать за собой вереницы ссылок через параметры методов, а можно красиво делать. Скорости сам сравни)))

 
Vladimir Simakov:

 А то, ты взял и запихнул абсолютно ненужный оператор присваивания (2 шт.), тем самым создав заведомо не оптимальный код)))

это не я!

это IBM Knowledge Center !  https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



там услоовия одинаковые, каждый тик нужно вызывать менеджер классов (или супер-класс, хз в общем) 

и он вызывает остальные классы, которые работают по своим стратегиям 

но по сабжу - вариант С реально выигрывает по скорости, то бишь это кноуледж_центр вроде как правду глаголит

 
Pavel Verveyko:

Интересно это глюк или особенность)

Внутри экземпляра класса находится структура.

Ставлю точку, что бы увидеть содержимое структуры.
Но оно отображается, только если поставить квадратные скобки.
Хотя структура в одном экземпляре.

проблема решается если класс не является элементом массива.




ну и сам код для "тырканья"

попробуйте скомпилировать, пусть даже с ошибками. Иногда это "будит" редактор

 
Igor Makanu:

это не я!

это IBM Knowledge Center !  https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



там услоовия одинаковые, каждый тик нужно вызывать менеджер классов (или супер-класс, хз в общем) 

и он вызывает остальные классы, которые работают по своим стратегиям 

но по сабжу - вариант С реально выигрывает по скорости, то бишь это кноуледж_центр вроде как правду глаголит

Igor Makanu:

производительности МТ5 хватит и на 10500 ордеров в секунду, хватило бы канала

в общем истину искал, пришлось проверить...если хочешь что то сделать - сделай это сам!  )))

2020.07.25 18:00:07.293 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38062

для оптимизации скорость работы критична, поэтому и вопрос возник

в общем по ссылке нужно передавать во все методы текущую цену



UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37985

Igor Makanu:

это не я!

это IBM Knowledge Center !  https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



там услоовия одинаковые, каждый тик нужно вызывать менеджер классов (или супер-класс, хз в общем) 

и он вызывает остальные классы, которые работают по своим стратегиям 

но по сабжу - вариант С реально выигрывает по скорости, то бишь это кноуледж_центр вроде как правду глаголит

Естественно выигрывает))) Но не потому, что оптимально написан, а потому, что компиляторы умные стали)) Оптимизация чистой воды. Нет в релизном коде присваивания значений аск и бид))) Вот только когда у тебя параметов для обработки станет чуть меньше чем до хрена, а бизнес логика проекта разовьется чуть больше, чем открытие ордера по индикатору, тут я и посмотрю как ты загрустишь таская через весь проект вереницы ссылок))) И да, про грех излишней оптимизации я тебе уже говорил. Поверь мне, не нужна она тебе в 98% случаев.

 
Vladimir Simakov:

 И да, про грех излишней оптимизации я тебе уже говорил. Поверь мне, не нужна она тебе в 98% случаев.

верю!... но спиной чую, что пока шишек не насобираю не дойдет ))))

ОК, спс, есть здравое зерно в этих изысканиях

 
Igor Makanu:


UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=37985

Ещё так попробуйте:

class D
{
   double f1(const double &a, const double &b)  { return(a + 1.0/(1.0+(double)rand())); }
   double f2(const double &a, const double &b)  { return(b + 1.0/(1.0+(double)rand())); }
   double f3(const double &a, const double &b)  { return(a/b + 1.0/(1.0+(double)rand())); }
   
public:
   double calc( const MqlTick& tick )
   {
      return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy:

Ещё так попробуйте:

2020.07.26 09:39:21.350 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46157

2020.07.26 09:39:59.402 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38046

2020.07.26 09:40:37.455 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=38063

2020.07.26 09:41:15.485 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38031

2020.07.26 09:42:01.749 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46266

2020.07.26 09:42:39.754 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.26 09:43:17.753 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=38000

2020.07.26 09:43:55.743 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=37984

такие же значения, скорость теста почему то "плавает", но передача параметров в методах по ссылке все равно эффективнее
Причина обращения: