Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 61

 
Vladislav Andruschenko :

Artık geçmişte 1000'den fazla işlem olduğunda ve örneğingeçmiş işleme işlevini çağırırken bir sorunla karşılaştım, örneğin geçmiş karını hesaplayın. + cari işlemlerin karını ekleyin - grafikteki bilgiler yavaşlamaya başlar ve terminal donar. Onlar. alıntılar gecikmeli olarak gelir.

Kod olmadan, sadece tahmin edilebilir.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

Alexey Navoykov , 2017.07.21 17:04

MQL'de çoklu kalıtımın olmaması elbette iç karartıcı. Ancak, doğaçlama yollarla çıkabilirsiniz: şablonlar ve makrolar - onlarsız)

İşte yığılmış bir seçenek. Tüm kaynak sınıflar, bir üst sınıf tanımlayan şablonlar olarak bildirilmelidir .

 class CBase { };   // базовый класс

// Макросы, задающие список наследования:

#define INHERIT1(T)  T<CBase>

#define INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template < typename TParent>
class A : public TParent { public : void a() { Print ( "A" ); } };

template < typename TParent>
class B : public TParent { public : void b() { Print ( "B" ); } };

template < typename TParent>
class C : public TParent { public : void c() { Print ( "C" ); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template < typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit ()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

Elbette, sınıfların paralel olarak değil (gerçek çoklu kalıtımda olduğu gibi) sıralı olarak (belirlediğimiz sırayla) miras alınması nedeniyle burada nüanslar vardır. Özellikle, bir aşırı yük meydana geldiğinde farklı önceliklere sahip olacaklardır. Ayrıca, aynı şablon sınıfı birkaç kez kalıtım zincirine katılırsa, bunlar birbiriyle hiçbir şekilde ilişkili olmayan tamamen farklı sınıflar olacaktır. Bu yüzden burada dikkatli olmalısınız. Ancak arayüzlerde sorun yok, kısıtlama olmadan devralabilirsiniz.

Ve eğer şablonlar şeklinde beyan olmadan?

Örneğin, iki hazır kendi kendine yeterli kütüphanemiz var:

class CLib1 : genel CClass1 { }; ve
sınıf CLib2 : genel CClass2 { };

Program sınıfında aşağıdaki kalıtımı yapmak gereklidir:

CLib1--> CLib2 --> CProgram, böylece her iki kitaplık da CProgram sınıfında kullanılabilir. Ve buna göre, CLib1 kitaplığı CLib2'de mevcuttu

Bu durumda, her iki kütüphanenin kodunu bir şekilde değiştirmek imkansızdır.

Mümkün mü?

Çoklu kalıtımla, muhtemelen şöyle görünecektir:
sınıf CProgram : genel CLib1,CLib2 { };

 
Artyom Trishkin :

Ve eğer şablonlar şeklinde beyan olmadan?

Örneğin, iki hazır kendi kendine yeterli kütüphanemiz var:

class CLib1 : genel CClass1 { }; ve
sınıf CLib2 : genel CClass2 { };

Program sınıfında aşağıdaki kalıtımı yapmak gereklidir:

CLib1--> CLib2 --> CProgram, böylece her iki kitaplık da CProgram sınıfında kullanılabilir. Ve buna göre, CLib1 kitaplığı CLib2'de mevcuttu

Bu durumda, her iki kütüphanenin kodunu bir şekilde değiştirmek imkansızdır.

Mümkün mü?

Çoklu kalıtımla, muhtemelen şöyle görünecektir:
sınıf CProgram : genel CLib1,CLib2 { };


Bunu yaparsanız hiçbir şey kaybetmezsiniz:

 class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
Koldun Zloy :

Bunu yaparsanız hiçbir şey kaybetmezsiniz:

Evet. Ben de öyle yaptım. Sadece gereksiz nesneler olmadan yapmak istedim.
 

Eşzamansız Kopyalama işlevlerinden (CopyRates, CopyTicks, vb.) veri almanın muhtemelen en iyi yolu EventChartCustom .

Bu özellikle göstergeler için geçerlidir.

 

OnDeinit'teki (EA, gösterge değil) sadece bir hesap - AccountInfoString (ACCOUNT_SERVER) değil, ticaret sunucusunda bir değişiklik olduğunu öğrenmek mümkündür.

 

hafıza

Eylem/program türü TF veya sembolü değiştir hesap değişikliği
Gösterge OnDeinit ve OnInit çalıştırıldığında, global sınıf nesnesi değiştirilir (sabit yeniden yükleme). Ön_hesaplananı sıfırlamaktan başka bir şey olmaz.
danışman OnDeinit ve OnInit çalıştırıldığında, global sınıf nesnesi değişmez . OnDeinit ve OnInit çalıştırıldığında, global sınıf nesnesi değiştirilir (sabit yeniden yükleme).
 
Dosya Sıkıştırma ve Evrensel Yürütme Süresi Ölçümü

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Strateji test cihazından memnuniyetsizliğim. MQL geliştiricilerine

fxsaber , 2017.12.04 09:11

 #define BENCH(A)                                                              \
{                                                                             \
   const ulong StartTime = GetMicrosecondCount ();                              \
  A;                                                                          \
   Print ( "Time[" + #A + "] = " + ( string )( GetMicrosecondCount () - StartTime)); \
} 

void OnStart ()
{
   uchar Data[];
   uchar Key[ 1 ];
   uchar Result[];
  
   FileLoad ( "thousands_rubies_galaxy.bmp" , Data);  
  BENCH( Print ( CryptEncode ( CRYPT_ARCH_ZIP , Data, Key, Result)))
  
   ArrayFree (Data);
  
   FileLoad ( "space_wind.wav" , Data);  
  BENCH( Print ( CryptEncode ( CRYPT_ARCH_ZIP , Data, Key, Result)))
}

Sonuç

 826534
Time [ Print ( CryptEncode ( CRYPT_ARCH_ZIP ,Data,Key,Result))] = 53334
306648
Time [ Print ( CryptEncode ( CRYPT_ARCH_ZIP ,Data,Key,Result))] = 29029
 

Fiyat tablosunda diğer sembollerin fiyat çizelgelerini üst üste koyan bütün bir gösterge sınıfı vardır. Tekdüze bir şekilde - gösterge tamponlarından yapılırlar .

Ancak, MT5'in harika bir OBJ_CHART'ı vardır ve bu görevi, gösterge arabellekleri olmadan çok daha güzel bir şekilde uygulamanıza olanak tanır.

Örneğin, herhangi bir göstergeyi fırlatabilir ve başka bir sembolde nasıl göründüğünü hemen görebilirsiniz.

Köle şeması - ana grafiğin arka planı olarak birkaç çizelge görüntülenir.

 
fxsaber :

Örneğin, herhangi bir göstergeyi atabilir ve başka bir sembolde nasıl göründüğünü hemen görebilirsiniz.

Köle şeması - ana grafiğin arka planı olarak birkaç çizelge görüntülenir.

Nasıl görüneceğine dair bir resim var mı? Ve tamamen net değil, OBJ_CHART henüz kullanılmadı