MT5와 속도 - 페이지 19

 
Roman :

C 프로그래머.

이 경우 예제는 매우 간단합니다. 모든 마감된 위치의 총 수명을 계산하는 것은 빠른 성능을 위한 훨씬 더 어려운 작업입니다.

 
fxsaber :

이 경우의 예는 매우 간단합니다. 모든 마감된 위치의 총 수명을 계산하는 것은 빠른 성능을 위한 훨씬 더 어려운 작업입니다.

그 이유는 앞에서 이미 설명드렸는데 고려하지 않으셨습니다.

 
Roman :

그 이유는 앞에서 이미 설명드렸는데 고려하지 않으셨습니다.

분명히 설명을 위해 포럼을 검색해야합니다.

 
fxsaber :

분명히 설명을 위해 포럼을 검색해야합니다.

지난번에 전달된 매개변수가 캐시되지 않았지만 코드에 즉시 전달되었을 때 비슷한 질문이 있었습니다.
그리고 그들이 캐시함에 따라 속도가 증가했습니다. 항상 변수에 메모리를 할당한 다음 사용하십시오.
마찬가지로 여기에서 변수가 선언되었고 메모리가 이미 할당되었으며 변수에 대한 추가 작업이 더 빠릅니다. 메모리 할당 비용이 없습니다.

이것은 mql 함수에서 값을 가져올 때도 적용됩니다.
여기 포럼에서 추천하는 개발자라도 먼저 함수의 값을 변수로 가져온 다음 이 변수를 if() 조건에서 사용하십시오.

 
fxsaber :

모든 마감된 위치의 총 수명을 계산하는 것은 빠른 성능을 위한 훨씬 더 어려운 작업입니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

라이브러리: 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);
}

아마도 더 빠른 옵션이 있습니다. 그러나 왼쪽으로 한 단계 더 나아가 계산해야 하는 조건과 논리가 크게 달라져야 할 수도 있습니다. 일반적으로 쉽지 않습니다.

 
fxsaber :

아마도 더 빠른 옵션이 있습니다. 그러나 왼쪽으로 한 단계 더 나아가 계산해야 하는 조건과 논리가 크게 달라져야 할 수도 있습니다. 일반적으로 쉽지 않습니다.

조건에 관한 것이 아니라 코드를 작성하는 것입니다.
조건을 switch 로 바꿀 수 있지만 논리적 if else 조건보다 더 빠르게 작동합니다.
이 코드를 사용해 보세요. 더 빨라질까요? 그렇지 않은 경우 스위치로 if else를 교체하십시오.
이제 모든변수 선언 이 루프에서 제거되어야 하며 100500번 다시 선언되어서는 안 된다는 의미가 명확해지기를 바랍니다.
또한 각 반환 값에 대해 변수 형태로 메모리를 할당합니다.

 #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);
}
 

두 번째 조건에 대한 기록을 다시 한 번 가져오지 않도록 코드의 다른 버전입니다.
또한 어떤 조건이 더 자주 충족될 것인지 생각하고 루프의 첫 번째 조건에 놓고 계속해서 반복을 번역할 수 있습니다.

 #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 :

두 번째 조건에 대한 기록을 다시 한 번 가져오지 않도록 코드의 다른 버전입니다.

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

더 나아가 그들 자신.

 
Renat Fatkhullin :

MT4에서는 동일하게 작동하며 캐시 생성만 숨겨집니다. 각 OnTick/OnStart MT4에서 단말기는 각 전문가에 대한 시장 환경의 스냅샷을 자동으로 경제적으로 생성합니다.

따라서 MQL4 코드에서 데이터를 준비할 때 실제 지연을 추정할 수 없습니다. 다행히 MT4에는 데이터가 거의 없고 모든 것이 간단합니다.

흥미로운 경우.

폐쇄 위치 에서 MT5x64보다 4배 이상 빠릅니다.

 
fxsaber :

더 나아가 그들 자신.

글쎄, 혼자라면, 스스로.
그런데 왜 그런 결과가 나오는지 이상하다. 이것은 이미 레나트의 질문이다.
내 의심은 해시맵 DealsIn.TryGetValue를 확인하는 것입니다.
프로파일러 아래를 보십시오.