MQL5'te OOP hakkında sorular - sayfa 87

 
Vladimir Simakov :
Soru. Ve bir keçi neden bir düğme akordeonuna ihtiyaç duyar? Bir yöntemde, bir sınıfta, küresel bir atta, ancak fiziksel bir boşlukta (iyi, sarhoşum))), o zaman evet, mantıklı. Ve gerçek bir projede ise, ya küresel düzeyde bir sınıf ya da tüm bu trichomudin'i işleyen bir yalnız (fazladan bourbon için üzgünüm))))) işleyicinin başında ve doğrudan herhangi bir yerden talep edin) ))

bu, görevleri dağıtan ve küçük bir alt sınıf sürüsünden sonuçlar alan bir yönetici sınıfıdır)))

genel olarak, ayık bir şekilde açıklamak zordur

ama soru alakalı - bu alanların değerlerini farklı yöntemlerden ve çok sık okursanız ortak alanların adreslenmesi nasıl olur?

 
Igor Makanu :

bu, görevleri dağıtan ve küçük bir alt sınıf sürüsünden sonuçlar alan bir sınıf yöneticisidir)))

genel olarak, ayık bir şekilde açıklamak zordur

ama soru alakalı - bu alanların değerlerini farklı yöntemlerden ve çok sık okursanız ortak alanların adreslenmesi nasıl olur?

Bak. İşleyicinin başında, hangisi olursa olsun, gSomeGlobal.SomeEvent(...) komutunu çalıştırırsınız veya eğer yalnızsa Alone::SomeEvent(...) bu yöntemde gerekli durum işlemeyi yaparsınız. ve ardından, gerekli verileri alıcılar aracılığıyla istemeniz yeterlidir. Yüksek frekanslı bir kafa derisine sahip olana kadar, burada özel bir baş üstü kafa olmamasına rağmen, tüm hız şampiyonlarını ormana gönderirsiniz)))
 
Vladimir Simakov :
Bak. İşleyicinin başında, hangisi olursa olsun, gSomeGlobal.SomeEvent(...) komutunu çalıştırırsınız veya eğer yalnızsa Alone::SomeEvent(...) bu yöntemde gerekli durum işlemeyi yaparsınız. ve ardından, gerekli verileri alıcılar aracılığıyla istemeniz yeterlidir. Yüksek frekanslı bir kafa derisine sahip olana kadar, burada özel bir baş üstü kafa olmamasına rağmen, tüm hız şampiyonlarını ormana gönderirsiniz)))

Saniyede 10.500 sipariş için MT5 performansı yeterlidir, bir kanal yeterli olacaktır

genel olarak, gerçeği arıyordum, kontrol etmem gerekiyordu ... bir şey yapmak istiyorsan, kendin yap! )))

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

#define TST_COUNT 1 e10

#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) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38062

optimizasyon için işin hızı kritiktir, bu nedenle soru ortaya çıktı

genel olarak, referans olarak, mevcut fiyatı tüm yöntemlere iletmeniz gerekir.



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) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37985

 
Igor Makanu :

Saniyede 10.500 sipariş için MT5 performansı yeterlidir, bir kanal yeterli olacaktır

genel olarak, gerçeği arıyordum, kontrol etmem gerekiyordu ... bir şey yapmak istiyorsan, kendin yap! )))

2020.07.25 18:00:07.293 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38062

optimizasyon için işin hızı kritiktir, bu nedenle soru ortaya çıktı

genel olarak, referans olarak, mevcut fiyatı tüm yöntemlere iletmeniz gerekir.



UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37985

Başlamak için aynı çalışma koşullarını yapıyoruz)))) Aksi takdirde, kesinlikle gereksiz bir atama operatörü (2 adet) aldınız ve doldurdunuz, böylece kasıtlı olarak optimal olmayan bir kod oluşturdunuz)))

 //+------------------------------------------------------------------+
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);
      );
   }
}

Şimdi soru şu, hangisini tercih edersiniz? Tabii ki, metot parametreleri aracılığıyla bağlantı dizilerini sizinle birlikte sürükleyebilirsiniz veya güzelce yapabilirsiniz. Hızı kendiniz karşılaştırın

 
Vladimir Simakov :

Aksi takdirde, kesinlikle gereksiz bir atama operatörü aldınız ve doldurdunuz (2 adet), Böylece kasıtlı olarak optimal olmayan bir kod yaratıyorsunuz)))

o ben değilim!

bu, IBM Bilgi Merkezi! https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



orada koşullar aynı, her işarette sınıf yöneticisini (veya genel olarak süper sınıf, xs) aramanız gerekiyor

ve stratejilerine göre çalışan sınıfların geri kalanını çağırır.

ama konuya göre - hız açısından C seçeneği gerçekten kazanıyor, yani doğruyu söylüyor gibi görünen bir bilgi merkezi

 
Pavel Verveyko :

Bunun bir aksaklık mı yoksa bir özellik mi olduğunu merak ediyorum)

Bir sınıfın örneğinin içinde bir yapı bulunur.

Yapının içeriğini görmek için bir son verdim.
Ancak yalnızca köşeli parantez koyarsanız görüntülenir.
Yapı bir durumda olmasına rağmen.

sınıf dizinin bir elemanı değilse sorun çözülür.




peki, "dürtme" kodu

hatalarla bile derlemeye çalışın. Bazen editörü "uyandırır"

 
Igor Makanu :

o ben değilim!

bu, IBM Bilgi Merkezi! mevcut fiyatı tüm yöntemlere iletmeniz gerekir.



UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37985

Igor Makanu :

o ben değilim!

bu, IBM Bilgi Merkezi! https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



orada koşullar aynı, her işarette sınıf yöneticisini (veya genel olarak süper sınıf, xs) aramanız gerekiyor

ve stratejilerine göre çalışan sınıfların geri kalanını çağırır.

ama konuya göre - hız açısından C seçeneği gerçekten kazanıyor, yani doğruyu söylüyor gibi görünen bir bilgi merkezi

Doğal olarak kazanır))) Ama en uygun şekilde yazıldığı için değil, derleyiciler akıllı hale geldiği için)) Temiz su optimizasyonu. Yayın kodunda talep ve teklif değerleri ataması yoktur))) Bu ancak işleme için cehennemden biraz daha az parametreye sahip olduğunuzda ve projenin iş mantığı, sipariş açmaktan biraz daha fazla geliştiğinde olur. göstergesi, o zaman bir dizi bağlantının tüm projesini sürükleyerek nasıl üzüleceğinizi göreceğim))) Ve evet, size zaten aşırı optimizasyon günahından bahsetmiştim. İnan bana, zamanın %98'inde buna ihtiyacın yok.

 
Vladimir Simakov :

Ve evet, size zaten aşırı optimizasyonun günahından bahsetmiştim. İnan bana, zamanın %98'inde buna ihtiyacın yok.

İnanıyorum! ... ama sırtımda, çarpmaları toplayana kadar ulaşamayacağını hissediyorum))))

Tamam, ATP, bu çalışmalarda sağlam bir tane var.

 
Igor Makanu :


UPD:

2020.07.25 19:03:37.210 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=37985

Ayrıca şunu deneyin:

 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 :

Ayrıca şunu deneyin:

2020.07.26 09:39:21.350 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46157

2020.07.26 09:39:59.402 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38046

2020.07.26 09:40:37.455 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=38063

2020.07.26 09:41:15.485 class_global (EURUSD,H1) D sınıfı : : döngüler = 10000000000 ms=38031

2020.07.26 09:42:01.749 class_global (EURUSD,H1) A sınıfı : : döngüler = 10000000000 ms=46266

2020.07.26 09:42:39.754 class_global (EURUSD,H1) B sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 09:43:17.753 class_global (EURUSD,H1) C sınıfı : : döngüler = 10000000000 ms=38000

2020.07.26 09:43:55.743 class_global (EURUSD,H1) D sınıfı : : döngüler = 10000000000 ms=37984

aynı değerler, bir nedenden dolayı testin hızı "yüzer", ancak yöntemlerde referans olarak parametreleri geçmek hala daha verimli