Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 61

 
Vladislav Andruschenko:

Ich bin nun auf ein Problem gestoßen, wenn die Historie mehr als 1000 Geschäfte enthält und ich die Funktion zur Verarbeitung der Historie aufrufe, um z.B. den Gewinn der Historie zu berechnen. + Die Informationen auf der Karte werden langsamer und das Terminal bleibt hängen. D.h. die Angebote kommen mit einer Verzögerung.

Ohne den Code kann man nur raten.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

Alexey Navoykov, 2017.07.21 17:04

Es ist enttäuschend, dass es in MQL keine Mehrfachvererbung gibt. Aber wir können es auf jede erdenkliche Weise zum Laufen bringen - mit Vorlagen und Makros - wie können wir sie vermeiden?)

Das habe ich gemacht.Alle Quellklassen sollten als Vorlagen deklariert werden, die die übergeordnete Klasse definieren.

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

Natürlich gibt es einige Feinheiten, die mit der Tatsache zusammenhängen, dass Klassen nacheinander (in der von uns festgelegten Reihenfolge) und nicht gleichzeitig (wie bei echter Mehrfachvererbung) vererbt werden. Insbesondere bei einer Überlastung haben sie unterschiedliche Prioritäten. Wenn ein und dieselbe Vorlagenklasse mehrmals an der Vererbungskette teilnimmt, handelt es sich außerdem um völlig unterschiedliche Klassen, die in keiner Weise miteinander verwandt sind. Wir müssen hier also vorsichtig sein. Aber es gibt keine Probleme mit Schnittstellen, Sie können ohne Einschränkungen vererben.

Wie sieht es aber ohne Deklaration in Form von Vorlagen aus?

Wir haben zum Beispiel zwei fertige, autarke Bibliotheken:

class CLib1 : public CClass1 { };und
class CLib2 : public CClass2 { };

Wir müssen dafür sorgen, dass es eine solche Vererbung in der Programmklasse gibt:

CLib1--> CLib2 --> CProgram, damit beide Bibliotheken in der Klasse CProgram verfügbar sind. Und die CLib1-Bibliothek wird in CLib2 verfügbar sein.

Der Code der beiden Bibliotheken darf in keiner Weise verändert werden.

Ist das möglich?

Bei Mehrfachvererbung würde es wahrscheinlich so aussehen
class CProgram : public CLib1,CLib2 { };

 
Artyom Trishkin:

Wie wäre es ohne eine Mustererklärung?

Wir haben zum Beispiel zwei fertige, autarke Bibliotheken:

class CLib1 : public CClass1 { };und
class CLib2 : public CClass2 { };

Wir müssen eine solche Vererbung in der Programmklasse vornehmen:

CLib1--> CLib2 --> CProgram, damit beide Bibliotheken in der Klasse CProgram verfügbar sind. Und die CLib1-Bibliothek wird in CLib2 verfügbar sein.

Dadurch wird verhindert, dass beide Bibliotheken in irgendeiner Weise verändert werden.

Ist dies möglich?

Bei Mehrfachvererbung würde es wahrscheinlich so aussehen
class CProgram : public CLib1,CLib2 { };


Sie werden nichts verlieren, wenn Sie dies tun:

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

Sie werden dadurch nichts verlieren:

Ja, das habe ich. Ich wollte nur unnötige Gegenstände vermeiden.
 

Die wahrscheinlich beste Möglichkeit, Daten von asynchronen Kopierfunktionen (CopyRates, CopyTicks usw.) zu erhalten, ist über EventChartCustom.

Besonders relevant für Indikatoren.

 

Es ist möglich zu wissen, dass sich der Handelsserver geändert hat, nicht nur das Konto -AccountInfoString (ACCOUNT_SERVER) in OnDeinit (EA, nicht Indikator) wird den neuen Handelsserver zurückgeben.

 

Memo

Aktion/Art des ProgrammsÄnderung von TF oder SymbolKontoänderung
IndikatorOnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständige Rücksetzung).Es passiert nichts, außer dass prev_calculated zurückgesetzt wird.
EAOnDeinit und OnInit ausführen, das globale Klassenobjekt ändert sich nicht.OnDeinit und OnInit ausführen, globale Klassenobjektänderungen (vollständiges Neuladen).
 
Dateikomprimierung und universelle Ausführungszeitmessung

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Meine Unzufriedenheit mit der Strategie Tester. zu MQL-Entwickler

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)))
}

Ergebnis

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

Es gibt eine ganze Reihe von Indikatoren, die Preisdiagramme anderer Symbole auf dem Preisdiagramm überlagern. Sie werden auf die gleiche Weise durchgeführt - über Indikatorpuffer.

Im MT5 gibt es jedoch ein wunderbares OBJ_CHART, mit dem Sie diese Aufgabe viel schöner und ohne Indikatorpuffer realisieren können.

Sie können zum Beispiel einen beliebigen Indikator einsetzen und sofort sehen, wie er auf einem anderen Symbol aussieht.

Slave-Schema - mehrere Diagramme werden als Hintergrund des Hauptdiagramms angezeigt.

 
fxsaber:

Sie können zum Beispiel jeden Indikator werfen und sofort sehen, wie er auf einem anderen Symbol aussieht.

Slave-Schema - mehrere Diagramme werden als Hintergrund des Hauptdiagramms angezeigt.

Gibt es ein Bild davon, wie das aussehen würde? Es ist nicht ganz klar, ich habeOBJ_CHART noch nicht benutzt.
Grund der Beschwerde: