mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 88

 

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

오류, 버그, 질문

fxsaber , 2016.07.19 12:41

ENUM_DEAL_PROPERTY_INTEGER::DEAL_TICKET 을 사용할 수 있는 유일한 장소가 HistoryDealGetInteger(TicketDeal, DEAL_TICKET)뿐이라면 무슨 의미가 있습니까?

ORDER_TICKET 예를 사용하면 아이디어가 명확해야 합니다.

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

MQL5의 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 );
}

따라서 이전에 HistorySelect 함수를 통해 생성된 현재 기록 테이블에 필요한 레코드가 포함되어 있는지 확인할 수 있습니다. DEAL_TICKET에도 동일하게 적용됩니다.

 

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

청산을 통해 포지션 가격 수준 저장(가능한가요?)

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와 달리 GetMicrosecondCount 함수 가 컴퓨터의 현지 시간 에 연결되어 있다는 사실을 모든 사람이 아는 것은 아닙니다. 저것들. 이 시간이 변경되면(예: 인터넷 시간과의 동기화 결과) GetMicrosecondCount 값도 해당 양만큼 변경됩니다. 이 기능을 시간 간격 측정에 사용하는 경우 이를 고려해야 합니다. 사실 이러한 용도로 사용해서는 안 됩니다. 그러나 GetTickCount에는 이러한 문제가 없습니다.

데모로 이 코드를 실행하고 프로세스에서 컴퓨터 시간을 변경할 수 있습니다.

   datetime time= TimeLocal ();
   ulong     microsec= GetMicrosecondCount ();
   uint      ticks= GetTickCount ();
  
   while (! IsStopped ())
  {
     Comment ( int ( TimeLocal ()-time), "   " ,( GetMicrosecondCount ()-microsec)/ 1000000 , "   " ,( GetTickCount ()-ticks)/ 1000 );
     Sleep ( 10 );
  }
 
알렉세이 나보이코프 :

GetTickCount와 달리 GetMicrosecondCount 함수가 컴퓨터의 현지 시간에 연결되어 있다는 사실을 모든 사람이 아는 것은 아닙니다.

몰랐네요 감사합니다!

 

오버플로를 제외 하는 GetTickCount 함수의 변형(함수 호출 간격이 50일을 초과하지 않는 경우)

 ulong GetTickCountLong()
{
   static ulong sum= 0 ;
   static uint   lasttickcount= 0 ;
   uint tickcount= GetTickCount ();
   if (tickcount<lasttickcount) sum+= 0x100000000 ;
  lasttickcount= tickcount;
   return sum + tickcount;
}
 
알렉세이 나보이코프 :

GetTickCount와 달리 GetMicrosecondCount 함수가 컴퓨터의 현지 시간에 연결되어 있다는 사실을 모든 사람이 아는 것은 아닙니다. 저것들. 이 시간이 변경되면(예: 인터넷 시간과의 동기화 결과) GetMicrosecondCount 값도 해당 양만큼 변경됩니다. 이 기능을 시간 간격 측정에 사용하는 경우 이를 고려해야 합니다. 사실 이러한 용도로 사용해서는 안 됩니다. 그러나 GetTickCount에는 이러한 문제가 없습니다.

데모로 이 코드를 실행하고 프로세스에서 컴퓨터 시간을 변경할 수 있습니다.

그렇다면 이것은 개발자가 수정하는 것이 좋은 버그입니다. 왜냐하면 함수가 설명과 일치하지 않습니다.

Функция GetMicrosecondCount () возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы.
GetTickCount 와 비교한 이 함수의 값은 밀리초가 아닌 마이크로초 단위입니다(1000배 더 정확함). 또한 오버플로가 없습니다.
따라서 교체에 대해 이야기하는 것은 완전히 옳지 않습니다.
 
알렉세이 나보이코프 :

GetTickCount와 달리 GetMicrosecondCount 함수가 컴퓨터의 현지 시간에 연결되어 있다는 사실을 모든 사람이 아는 것은 아닙니다. 저것들. 이 시간이 변경되면(예: 인터넷 시간과의 동기화 결과) GetMicrosecondCount 값도 해당 양만큼 변경됩니다. 이 기능을 시간 간격 측정에 사용하는 경우 이를 고려해야 합니다. 사실 이러한 용도로 사용해서는 안 됩니다. 그러나 GetTickCount에는 이러한 문제가 없습니다.

데모로 이 코드를 실행하고 프로세스에서 컴퓨터 시간을 변경할 수 있습니다.

그리고 GetMicrosecondCount 대신 GetTickCount 함수를 사용하는 것이 완전히 부적절하다는 것을 알 수 있습니다.
나는 이것이 많은 사람들에게 놀라움으로 올 것이라고 생각합니다.

간단한 스크립트의 작업 검사:

 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 )+ " наносекунды");
  }

작업 결과:

 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 наносекунды

다음과 같은 결론을 내릴 수 있습니다.

  • GetTickCount() 함수의 값은 밀리초마다 변경되지 않지만 15.625 밀리초(1/64초, 64=2^6) 마다 변경되는 반면 GetMicrosecondCount () 함수의 값은 마이크로초 마다 변경됩니다. 저것들. GetMicrosecondCount는 1000이 아니라 GetTickCount보다 15625배 더 정확합니다.
  • 그러나 GetTickCount() 함수는 GetMicrosecondCount() 함수보다 약 12-15배 빠릅니다.
 
니콜라이 셈코 :

그렇다면 이것은 개발자가 수정하는 것이 좋은 버그입니다. 왜냐하면 함수가 설명과 일치하지 않습니다.

GetTickCount와 비교한 이 함수의 값은 밀리초가 아닌 마이크로초 단위입니다(1000배 더 정확함). 또한 오버플로가 없습니다.
따라서 호환성에 대해 이야기하는 것은 완전히 옳지 않습니다.

나는 아직 마이크로초의 실질적인 이점을 보지 못했습니다. 프로그램의 일부 섹션의 실행 시간을 측정하면 시스템 성능의 변동이 이 모든 정확도를 평준화하고 오류는 밀리초 또는 수십 밀리초에 이릅니다. 지속 시간이 1밀리초 미만인 매우 작은 세그먼트를 측정하는 경우 요점은 무엇입니까? 측정 오류의 비율은 매우 높을 것입니다.

 
알렉세이 나보이코프 :

마이크로초의 실질적인 이점은 아직 보지 못했습니다. 프로그램의 일부 섹션의 실행 시간을 측정하면 시스템 성능의 변동이 이 모든 정확도를 평준화하고 오류는 밀리초 또는 수십 밀리초에 이릅니다. 지속 시간이 1밀리초 미만인 매우 작은 세그먼트를 측정하는 경우 요점은 무엇입니까? 측정 오류의 비율은 매우 높을 것입니다.

  1. 내 이전 게시물을 참조하십시오
  2. 마이크로초를 실제로 사용한 예가 많이 있습니다.

 
니콜라이 셈코 :

그리고 GetMicrosecondCount 대신 GetTickCount 함수를 사용하는 것이 완전히 부적절하다는 것을 알 수 있습니다.
나는 이것이 많은 사람들에게 놀라움으로 올 것이라고 생각합니다.

간단한 스크립트의 작업 검사:

다음과 같은 결론을 내릴 수 있습니다.

  • GetTickCount() 함수의 값은 밀리초 마다가 아니라 15.6밀리초마다 변경되는 반면 GetMicrosecondCount () 함수의 값은 마이크로초 마다 변경됩니다. 저것들. GetMicrosecondCount는 1000이 아니라 GetTickCount보다 15600배 더 정확합니다.
  • 그러나 GetTickCount() 함수는 GetMicrosecondCount() 함수보다 약 12-15배 빠릅니다.

필수 논거