Das EOP für Schulkinder. - Seite 16

 

Ich bitte die Moderatoren, alle Diskussionen in einen separaten Thread zu stellen. Es gibt wahrscheinlich Dutzende solcher Threads, in denen die Vorteile von OOP diskutiert werden.

 
Alexey Viktorov:

Eine weitere Frage: Was ist der Unterschied zwischen der Deklaration einer Variablen, dem Erhalten/Erstellen eines Zeigers und dem Erstellen einer Objektinstanz? Es geht nicht um den Unterschied, sondern darum, in welchen Fällen es besser ist, es zu verwenden. Es reicht zum Beispiel aus, eine Variable für die Eröffnung einer Position zu deklarieren.

Und in welchen Fällen es besser ist, den Zeiger zu verwenden, und in welchen Fällen wir auf die Objektinstanz nicht verzichten können.

Was sind die Vor- und Nachteile der einen oder anderen Methode?

1. Wenn sich ein Objekt im globalen Bereich befindet, ist es ein statisches Objekt. Sie wird im statischen Speicher abgelegt und existiert so lange, wie das Programm existiert.

Sein Konstruktor wird vor dem Aufruf der ersten Funktion des Programms aufgerufen. Der Destruktor wird nach OnDeinit() aufgerufen.

2. Objekte, die innerhalb der Funktion deklariert werden, sind lokale Objekte. Sie werden auf den Stapel gelegt. Sie werden beim Verlassen der Funktion zerstört.
Sie können ein lokales Objekt innerhalb geschweifter Klammern deklarieren.


Zum Beispiel so:

if( ... )
{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

Oder sogar so:

{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

Sie wird beim Verlassen des Blocks zerstört. Wenn es zerstört wird, wird der Destruktor aufgerufen.

Da die Größe des Stapels in der Regel begrenzt ist, können sehr große Objekte nicht auf dem Stapel abgelegt werden.

3. Objekte, die durch den neuen Operator erstellt werden, befinden sich im dynamischen Speicher (Heap).
Sie bleiben so lange bestehen, bis sie durch den Löschoperator explizit entfernt werden.


Beispiel:

void func()
{
  Myclass* pObject = new MyClass();
}

In diesem Beispiel werden zwei Variablen erstellt. Ein Objekt der Klasse MyClass im Heap.

Und die Variable pObject ist ein Zeiger auf MyClass. Dieser Variablen wird die Adresse des Objekts im dynamischen Speicher zugewiesen.

Beim Verlassen der Funktion wird die Variable pObject zerstört, aber das Objekt bleibt im dynamischen Speicher.

Um ihn löschen zu können, muss seine Adresse irgendwo gespeichert sein.

Wenn sie erstellt und zerstört werden, werden auch der Konstruktor und der Destruktor aufgerufen.

Der Zugriff auf dynamische Variablen dauert in der Regel länger als auf lokale Variablen.


All dies sollten Sie bei der Erstellung eines Objekts berücksichtigen.


 
Koldun Zloy:

1. Befindet sich ein Objekt im globalen Bereich, ist es ein statisches Objekt. Sie wird im statischen Speicher abgelegt und existiert so lange, wie das Programm existiert.

...

Und niemand wird etwas sagen, nicht einmal ZyXpert.
 
Koldun Zloy:

Gehe ich recht in der Annahme, dass mit dieser Option

#include <Trade\Trade.mqh>
CTrade trade;

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;
 trade.Buy(0.1);
}

ohne die Warnung des Compilers zu berücksichtigen, kann die Position mit einer magischen Zahl ungleich 123 beginnen ?

Das heißt, dass in der OnTick-Funktion ein neues Objekt erstellt wird und der Zauberer darin nicht gleich 123 ist.

 
Alexey Viktorov:

Gehe ich recht in der Annahme, dass mit dieser Option

ohne die Warnung des Compilers zu berücksichtigen, kann die Position mit einer anderen magischen Zahl als 123 beginnen ?

Das heißt, dass in der OnTick-Funktion ein neues Objekt erstellt wird und der Zauberer darin nicht 123 entspricht.

SetExpertMagicNumber

 
Alexey Viktorov:

Gehe ich recht in der Annahme, dass mit dieser Option

ohne die Compilerwarnung zu berücksichtigen, kann die Position mit einem magischen not 123 ?

Das heißt, in der Funktion OnTick wird ein neues Objekt erstellt, das nicht die MagicNumber 123 hat.

Ja, das ist richtig. Es handelt sich um zwei verschiedene Objekte. Da das lokale Objekt in OnTick den gleichen Namen wie das globale Objekt hat, kann in der OnTick-Funktion nur auf dieses zugegriffen werden. Das globale Objekt befindet sich außerhalb des Geltungsbereichs. Daher wurde für das lokale Handelsobjekt die MagicNumber noch nicht festgelegt.

 
Alexey Viktorov:

Gehe ich recht in der Annahme, dass mit dieser Option

#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;  // Объект № 2 в локальной области OnTick()
 trade.Buy(0.1);
}

ohne die Compilerwarnung zu berücksichtigen, kann die Position mit einem magischen not 123 ?

Das heißt, dass in der OnTick-Funktion ein neues Objekt erstellt wird und der Zauberer darin nicht 123 ist.

Es ist genau dasselbe wie bei den Variablen.

Und Konzentration:

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}
 
Warum wird dieseSetExpertMagicNumber überhaupt benötigt?
 
Сергей Таболин:
Warum wird dieseSetExpertMagicNumber überhaupt benötigt?

Es setzt eine magische Zahl auf das Objekt der Handelsklasse. Es kann mehr als ein CTrade-Klassenobjekt für das gesamte Programm geben, wie es jetzt in kodobase der Fall ist. Dies ist ein Objekt. Dieses Objekt wird für die Durchführung vonHandelsgeschäften verwendet. Es ist nicht notwendig, ein Objekt für das gesamte Programm zu erstellen und es jedes Mal neu zu erstellen, wenn ein neuer Zauberer, Schlupf und andere Parameter, die während der Initialisierung festgelegt werden, geändert werden müssen. Es ist möglich, ein separates Handelsobjekt für jedes gehandelte Symbol zu erstellen, die notwendigen Parameter dafür entsprechend den Eigenschaften des Symbols zu setzen, zu dem dieses spezifische Objekt der CTrade-Klasse gehört, und einfach zu handeln, indem man einen Zeiger auf das notwendige Objekt der notwendigen Handelsklasse von dem notwendigen Symbol erhält, ohne die dort gesetzten Parameter zu überschreiben.
Um mit einem anderen Magier zu arbeiten, kann ein separates Handelsobjekt mit entsprechenden Einstellungen definiert werden. Es kann mehrere Assistenten in einem EA geben.

Es hängt alles davon ab, was wir verstehen und wie wir es nutzen.

 
Artyom Trishkin:

Sie setzt eine Magie für ein Objekt der Handelsklasse. Es kann nicht nur ein Objekt der Klasse CTrade für das gesamte Programm geben, wie es normalerweise in kodobase der Fall ist. Dies ist ein Objekt. Dieses Objekt wird für die Durchführung von Handelsgeschäften verwendet. Es ist nicht notwendig, ein Objekt für das gesamte Programm zu erstellen und es jedes Mal neu zu erstellen, wenn ein neuer Zauberer, Schlupf und andere Parameter, die während der Initialisierung festgelegt werden, geändert werden müssen. Es ist möglich, ein separates Handelsobjekt für jedes gehandelte Symbol zu erstellen, die notwendigen Parameter dafür entsprechend den Eigenschaften des Symbols zu setzen, zu dem dieses spezifische Objekt der CTrade-Klasse gehört, und einfach zu handeln, indem man einen Zeiger auf das notwendige Objekt der notwendigen Handelsklasse von dem notwendigen Symbol erhält, ohne die dort gesetzten Parameter zu überschreiben.
Um mit einem anderen Magier zu arbeiten, kann ein separates Handelsobjekt mit entsprechenden Einstellungen definiert werden. Schließlich kann es in einem EA mehrere Assistenten geben.

Es hängt alles davon ab, was wir verstehen und wie wir es nutzen.

Ist es in diesem Fall

SetExpertMagicNumber
Устанавливает идентификатор эксперта

falsche Beschreibung?

Meines Erachtens sollten alle Aufträge/Positionen diese Magie haben, wenn sie für EA eingestellt sind. ((