Diskussion zum Artikel "Der Einsatz von MQL5 Standard Library Handelsklassen beim Schreiben eines Expert Advisors" - Seite 3

 

Es gibt auch Zeilen in der Klasse COrderInfo

return(FormatType(str,Type()));
...
FormatType(type,Type())
...
if(m_type==Type() && m_state==State() &&

Aber die Funktion Type() fehlt in der Klasse.

 

In Abschnitt 1.4 des Artikels werden die Eigenschaften der Klasse COrderInfo beschrieben, die, der Beschreibung nach zu urteilen, für die Arbeit mit aktiven schwebenden Aufträgen konzipiert ist. Es wird vorgeschlagen, Folgendes zu tun:"Um mit dieser Klasse die Eigenschaften von ausstehenden Aufträgen zu erhalten, fragen wir zunächst die Gesamtzahl der Aufträge ab und wählen sie nach Auftragsticket aus".

//Selektieren Sie alle historischen Aufträge für den angegebenen Zeitraum
if (HistorySelect(0,TimeCurrent()))   // alle Aufträge
   {    
     // Ermittlung der Gesamtzahl der Aufträge
     int o_total = OrdersTotal();
   }
Aber wenn die Funktion HistorySelect() für die Abfrage der"Historie von Transaktionen und Aufträgen" gedacht ist, d. h. für die Abfrage historischer Aufträge, warum wird diese Funktion dann für die Abfrage der Gesamtzahl aktiver, schwebender Aufträge verwendet?
 
Yedelkin:

In der Klasse COrderInfo ...

Aber die Funktion Type() ist in der Klasse nicht vorhanden.

Die gleiche Situation bei den Klassen CDealInfo und CPositionInfo
 

Kann mir das bitte jemand erklären? Hier ist ein Stück Code aus der CDealInfo-Klasse:

//+------------------------------------------------------------------+
//|DealInfo.mqh |
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| Klasse CDealInfo.|
//| Termin: Klasse für den Zugriff auf historische Geschäftsinformationen.
//| Leitet sich von der Klasse CObject ab.|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- Schnellzugriffsmethoden auf die Eigenschaften der Zeichenkettenposition
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| Ermittelt den Eigenschaftswert "DEAL_SYMBOL".
//| INPUT: nein.|
//| OUTPUT: der Eigenschaftswert "DEAL_SYMBOL" ||
//|| ANMERKUNG: nein.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //dummerweise zurückkehren
  }
...
//+------------------------------------------------------------------+
//| Konvertiert die Deal-Parameter in Text. ||
//| INPUT:str - Empfangszeichenfolge,|
//| deal - Zeiger auf die Klasseninstanz.
//| OUTPUT: formatierte Zeichenkette.|
//|| ANMERKUNG: nein.|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- einrichten
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- bilden die Beschreibung des Geschäfts
   switch(Type())
     {
      ...
     }
//--- Rückgabe des Ergebnisses
   return(str);
  }
...
//+------------------------------------------------------------------+

Hier enthält die Funktion CDealInfo::FormatDeal(string& str) diese Zeile:

   symbol.Name(Symbol());
Die Funktion Symbol() wiederum ist sowohl in der CDealInfo-Klasse selbst als auch in den Standardfunktionen des Client-Terminals definiert. Welche Funktion wird als Argument an die Funktion Symbol.Name() übergeben? Nach welcher Regel?
 
Yedelkin:

Kann mir das bitte jemand erklären? Hier ist ein Stück Code aus der CDealInfo-Klasse:

Hier enthält die Funktion CDealInfo::FormatDeal(string& str) diese Zeile:

Die Funktion Symbol() wiederum ist sowohl in der CDealInfo-Klasse selbst als auch in den Standardfunktionen des Client-Terminals definiert. Welche Funktion wird als Argument an die Funktion Symbol.Name() übergeben? Nach welcher Regel?

Hier gilt die gleiche Regel wie beim Geltungsbereich von Variablen. Wenn eine Variable auf globaler und lokaler Ebene unter demselben Namen deklariert ist, dann verweist der Name innerhalb des lokalen Geltungsbereichs auf die lokale Variable und außerhalb auf die globale Variable.

Wenn eine Standardfunktion innerhalb einer Klasse überladen wird, wird der Überladungskörper in der Klasse selbst aufgerufen und der Körper der Standardfunktion wird auf globaler Ebene aufgerufen. Der Körper der überladenen Funktion kann auf globaler Ebene über den Klassenzeiger aufgerufen werden.

 
Urain:

Hier gilt die gleiche Regel wie für den Geltungsbereich von Variablen. Wenn eine Variable auf globaler und lokaler Ebene unter demselben Namen deklariert wird, dann verweist der Name innerhalb des lokalen Geltungsbereichs auf die lokale Variable und außerhalb auf die globale Variable.

Wenn eine Standardfunktion innerhalb einer Klasse überladen wird, wird der Überladungskörper in der Klasse selbst aufgerufen und der Körper der Standardfunktion wird auf globaler Ebene aufgerufen. Der Körper der überladenen Funktion kann auf globaler Ebene über den Klassenzeiger aufgerufen werden.

Vielen Dank an Sie! Es ist klar und verständlich!
 
Danke Samuel, dass du einen so ausführlichen Artikel geschrieben hast. Ich weiß ihn zu schätzen.
 
Schön und leicht zu verstehen
[Gelöscht]  
Sehr schöner Artikel! Ich verwende ihn als Referenz.
 
In Kapitel 1.4 wird die Bestellhistorie zur Beschreibung von COrderInfo verwendet, ist das richtig?