MT5와 속도 - 페이지 52

 

매크로로 변경

 #define µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount () + µsRange; \ 
           while ( GetMicrosecondCount () < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   while (! _StopFlag )
   {
      µsSLEEP( 5000000 );
       Print ( "Прошло 5000000 микросекунд" );
   }
}
 
Roman :

물론 꼬임은 하나의 코어만 사용할 수 없습니다.

나는 이 없는 동안을 의미했다.

마이크로 초가 필요하기 때문에 슬립이 여기서 작동하지 않을 것이 분명합니다. 그러나 그것 없이는 윙윙 거리게 될 것입니다 ...

 
Andrey Khatimlianskii :

나는 잠이 없는 동안을 의미했다.

마이크로 초가 필요하기 때문에 슬립이 여기서 작동하지 않을 것이 분명합니다. 그러나 그것 없이는 윙윙 거리게 될 것입니다 ...

물론 비틀림과 미끄러짐 없이.
GetMicrosecondCount 카운터가 실행 중입니다.

 //+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong µs = 0 ;
   
   while (! _StopFlag )
   {
      µs = GetMicrosecondCount ();
      
       Comment (( string )µs);
       ChartRedraw ();      
   }
   
   Comment ( "" );   
}
 
Roman :

물론 비틀림과 미끄러짐 없이.
GetMicrosecondCount 카운터가 실행 중입니다.

카운터뿐만 아니라로드합니다. 빈 무한 루프도 로드됩니다. 나는 그것에 대해.

일반적으로 잘못된 결정입니다. 하지만 난 차라리하지 않습니다.

 
Andrey Khatimlianskii :

카운터뿐만 아니라로드합니다. 빈 무한 루프도 로드됩니다. 나는 그것에 대해.

일반적으로 잘못된 결정입니다. 하지만 난 차라리하지 않습니다.

따라서 비어 있는 동안은 물론 프로세서 주기의 전체 잠재력을 선택합니다.
잘못된 결정에 대한 불만을 이해하지 못했습니다. 자원 면에서 자신에게 적합하지 않다고 해서 나쁘다는 것은 아닙니다.
µsSLEEP은 표준 슬립 (1)보다 적은 루프 지연을 제공합니다. 즉, 밀리초가 아닌 마이크로초 단위입니다.
위의 예에서 5000000, 이것은 단지 예일 뿐이며 실제 전투 빈도는 1ms 미만입니다.

나는 당신의 문제를 이해하지 못합니다.
로드하지 않아도 되나요?
일반적인 Sleep(20)을 제공합니다. 밀리초 단위

 
Roman :

따라서 비어 있는 동안은 물론 프로세서 주기의 전체 잠재력을 선택합니다.
잘못된 결정에 대한 불만을 이해하지 못했습니다. 자원 면에서 자신에게 적합하지 않다고 해서 나쁘다는 것은 아닙니다.
µsSLEEP은 표준 Sleep(1)보다 더 적은 루프 지연을 제공합니다. 즉, 밀리초가 아닌 마이크로초 단위입니다.
위의 예에서 5000000, 이것은 단지 예일 뿐이며 실제 전투 빈도는 1ms 미만입니다.

나는 당신의 문제를 이해하지 못합니다.
로드하지 않아도 되나요?
일반적인 Sleep(20)을 제공합니다. 밀리초 단위

클레임이 없었습니다.
나는 관심을 가지고 연구 한 그런 타이머가 필요하지 않습니다. 그러나 불필요하게 프로세서를 로드하기 때문에 솔루션이 좋지 않다고 생각합니다.

마이크로초 수면이 필요한 목적은 무엇입니까?

 
Andrey Khatimlianskii :

클레임이 없었습니다.
나는 관심을 가지고 연구 한 그런 타이머가 필요하지 않습니다. 그러나 불필요하게 프로세서를 로드하기 때문에 솔루션이 좋지 않다고 생각합니다.

그리고 어떤 목적을 위해 마이크로초 수면이 필요합니까?

로드되는 이유에 대해 생각하고 이유를 알아 내면 그러한 의견이 없을 것입니다.
1ms 미만으로 회전하려면 아아, 리소스로 지불하십시오.
그리고 누군가에게는 간격을 계산하기 위해 마이크로초 타이머 가 필요하기 때문에 이 경우에는 부하를 제거할 수 없는 것 같습니다.
반면에 마이크로초 타이머가 지속적으로 회전하여 비어있는 동안에 해당하는 부하를 주면,
그런 다음 문제가 발생하지만 이 지연을 설정하고 마이크로초 타이머를 사용하는 이유는 무엇입니까? 알겠습니다. 가사입니다.
그래서 나는 서버에 ping을 보내는데, 그 사이에 지체 없이 일정한 빈도로 ping을 보낸다.
또한 불필요한 호출이 있기 때문에 마이크로초 이산도 필요합니다.
나는 조금 전에 게시한 첫 번째 솔루션을 사용하고 µsSleep을 힙에 썼습니다. 유용할 수 있습니다.


 
Andrey Khatimlianskii :


그리고 어떤 목적을 위해 마이크로초 수면이 필요합니까?

다음은 완성된 솔루션입니다.
자연스럽게 Print() 를 자신의 코드로 대체합니다.

 #define SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount ();                 \
   switch ((currCount - prevCount) > 5000000 )                \
   {                                                        \
       case 0 :                                               \
         break ;                                             \
       case 1 :                                               \
         prevCount = currCount;                             \
         Print ( "ping" );                                     \
         break ;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong   prevCount = 0 ;
   
   while (! _StopFlag )
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin :
우리가 작성하는 새 테스터에서 이것을 변경하려고 합니다.
fxsaber :

LS로 보냈습니다.

테스터에서 이 EA는 수정 형태로 완전하고 합리적인(스팸 아님) 거래 주문 에 대한 수백만 개의 기록을 생성합니다. 이러한 이유로 테스터 로그는 치명적으로 막힙니다.

이러한 로그는 99%의 경우에 필요하지 않지만 종종 필요한 것은 EA가 Print를 통해 출력하는 것입니다. 따라서 각 OrderSend 묶음에 대한 자동 레코드 생성을 테스터에서 비활성화할 수 있는지 다시 한 번 생각해 보시기 바랍니다.

내가 올바르게 이해했다면 그러한 문자열의 생성을 비활성화하면 단일 실행의 성능이 향상됩니다. 저것들. 혜택은 두 배입니다.

 
Renat Fatkhullin :


그러나 시카고에 있는 플랫폼의 물리적 코어가 있는 MetaTrader 5의 AMPGlobalEU-Live(사실 AMPGlobalUSA-Live로 찾는 것이 좋습니다)는 가장 가까운 서버가 뉴욕에 있기 때문에 실제로 19.53ms입니다.

나는 특별히 모든 포인트를 수동으로 스캔했습니다. 최소값은 19ms입니다.

우리는 앞으로 시카고에 서버를 설치하려고 노력할 것입니다. 손이 닿지 않았습니다.

시카고에서 서버가 배포되었습니다.

하루 안에 모든 서버를 스캔하고 배포에 참여합니다.