MT5 ve iş başında hız - sayfa 19

 
Roman :

C programcıları.

Bu durumda örnek çok basittir. Tüm kapalı pozisyonların toplam ömrünü hesaplamak, hızlı performans için çok daha zor bir iştir.

 
fxsaber :

Bu durumda örnek çok basittir. Tüm kapalı pozisyonların toplam ömrünü hesaplamak, hızlı performans için çok daha zor bir iştir.

Sana sebebini daha önce açıklamıştım ama sen hesaba katmamışsın.

 
Roman :

Sana sebebini daha önce açıklamıştım ama sen hesaba katmamışsın.

Görünüşe göre, açıklamanız için forumda arama yapmam gerekiyor.

 
fxsaber :

Görünüşe göre, açıklamanız için forumda arama yapmam gerekiyor.

En son benzer bir sorunuz olduğunda, geçirilen parametre önbelleğe alınmadığında ve hemen koda iletildiğinde.
Ve önbelleğe alındıkça hız arttı. Her zaman bir değişken için bellek ayırın, ancak ondan sonra kullanın.
Benzer şekilde, burada bir değişken bildirildi, bellek zaten tahsis edildi ve değişkenle daha fazla çalışma daha hızlı olacaktır, çünkü bellek ayırma maliyeti yok.

Bu aynı zamanda bir mql işlevinden değer almak için de geçerlidir.
Burada forumda tavsiye edilen geliştiriciler bile, önce fonksiyondan değeri bir değişkene alın ve sonra bu değişkeni if() koşulunda kullanın.

 
fxsaber :

Tüm kapalı pozisyonların toplam ömrünü hesaplamak, hızlı performans için çok daha zor bir iştir.

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

Kitaplıklar: MT4Orders

fxsaber , 2020.08.29 04:17

 #include <Generic\HashMap.mqh>

// Возвращает общую длительность всех закрытых позиций.
int SumPositionsLengthMQL5( void )
{
   int Res = 0 ;
  
   if ( HistorySelect ( 0 , INT_MAX ))
  {
    CHashMap< ulong , ulong > DealsIn;   // По PositionID возвращает DealIn.
     const int TotalDeals = HistoryDealsTotal ();
    
     for ( int i = 0 ; i < TotalDeals; i++)
    {
       const ulong TicketDeal = HistoryDealGetTicket (i);
      
       if ( HistoryDealGetInteger (TicketDeal, DEAL_ENTRY ) == DEAL_ENTRY_IN )
        DealsIn.Add( HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID ), TicketDeal);
       else if ( HistoryDealGetInteger (TicketDeal, DEAL_TYPE ) <= DEAL_TYPE_SELL )
      {
         ulong TicketDealIn;
        
         if (DealsIn.TryGetValue( HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID ), TicketDealIn))
          Res += ( int )( HistoryDealGetInteger (TicketDeal, DEAL_TIME ) - HistoryDealGetInteger (TicketDealIn, DEAL_TIME ));        
      }        
    }
  }
      
   return (Res);
}

Belki daha hızlı bir seçenek vardır. Ama bir adım sola doğru hesaplamanız gerekiyor ve mantık önemli ölçüde değişmek zorunda kalabilir. Genel olarak kolay değil.

 
fxsaber :

Belki daha hızlı bir seçenek vardır. Ama bir adım sola doğru hesaplamanız gerekiyor ve mantık önemli ölçüde değişmek zorunda kalabilir. Genel olarak kolay değil.

Bu durumla ilgili değil, kodu yazmakla ilgili.
Koşul, switch ile değiştirilebilse de, mantıksal if koşulundan daha hızlı çalışacaktır.
Bu kodu deneyin, daha hızlı olacak mı, olmayacak mı? Değilse, anahtarı ile başkaysa değiştirmeyi deneyin.
Umarım şimdi, tüm değişken bildirimlerinin döngüden çıkarılması ve 100500 kez yeniden bildirilmemesi gerektiği açıktır.
Ayrıca, her dönüş değeri için bir değişken şeklinde bellek ayırırız.

 #include <Generic\HashMap.mqh>

// Возвращает общую длительность всех закрытых позиций.
int SumPositionsLengthMQL5( void )
{
   int   Res     = 0 ;
   bool HSelect = false ;
  
   HSelect = HistorySelect ( 0 , INT_MAX );
  
   if (HSelect)
   {
      CHashMap< ulong , ulong > DealsIn;   // По PositionID возвращает DealIn.
    
       int    TotalDeals   = 0 ;
       ulong TicketDeal   = 0 ;
       bool   condition1   = false ;
       bool   condition2   = false ; 
       bool   condition3   = false ;       
       long   PositionID   = 0 ;
       ulong TicketDealIn = 0 ;
       int    DealTime     = 0 ;
    
      TotalDeals = HistoryDealsTotal ();
    
       for ( int i= 0 ; i < TotalDeals; i++)
      {
         TicketDeal =   HistoryDealGetTicket (i);      
         condition1 = ( HistoryDealGetInteger (TicketDeal, DEAL_ENTRY ) == DEAL_ENTRY_IN );
         condition2 = ( HistoryDealGetInteger (TicketDeal, DEAL_TYPE ) <= DEAL_TYPE_SELL );
      
         if (condition1)
         {
            PositionID = HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID );
            DealsIn.Add(PositionID, TicketDeal);          
         }
         else if (condition2)
         {       
            PositionID = HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID );
            condition3 = DealsIn.TryGetValue(PositionID, TicketDealIn);
         
             if (condition3) 
            {
               DealTime = ( int )( HistoryDealGetInteger (TicketDeal, DEAL_TIME ) - HistoryDealGetInteger (TicketDealIn, DEAL_TIME ));
               Res += DealTime; 
            }   
         }        
      }
   }
     
   return (Res);
}
 

Kodun başka bir versiyonu, ikinci koşul için bir kez daha Geçmişi çekmemek için.
Ayrıca, hangi koşulun daha sık yerine getirileceğini düşünebilir, onu döngüde ilk sıraya koyabilir ve yinelemeyi çevirmeye devam edebilirsiniz.

 #include <Generic\HashMap.mqh>

// Возвращает общую длительность всех закрытых позиций.
int SumPositionsLengthMQL5( void )
{
   int   Res     = 0 ;
   bool HSelect = false ;
  
   HSelect = HistorySelect ( 0 , INT_MAX );
  
   if (HSelect)
   {
      CHashMap< ulong , ulong > DealsIn;   // По PositionID возвращает DealIn.
    
       int    TotalDeals   = 0 ;
       ulong TicketDeal   = 0 ;
       bool   condition1   = false ;
       bool   condition2   = false ; 
       bool   condition3   = false ;       
       long   PositionID   = 0 ;
       ulong TicketDealIn = 0 ;
       int    DealTime     = 0 ;
    
      TotalDeals = HistoryDealsTotal ();
    
       for ( int i= 0 ; i < TotalDeals; i++)
      {
         TicketDeal =   HistoryDealGetTicket (i);      
         condition1 = ( HistoryDealGetInteger (TicketDeal, DEAL_ENTRY ) == DEAL_ENTRY_IN );         
      
         if (condition1)
         {
            PositionID = HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID );
            DealsIn.Add(PositionID, TicketDeal);
             continue ;                      
         }                  
         
         condition2 = ( HistoryDealGetInteger (TicketDeal, DEAL_TYPE ) <= DEAL_TYPE_SELL );
         
         if (condition2)
         {       
            PositionID = HistoryDealGetInteger (TicketDeal, DEAL_POSITION_ID );
            condition3 = DealsIn.TryGetValue(PositionID, TicketDealIn);
         
             if (condition3) 
            {
               DealTime = ( int )( HistoryDealGetInteger (TicketDeal, DEAL_TIME ) - HistoryDealGetInteger (TicketDealIn, DEAL_TIME ));
               Res += DealTime; 
            }   
         }        
      }
   }
     
   return (Res);
}
 
Roman :

Kodun başka bir versiyonu, ikinci koşul için bir kez daha Geçmişi çekmemek için.

         3132754100
        Time[Bench(SumPositionsLengthMQL5)] = 105779
         3132754100
        Time[Bench(SumPositionsLengthMQL5_Roman)] = 106270

Daha da kendilerini.

 
Renat Fatkhullin :

MT4'te aynı şekilde çalışır, yalnızca önbellek oluşturma gizlidir. Her OnTick/OnStart MT4'te terminal, her uzman için otomatik ve ekonomik olarak pazar ortamının bir anlık görüntüsünü oluşturur.

Bu nedenle, MQL4 kodundan veri hazırlamadaki gerçek gecikmeleri tahmin edemezsiniz. Neyse ki, MT4'te çok az veri var ve her şey basit.

Eğer ilginçse.

kapalı pozisyonla MT5x64'ten dört kat daha hızlıdır.

 
fxsaber :

Daha da kendilerini.

Eh, eğer kendi başınıza, o zaman kendi başınıza.
Ama neden böyle bir sonuç garip, bu Renat için zaten bir soru.
Benim şüphem, DealsIn.TryGetValue hashmap'ini kontrol etmektir.
Profil oluşturucunun altına bakın.

Neden: