"Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı" makalesi için tartışma - sayfa 3

 

COrderInfo sınıfında da satırlar vardır

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

Ancak Type() işlevi sınıfta bulunmamaktadır.

 

Makalenin 1.4 Bölümü, açıklamaya bakılırsa aktif bekleyen siparişlerle çalışmak üzere tasarlanmış olan COrderInfo sınıfının özelliklerini sunmaktadır. Aşağıdakilerin yapılması önerilmektedir:"Bekleyen emirlerin özelliklerini almak için bu sınıfı kullanmak üzere, önce toplam emir sayısını talep ediyoruz ve bunları emir biletine göre seçiyoruz"

//Belirtilen zaman dilimi için tüm geçmiş emirleri seçin
if (HistorySelect(0,TimeCurrent()))   // tüm siparişler
   {    
     // toplam sipariş sayısını al
     int o_total = OrdersTotal();
   }
Ancak HistorySelect() işlevi"işlem ve emir geçmişini" sorgulamak, yani geçmiş emirleri sorgulamak için tasarlanmışsa, neden bekleyen aktif emirlerin toplam sayısını sorgularken bu işlevi kullanalım?
 
Yedelkin:

COrderInfo sınıfında ...

Ancak Type() işlevi sınıfta yoktur.

Aynı durum CDealInfo ve CPositionInfo sınıfları için de geçerli
 

Lütfen birisi açıklayabilir mi? İşte CDealInfo sınıfından bir kod parçası:

//+------------------------------------------------------------------+
//|DealInfo.mqh |
//+------------------------------------------------------------------+
#include <Object.mqh>
#include "SymbolInfo.mqh"
//+------------------------------------------------------------------+
//| Sınıf CDealInfo.|
//| Randevu: Geçmiş anlaşma bilgilerine erişim için sınıf.
//| CObject sınıfından türetilmiştir.|
//+------------------------------------------------------------------+
class CDealInfo : public CObject
  {
   ...
public:
   ...
   //--- dize konum özelliklerine hızlı erişim yöntemleri
   string            Symbol()           const;
   ...
  };
...
//+------------------------------------------------------------------+
//| "DEAL_SYMBOL." özellik değerini alın ||
//| GİRİŞ: hayır.|
//| ÇIKTI: "DEAL_SYMBOL" özellik değeri. ||
//|| HATIRLATMA: hayır.|
//+------------------------------------------------------------------+
string CDealInfo::Symbol() const
  {
   return(HistoryDealGetString(m_ticket,DEAL_SYMBOL));                           //aptalca geri dön
  }
...
//+------------------------------------------------------------------+
//| Anlaşma parametrelerini metne dönüştürür. ||
//| GİRİŞ:str - alıcı dize,|
//| deal - sınıf örneğindeki işaretçi. ||
//| ÇIKTI: biçimlendirilmiş dize.|
//|| HATIRLATMA: hayır.|
//+------------------------------------------------------------------+
string CDealInfo::FormatDeal(string& str) const
  {
   string type,volume,price,date;
   CSymbolInfo symbol;                                                    
//--- kurulum
   symbol.Name(Symbol());
   int digits=symbol.Digits();
//--- anlaşmanın açıklamasını oluşturun
   switch(Type())
     {
      ...
     }
//--- sonucu döndür
   return(str);
  }
...
//+------------------------------------------------------------------+

Burada CDealInfo::FormatDeal(string& str) fonksiyonu bu satırı içerir:

   symbol.Name(Symbol());
Buna karşılık, Symbol() işlevi hem CDealInfo sınıfının kendisinde hem de istemci terminalinin standart işlevleri arasında tanımlanmıştır. Hangi fonksiyon symbol.Name() fonksiyonuna argüman olarak aktarılır? Hangi kurala göre?
 
Yedelkin:

Lütfen birisi açıklayabilir mi? İşte CDealInfo sınıfından bir kod parçası:

Burada CDealInfo::FormatDeal(string& str) fonksiyonu bu satırı içerir:

Buna karşılık, Symbol() işlevi hem CDealInfo sınıfının kendisinde hem de istemci terminalinin standart işlevleri arasında tanımlanmıştır. Hangi fonksiyon symbol.Name() fonksiyonuna argüman olarak aktarılır? Hangi kurala göre?

Değişkenlerin kapsamı ile aynı kural burada da geçerlidir. Eğer bir değişken global ve yerel seviyelerde tek bir isim altında bildirilmişse, yerel kapsamın içinde isim yerel değişkene, dışında ise global değişkene işaret edecektir.

Bir sınıfın içinde standart bir fonksiyon aşırı yüklenirse, aşırı yükleme gövdesinin sınıfın içinde çağrılacağı ve standart fonksiyonun gövdesinin global seviyede çağrılacağı ortaya çıkar. Aşırı yüklenmiş fonksiyonun gövdesi, sınıf işaretçisi aracılığıyla global düzeyde çağrılabilir.

 
Urain:

Değişkenlerin kapsamı ile aynı kural burada da geçerlidir. Bir değişken global ve yerel düzeylerde aynı adla bildirilirse, yerel kapsamın içinde ad yerel değişkene, dışında ise global değişkene işaret edecektir.

Bir sınıfın içinde standart bir fonksiyon aşırı yüklenirse, aşırı yükleme gövdesinin sınıfın kendisinde çağrılacağı ve standart fonksiyonun gövdesinin global seviyede çağrılacağı ortaya çıkmaktadır. Aşırı yüklenmiş işlevin gövdesi, sınıf işaretçisi aracılığıyla küresel düzeyde çağrılabilir.

Çok teşekkür ederim! Açık ve anlaşılır!
 
Böyle derinlemesine bir makale yazdığınız için teşekkür ederim Samuel. Takdire şayan.
 
Güzel ve anlaşılması kolay
[Silindi]  
Çok güzel bir makale! Bunu referans olarak kullanıyorum.
 
Bölüm 1.4 COrderInfo'yu tanımlamak için sipariş geçmişini kullanıyor, bu doğru mu?