MQL4 belgelerinin tartışılması - sayfa 18

 
Yani... Doğru cevabı gördüğüm gibi:

geçersiz SendMail( string konu, string bazı_metin)
"Posta" sekmesindeki ayarlar penceresinde belirtilen adrese bir e-posta gönderir.
İşlev, test modunda çalışmaz. Bu işlev, özel göstergelerden de çağrılamaz.
Ayarlarda gönderme yasaklanmış olabilir ve e-posta adresi de belirtilmemiş olabilir. Bir hata hakkında bilgi almak için GetLastError() işlevini çağırmanız gerekir.
[...]

Göstergede itiraf ediyorum, kontrol etmedim ... :)

ZY Konunun başlığına itiraz ediyorum ve örneğin şu şekilde yeniden adlandırılmasını öneriyorum: "Yerleşik MQL4 belgelerinin iyileştirilmesi: yanlışlıkların ve eksikliklerin ortadan kaldırılması". Bunun gibi bir şey.
 
OrderSelect () işlevi örneğinde aşağıdaki ifadeyle karşılaştım:
if(OrderSelect(12470, SELECT_BY_TICKET)==true) ...
Daha sonra belgelerin başka yerlerinde de aynı şeyle karşılaştım.

Lütfen açıklayın, bu sadece bir programlama stili mi?
Değilse, boole değişkenleri için karşılaştırma işlemini kullanma ihtiyacına ne sebep oldu?
Daha basit ifade neden kullanılmıyor:
if(OrderSelect(12470, SELECT_BY_TICKET)) ...
 
Yurixx :
Daha basit ifade neden kullanılmıyor:

İlk ifade daha sezgiseldir ve özellikle yeni başlayanlar için herhangi bir karışıklığa neden olmaz, ancak ikinci ifade muhtemelen daha yaygın olarak kullanılır.
 
resmi parametre nedir ve referans yoluyla iletilen parametrelerle ne ilgisi var?
 
Çoğu zaman, değerleri hesaplama işlevleri, girdi olarak bazı parametreler gerektirir. Örneğin, OrderSend() işlevine bakarsanız, bu tür bir dizi parametre ona iletilecektir:
  • sembol
  • Sipariş türü
  • Lot olarak pozisyon hacmi
  • Açılış fiyatı
  • noktalarda kayma
vb. Bir işleve iletilen parametreler iki türdür - çağrılan işlevin çalışması sırasında hiçbir şekilde değişmeyenler ve içinde işlenebilenler.
Örneğin, bu işlevi düşünün:

 //+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   return ;   
  }
SplitString() öğesine üç parametre iletilir: başvuruya göre bir ArrayRes dizisi (önde bir & işareti vardır) ve iki resmi parametre InputStrung (parçalar için ayrıştıracağımız dize) ve ayırıcı dize (ayrıştırma sırasında sınırlayıcıdır) .
Bu işlev çalıştırıldıktan sonra ArraRes dizisi birkaç dize içerecektir. MQL4'teki işlevin kendisi karmaşık türleri (örneğin bir dizi) döndürme yeteneğine sahip değildir, ancak parametreleri referansa göre ileterek bu sınırlamayı atlarız.

Tam komut dosyası şudur:

 //+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright " Copyright © 2007, MetaQuotes Software Corp. "
#property link      " https://www.metaquotes.net/ru/ "
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   return ;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ()
  {
//----
   string strInfo = " aae|aer3|dzse|faw323 " ;
   string strResult [] ;
   
   SplitString ( strResult , strInfo , " | " ) ;
   
   int N = ArraySize ( strResult ) ;
   if ( N > 0 )
      {
      for ( int i = 0 ; i < N ; i ++ ) Print ( " strResult[ " , i , " ]= " , strResult [ i ]) ;
      }
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
Kendiniz çalıştırın ve çalışmanın sonucuna bakın.
 
İşte talihsiz bir belge daha

çift SiparişKapatFiyat( )
Seçilen emrin kapanış fiyatını verir.
Sipariş, OrderSelect() işlevi kullanılarak önceden seçilmelidir.
Misal:
 if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     tarihsaat ctm=OrderOpenTime();
     if(ctm>0) Print("Sipariş 10 için açık zaman", ctm);
     ctm=SiparişKapatZamanı();
     if(ctm>0) Print("Sipariş için kapanış saati 10 ", ctm);
    }
  başka
    Print("OrderSelect başarısız hata kodu",GetLastError());

OrderClosePrice işlevi için açıklama ve OrderClosePrice işlevi için bir örnek.
Muhtemelen bu nedenle, incelenen Uzman Danışmanların %99'u sipariş türünün tamamen gereksiz analizini yapıyor.
 if ( OrderType () == OP_BUY ) OrderClose (OrderTicket(), OrderLots(), Bid, 0 );
Sadece yazabildiğin zaman
 OrderClose ( OrderT icket () , OrderLots () , OrderClosePrice () , 0 )
 
Evet, o anı geçen hafta yakaladım. Bunun gibi bir şey düşünüyorum:

 if ( OrderSelect ( 10 , SELECT_BY_POS , MODE_HISTORY ) == true )
    {
     datetime  ctm = OrderOpenTime () ; if ( ctm > 0 )
     Print ( " Open time for the order 10 " , TimeToStr ( ctm )) ; 
     double price = OrderClosePrice () ;
     if ( price > 0 ) Print ( " Close price for the order 10 " , DoubleToStr ( price , MarketInfo ( OrderSymbol () , MODE_DIGITS ))) ;
    }
  else
    Print ( " OrderSelect failed error code is " , GetLastError ()) ;
 
Alıntı
------
SplitString() öğesine üç parametre iletilir: başvuruya göre bir ArrayRes dizisi (önde bir & işareti vardır) ve iki resmi parametre InputStrung (parçalar için ayrıştıracağımız dize) ve ayırıcı dize (ayrıştırma sırasında sınırlayıcıdır) .
Bu işlev çalıştırıldıktan sonra ArraRes dizisi birkaç dize içerecektir. MQL4'teki işlevin kendisi karmaşık türleri (örneğin bir dizi) döndürme yeteneğine sahip değildir, ancak parametreleri referansa göre ileterek bu sınırlamayı atlarız.
------

Anlıyorum. Onlara neden "resmi" dediğini anlamıyorum. Bu şekilde iletilen bu parametreler tamamen formal olarak mı? C'de böyle bir şey yok.

Parametre türlerinin açıklaması neden "Fonksiyonlar" bölümünde değil de "Değişkenler" bölümünde anlatılıyor?
 
cout :
Anlıyorum. Onlara neden "resmi" dediğini anlamıyorum. Bu şekilde iletilen bu parametreler tamamen formal olarak mı? C'de böyle bir şey yok.


Çünkü fonksiyona iletilen değişkenler oraya biçimsel olarak değişken olarak değil, değerleri olarak iletilir. Değişkenlerle bir tür manipülasyon gerçekleştirebilirsiniz (değerlerini değiştirin), ancak değerlerle bu tür manipülasyonlar boşa gider.
İşte bu örneğin başka bir versiyonu:

 //+------------------------------------------------------------------+
//|                                                        Split.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright " Copyright © 2007, MetaQuotes Software Corp. "
#property link      " https://www.metaquotes.net/ru/ "
 
 
//+------------------------------------------------------------------+
//|  fill array of strings                                           |
//+------------------------------------------------------------------+
void SplitString ( string & ArrayRes [] , string InputString , string splitter )
  {
   string temp , tempArray [ 100 ] ;
   int pos , splitLength = StringLen ( splitter ) , InputStrLength = StringLen ( InputString ) , counter ;
 
   pos = StringFind ( InputString , splitter ) ;
   if ( pos !=- 1 )
      {
      if ( pos == 0 ) InputString = StringSubstr ( InputString , splitLength , InputStrLength - splitLength ) ;
      while ( StringFind ( InputString , splitter ) !=- 1 )
         {
         pos = StringFind ( InputString , splitter ) ;
         InputStrLength = StringLen ( InputString ) ;
         tempArray [ counter ] = StringSubstr ( InputString , 0 , pos ) ;
         InputString = StringSubstr ( InputString , pos + splitLength , InputStrLength - splitLength - pos ) ;
         counter ++;
         }
      if ( StringLen ( InputString ) != 0 )
         {
         tempArray [ counter ] = InputString ;
         counter ++;
         }   
      }
   ArrayResize ( ArrayRes , counter ) ;
   for ( int i = 0 ; i < counter ; i ++ )  
      {
      ArrayRes [ i ] = tempArray [ i ] ;
      Print ( " i= " , i , "   string= " , ArrayRes [ i ]) ;
      }
   InputString = " Входная строка " ;
   splitter = " разделитель " ;
   Print ( " InputString= " , InputString , "    splitter= " , splitter ) ;
   return ;   
  }
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ()
  {
//----
   string strInfo = " aae|aer3|dzse|faw323 " ;
   string strResult [] ;
   string devider = " | " ;
   SplitString ( strResult , strInfo , devider ) ;
   
   int N = ArraySize ( strResult ) ;
   if ( N > 0 )
      {
      for ( int i = 0 ; i < N ; i ++ ) Print ( " strResult[ " , i , " ]= " , strResult [ i ]) ;
      }
   Print ( " strInfo= " , strInfo , "    devider= " , devider ) ;   
//----
   return ( 0 ) ;
  }
//+------------------------------------------------------------------+
 
Pekala, onlara " Parametreleri değere göre geçirme" deyin.
Resmi olarak, hiçbir şeyin değerine bağlı olmadığı anlamına gelir, örneğin gelecekteki kullanım için ayrılmıştır :). Ama sonuçta, bir şey değere göre iletilen parametrelere bağlıdır, aksi takdirde formal olarak adlandırılırlardı :).
Neden: