Discussione sull’articolo "L'uso delle Librerie MQL5 Standard Trade Class nella scrittura di un Expert Advisor" - pagina 3

 

Ci sono anche righe nella classe COrderInfo

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

Ma la funzione Type() è assente nella classe.

 

La sezione 1.4 dell'articolo fornisce le caratteristiche della classe COrderInfo che, a giudicare dalla descrizione, è stata progettata per lavorare con gli ordini in sospeso attivi. Si suggerisce di fare come segue:"Per utilizzare questa classe per ottenere le proprietà degli ordini in sospeso, si richiede innanzitutto il numero totale di ordini e li si seleziona per biglietto d'ordine".

//Selezionare tutti gli ordini storici per il periodo di tempo specificato
if (HistorySelect(0,TimeCurrent()))   // tutti gli ordini
   {    
     // ottenere il numero totale di ordini
     int o_total = OrdersTotal();
   }
Ma se la funzione HistorySelect() è stata progettata per interrogare la"storia delle transazioni e degli ordini", cioè per interrogare gli ordini storici, perché utilizzare questa funzione per interrogare il numero totale di ordini pendenti attivi?
 
Yedelkin:

Nella classe COrderInfo ...

Ma la funzione Type() è assente nella classe.

La stessa situazione con le classi CDealInfo e CPositionInfo
 

Qualcuno può spiegare? Ecco un pezzo di codice della classe CDealInfo:

//+------------------------------------------------------------------+
//|DealInfo.mqh |
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| Classe CDealInfo.|
//| Appuntamento: classe per l'accesso alle informazioni sullo storico degli accordi.
//| Deriva dalla classe CObject.|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- metodi di accesso rapido alle proprietà di posizione delle stringhe
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| Ottenere il valore della proprietà "DEAL_SYMBOL".
//| INPUT: no.|
//| OUTPUT: il valore della proprietà "DEAL_SYMBOL". ||
//|| RIMPROVERO: no.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //stupidamente ritorno
  }
...
//+------------------------------------------------------------------+
//| Converte i parametri dell'accordo in testo. ||
//| INPUT:str - stringa ricevente,|
//| deal - puntatore all'istanza della classe. ||
//| OUTPUT: stringa formattata.|
//|| RIMPROVERO: no.|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- impostare
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- formano la descrizione dell'accordo
   switch(Type())
     {
      ...
     }
//--- restituire il risultato
   return(str);
  }
...
//+------------------------------------------------------------------+

La funzione CDealInfo::FormatDeal(string& str) contiene questa riga:

   symbol.Name(Symbol());
A sua volta, la funzione Symbol() è definita sia nella classe CDealInfo stessa che tra le funzioni standard del terminale client. Quale funzione viene passata come argomento alla funzione symbol.Name()? In base a quale regola?
 
Yedelkin:

Qualcuno può spiegare? Ecco un pezzo di codice della classe CDealInfo:

La funzione CDealInfo::FormatDeal(string& str) contiene questa riga:

A sua volta, la funzione Symbol() è definita sia nella classe CDealInfo stessa che tra le funzioni standard del terminale client. Quale funzione viene passata come argomento alla funzione symbol.Name()? Secondo quale regola?

In questo caso vale la stessa regola dell'ambito delle variabili. Se una variabile è dichiarata con un unico nome a livello globale e locale, all'interno dell'ambito locale il nome punterà alla variabile locale e all'esterno a quella globale.

Si scopre che se una funzione standard viene sovraccaricata all'interno di una classe, il corpo dell'overload verrà chiamato nella classe stessa e il corpo della funzione standard verrà chiamato a livello globale. Il corpo della funzione sovraccaricata può essere richiamato a livello globale attraverso il puntatore alla classe.

 
Urain:

In questo caso vale la stessa regola dell'ambito delle variabili. Se una variabile è dichiarata con lo stesso nome a livello globale e locale, all'interno dell'ambito locale il nome punterà alla variabile locale e all'esterno a quella globale.

Si scopre che se una funzione standard viene sovraccaricata all'interno di una classe, il corpo dell'overload verrà chiamato nella classe stessa e il corpo della funzione standard verrà chiamato a livello globale. Il corpo della funzione sovraccaricata può essere chiamato a livello globale attraverso il puntatore di classe.

Grazie mille! È chiaro e comprensibile!
 
Grazie Samuel per aver scritto un articolo così approfondito. È molto apprezzato.
 
Bello e facile da capire
[Eliminato]  
Articolo molto bello! Lo uso come riferimento.
 
Il capitolo 1.4 utilizza la cronologia degli ordini per descrivere COrderInfo, è corretto?