Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 88

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2016.07.19 12:41

Kullanılabileceği tek yer HistoryDealGetInteger(TicketDeal, DEAL_TICKET) ise, ENUM_DEAL_PROPERTY_INTEGER::DEAL_TICKET'e sahip olmanın anlamı nedir?

ORDER_TICKET örneğini kullanarak, fikir net olmalıdır

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL5'te OrderCloseTime()?

fxsaber , 2018.07.18 03:51

 datetime OrderCloseTime ( const ulong Ticket )
{
   return ( ( HistoryOrderGetInteger (Ticket, ORDER_TICKET ) == Ticket) || HistoryOrderSelect (Ticket) ? ( datetime ) HistoryOrderGetInteger (Ticket, ORDER_TIME_DONE ) : 0 );
}

Böylece daha önce HistorySelect fonksiyonları ile oluşturulan mevcut tarihsel tablonun ihtiyacımız olan kaydı içerip içermediğini kontrol edebiliriz. Aynısı DEAL_TICKET için de geçerlidir.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Pozisyon fiyat seviyesini takas yoluyla kaydedin (mümkün mü?)

fxsaber , 2018.07.17 20:45

 // Возвращает цену открытия выбранной позиции без учета клиринга
double GetSummaryPositionPrice()
{
   double TotalVolume = 0 ;
   double TotalDealPrice = 0 ;
  
   if ( HistorySelectByPosition ( PositionGetInteger ( POSITION_IDENTIFIER )))
  {
     const int DealsTotal = HistoryDealsTotal ();
    
     for ( int i = 0 ; i < DealsTotal; i++)
    {
       const ulong DealTicket = HistoryDealGetTicket (i);
      
       if ( HistoryDealGetInteger (DealTicket, DEAL_ORDER ))
      {
         const double DealVolume = ( HistoryDealGetInteger (DealTicket, DEAL_TYPE ) ? - 1 : 1 ) * HistoryDealGetDouble (DealTicket, DEAL_VOLUME );
         const double DealPrice = HistoryDealGetDouble (DealTicket, DEAL_PRICE );
  
         if (TotalVolume * DealVolume >= 0 )
          TotalDealPrice = (TotalDealPrice * TotalVolume + DealPrice * DealVolume) / (TotalVolume + DealVolume);
         else if ( MathAbs (DealVolume) - MathAbs (TotalVolume) > 0.005 )
          TotalDealPrice = DealPrice;
          
        TotalVolume += DealVolume;
      }      
    }
  }
  
   return (TotalDealPrice);
}
 

GetTickCount'tan farklı olarak GetMicrosecondCount işlevinin bilgisayarın yerel saatine bağlı olduğunu herkes bilmiyor olabilir. Onlar. bu süre değişirse (örneğin, İnternet saati ile senkronizasyon sonucunda), GetMicrosecondCount değerleri de karşılık gelen miktar kadar değişecektir. Bu fonksiyon zaman aralıklarını ölçmek için kullanılıyorsa bu dikkate alınmalıdır. Aslında bu amaçlar için kullanılmamalıdır. Ancak GetTickCount bu sorunlardan yoksundur.

Bir gösteri olarak, bu kodu çalıştırabilir ve işlem sırasında bilgisayarın zamanını değiştirebilirsiniz.

   datetime time= TimeLocal ();
   ulong     microsec= GetMicrosecondCount ();
   uint      ticks= GetTickCount ();
  
   while (! IsStopped ())
  {
     Comment ( int ( TimeLocal ()-time), "   " ,( GetMicrosecondCount ()-microsec)/ 1000000 , "   " ,( GetTickCount ()-ticks)/ 1000 );
     Sleep ( 10 );
  }
 
Alexey Navoykov :

GetTickCount'tan farklı olarak GetMicrosecondCount işlevinin bilgisayarın yerel saatine bağlı olduğunu herkes bilmiyor olabilir.

Bilmiyordum, teşekkürler!

 

Taşmayı hariç tutan GetTickCount işlevinin varyantı (işlev çağrıları arasındaki aralığın 50 günü geçmemesi koşuluyla)

 ulong GetTickCountLong()
{
   static ulong sum= 0 ;
   static uint   lasttickcount= 0 ;
   uint tickcount= GetTickCount ();
   if (tickcount<lasttickcount) sum+= 0x100000000 ;
  lasttickcount= tickcount;
   return sum + tickcount;
}
 
Alexey Navoykov :

GetTickCount'tan farklı olarak GetMicrosecondCount işlevinin bilgisayarın yerel saatine bağlı olduğunu herkes bilmiyor olabilir. Onlar. bu süre değişirse (örneğin, İnternet saati ile senkronizasyon sonucunda), GetMicrosecondCount değerleri de karşılık gelen miktar kadar değişecektir. Bu fonksiyon zaman aralıklarını ölçmek için kullanılıyorsa bu dikkate alınmalıdır. Aslında bu amaçlar için kullanılmamalıdır. Ancak GetTickCount bu sorunlardan yoksundur.

Bir gösteri olarak, bu kodu çalıştırabilir ve işlem sırasında bilgisayarın zamanını değiştirebilirsiniz.

O halde bu, geliştiricilerin düzeltmek için iyi yapacakları bir hatadır. Çünkü o zaman işlev açıklamayla eşleşmiyor:

Функция GetMicrosecondCount () возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы.
GetTickCount ile karşılaştırıldığında bu işlevin değeri milisaniye değil (1000 kat daha doğru) mikrosaniye cinsindendir. Ayrıca taşmaz.
Bu nedenle, değiştirilmesinden bahsetmek tamamen doğru değil.
 
Alexey Navoykov :

GetTickCount'tan farklı olarak GetMicrosecondCount işlevinin bilgisayarın yerel saatine bağlı olduğunu herkes bilmiyor olabilir. Onlar. bu süre değişirse (örneğin, İnternet saati ile senkronizasyon sonucunda), GetMicrosecondCount değerleri de karşılık gelen miktar kadar değişecektir. Bu fonksiyon zaman aralıklarını ölçmek için kullanılıyorsa bu dikkate alınmalıdır. Aslında bu amaçlar için kullanılmamalıdır. Ancak GetTickCount bu sorunlardan yoksundur.

Bir gösteri olarak, bu kodu çalıştırabilir ve işlem sırasında bilgisayarın zamanını değiştirebilirsiniz.

Ve GetMicrosecondCount yerine GetTickCount işlevini kullanmanın tamamen uygunsuz olduğunu takip eden bir önemli gözlem daha.
Bunun birçokları için sürpriz olacağını düşünüyorum.

Basit bir betiğin çalışmasını incelemek:

 void OnStart ()
  {
   uint i= GetTickCount ();
   uint i0= GetTickCount ();
   while (i==i0) i0= GetTickCount (); 
   
   int N1= 1 ;
   ulong t1= GetMicrosecondCount ();
   uint i1= GetTickCount ();
   uint i2= GetTickCount ();
   while (i1==i2) { i2= GetTickCount (); N1++;}
   t1= GetMicrosecondCount ()-t1;
   
   ulong t= GetMicrosecondCount ();
   ulong t0= GetMicrosecondCount ();
   while (t==t0) t0= GetMicrosecondCount (); 
   int N2= 1 ;
   ulong t2= GetMicrosecondCount ();
   ulong t3= GetMicrosecondCount ();
   while (t2==t3) { t3= GetMicrosecondCount (); N2++;}
   ulong t4=t3-t2;

   Print (" 1 значение в милисекундах:  " +( string )i1+", следующее значение   "+ ( string )i2 + ", разница - " +( string )t1 + 
   " микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = " + DoubleToString (( double )t1* 1000.0 /N1, 3 )+ " наносекунды");
   
   Print (" 1 значение в микросекундах: " +( string )t2+", следующее значение   "+ ( string )t3 + ", разница - " +( string )t4 + 
   " микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = " + DoubleToString (( double )t4* 1000.0 /N2, 3 )+ " наносекунды");
  }

İşin sonucu:

 2018.07 . 27 00 : 23 : 02.261 TestTimeCount   1 значение в милисекундах:   25225093 , следующее значение   25225109 , разница - 15663 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.323 наносекунды
2018.07 . 27 00 : 23 : 02.261 TestTimeCount   1 значение в микросекундах: 20247 , следующее значение   20248 , разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 33.333 наносекунды
2018.07 . 27 00 : 23 : 03.590 TestTimeCount   1 значение в милисекундах:   25226421 , следующее значение   25226437 , разница - 15586 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.324 наносекунды
2018.07 . 27 00 : 23 : 03.590 TestTimeCount   1 значение в микросекундах: 22835 , следующее значение   22836 , разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 30.303 наносекунды
2018.07 . 27 00 : 23 : 04.920 TestTimeCount   1 значение в милисекундах:   25227750 , следующее значение   25227765 , разница - 15657 микросекунд, время выполнения функции GetTickCount (одного прохода цикла) = 2.309 наносекунды
2018.07 . 27 00 : 23 : 04.920 TestTimeCount    1 значение в микросекундах: 23701 , следующее значение   23702 , разница - 1 микросекунд, время выполнения функции GetMicrosecondCount (одного прохода цикла) = 27.027 наносекунды

aşağıdaki sonuçlar çıkarılabilir:

  • GetTickCount() işlevinin değeri her milisaniyede değil, her 15.625 milisaniyede bir (1/64 saniye, 64=2^6) değişirken, GetMicrosecondCount () işlevinin değeri her mikrosaniyede değişir. Onlar. GetMicrosecondCount, 1000 değil, GetTickCount'tan 15625 kat daha doğrudur.
  • ancak GetTickCount() işlevi GetMicrosecondCount() işlevinden yaklaşık 12-15 kat daha hızlıdır.
 
Nikolay Semko :

O halde bu, geliştiricilerin düzeltmek için iyi yapacakları bir hatadır. Çünkü o zaman işlev açıklamayla eşleşmiyor:

GetTickCount ile karşılaştırıldığında bu işlevin değeri milisaniye değil (1000 kat daha doğru) mikrosaniye cinsindendir. Ayrıca taşmaz.
Bu nedenle, değiştirilmesinden bahsetmek tamamen doğru değil.

Henüz kendim için mikrosaniyelerden herhangi bir pratik fayda görmedim. Programın bazı bölümlerinin çalışma süresini ölçerseniz, sistem performansındaki dalgalanmalar tüm bu doğruluğu ortadan kaldırır ve oradaki hata milisaniyeler, hatta on milisaniyeler kadar gider. Süreleri 1 milisaniyeden az olan çok küçük parçaları ölçüyorsanız, ne anlamı var ki? Ölçüm hatası oranı çok yüksek olacaktır.

 
Alexey Navoykov :

Henüz kendim için mikrosaniyelerden herhangi bir pratik fayda görmedim. Programın bazı bölümlerinin çalışma süresini ölçerseniz, sistem performansındaki dalgalanmalar tüm bu doğruluğu ortadan kaldırır ve oradaki hata milisaniyeler, hatta on milisaniyeler kadar gider. Süreleri 1 milisaniyeden az olan çok küçük parçaları ölçüyorsanız, ne anlamı var ki? Ölçüm hatası oranı çok yüksek olacaktır.

  1. önceki mesajıma bakın
  2. Mikrosaniyelerin pratik kullanımıyla ilgili birçok örneğim var.

 
Nikolay Semko :

Ve GetMicrosecondCount yerine GetTickCount işlevini kullanmanın tamamen uygunsuz olduğunu takip eden bir önemli gözlem daha.
Bunun birçokları için sürpriz olacağını düşünüyorum.

Basit bir betiğin çalışmasını incelemek:

aşağıdaki sonuçlar çıkarılabilir:

  • GetTickCount() işlevinin değeri her milisaniyede değil, her 15,6 milisaniyede bir değişirken, GetMicrosecondCount () işlevinin değeri her mikrosaniyede değişir. Onlar. GetMicrosecondCount, GetTickCount'tan 1000 değil, 15600 kat daha doğrudur.
  • ancak GetTickCount() işlevi GetMicrosecondCount() işlevinden yaklaşık 12-15 kat daha hızlıdır.

Temel Argüman

Neden: