MT5와 속도 - 페이지 9

 
fxsaber :

흔한 현상인 것 같습니다. 무역 기능을 호출하지 않았습니다.

SymbolInfoTick은 때때로 꽤 느립니다. HFT는 이러한 예기치 않은 지연으로 인해 매우 까다로울 수 있습니다.

이유를 찾기 위해 개발자에게 요청하십시오. 그 동안 프로파일러 는 전투 고문에게 필수라는 것이 분명해집니다.

"빈" 터미널에 대한 테스트는 무엇을 보여줍니까?

 void OnStart ()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time= 0 ,avr_time= 0 ;
   int    count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       SymbolInfoTick ( _Symbol , Tick);
      end= GetMicrosecondCount ()-start;
       //--- >1 ms
       if (end> 1000 )
         Print ( " > 1 ms for one SymbolInfoTick: " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
       //---
       if (end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print ( "SymbolInfoTick max time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr time: " , DoubleToString (avr_time/ 1000.0 /count, 3 ), " ms; " ,count, " iterations" );
//---
   start= GetMicrosecondCount ();
   for ( int i= 0 ; i<count; i++)
       SymbolInfoTick ( _Symbol , Tick);
   end= GetMicrosecondCount ()-start;
   Print (count, " SymbolInfoTick = " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
  }

다음과 같아야 합니다.

 2020.06 . 04 11 : 02 : 30.123 TestSymbolInfoTick (EURUSD,H1)   SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06 . 04 11 : 02 : 30.138 TestSymbolInfoTick (EURUSD,H1)   100000 SymbolInfoTick = 14.85 ms
2020.06 . 04 11 : 02 : 31.433 TestSymbolInfoTick (EURUSD,H1)   SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06 . 04 11 : 02 : 31.448 TestSymbolInfoTick (EURUSD,H1)   100000 SymbolInfoTick = 15.17 ms
2020.06 . 04 11 : 02 : 33.064 TestSymbolInfoTick (EURUSD,H1)   SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06 . 04 11 : 02 : 33.079 TestSymbolInfoTick (EURUSD,H1)   100000 SymbolInfoTick = 15.12 ms

당신이하고있는 일, 터미널에 부하를 생성하는 방법을 자세히 알려주지 않으면 이유를 찾기가 어려울 것입니다.

 
Anton :

"빈" 터미널에 대한 테스트는 무엇을 보여줍니까?

다음과 같아야 합니다.

         SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
         100000 SymbolInfoTick = 8.56 ms
         SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
         100000 SymbolInfoTick = 9.04 ms
         SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
         100000 SymbolInfoTick = 9.02 ms

당신이하고있는 일, 터미널에 부하를 생성하는 방법을 자세히 알려주지 않으면 이유를 찾기가 어려울 것입니다.

100K 반복은 지표가 아닙니다. 왜냐하면 기능이 항상 느려지는 것은 아니지만 때때로 느려집니다.

사실, 나는 브레이크가 멈출 때까지 전투 고문의 조각을 꺼야합니다. 그런 다음 코드를 제공할 수 있습니다. 기다려야 합니다.

 
fxsaber :

사실, 나는 브레이크가 멈출 때까지 전투 고문의 조각을 꺼야합니다. 그런 다음 코드를 제공할 수 있습니다. 기다려야 합니다.

빠른 결과를 얻으려면 여러 기호에서 이 Expert Advisor를 실행하십시오.

 #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick ()
{
   MqlTick Tick[ 1 ];
  
   if (_B( CopyTicks ( _Symbol , Tick, COPY_TICKS_ALL , 0 , 1 ), 1 )) // Не знаю, влияет это или нет.
    _B( SymbolInfoTick ( _Symbol , Tick[ 0 ]), 1 );
}


5분 만에 얻었습니다.

         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 9 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 3 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 4 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 1 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 2 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 5 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 2 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 1 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 16 ms.
         Alert : Time[Test6.mq5 8 : SymbolInfoTick ( _Symbol ,Tick[ 0 ])] = 16 ms.


EA에 (CopyTicks 없이) 이것만 남겨두는 것으로 충분해 보입니다.

    _B( SymbolInfoTick ( _Symbol , Tick[ 0 ]), 1 );
 
fxsaber :

100K 반복은 지표가 아닙니다. 왜냐하면 기능이 항상 느려지는 것은 아니지만 때때로 느려집니다.

함수의 속도를 결정하는 개념을 변경할 것을 제안합니다.

해당 기간에 피크가 없는 경우 함수가 빠릅니다.


위와 같이 단순한 함수에도 이러한 피크가 있습니다. 때로는 매우 큽니다. 나는 이것이 무엇에 관한 것인지 전혀 모른다. 그러나 제안된 방법을 사용하여 피크의 존재에대한 거래에 중요한 모든 기능 을 확인해야 하는 것은 분명합니다. 저것들. 우리는 몇 시간 동안 밀리초보다 큰 피크를 실행하고 모니터링합니다.


최소한 빈 터미널에는 피크가 없는지 확인해야 합니다. 100,000번의 빠른 반복은 결과적으로 아무 의미가 없습니다.

 
fxsaber :

함수의 속도를 결정하는 개념을 변경할 것을 제안합니다.

해당 기간에 피크가 없는 경우 함수가 빠릅니다.


위와 같이 단순한 함수에도 이러한 피크가 있습니다. 때로는 매우 큽니다. 나는 이것이 무엇에 관한 것인지 전혀 모른다. 그러나 제안된 방법을 사용하여 피크의 존재에 대한 거래에 중요한 모든 기능 을 확인해야 하는 것은 분명합니다. 저것들. 우리는 몇 시간 동안 밀리초보다 큰 피크를 실행하고 모니터링합니다.


최소한 빈 터미널에는 피크가 없는지 확인해야 합니다. 100,000번의 빠른 반복은 결과적으로 아무 의미가 없습니다.

다른 작업이 실행 중인 경우 타이머에 누적 시간이 표시되는 경우가 있습니다. 예를 들어 캔버스로 작업할 때 이런 일이 발생합니다. 표시할 때 함수는 이미지를 생성하지 않고 표시할 작업을 설정하고 반환합니다. 다음으로, 반드시 순차적으로 진행되는 다른 기능이 실행됩니다. 예를 들어 동일한 주석이지만 프로세서의 언어에서는 캔버스 표시 프로세스가 시작되고 주석이 표시된 후에만 실행됩니다. 그리고 타이밍을 측정해보면 댓글이 아주 오랫동안 표시되는 것을 볼 수 있습니다. 그러나 캔버스 표시 기능은 0ms에서 작동했습니다.

 
fxsaber :

우리는 몇 시간 동안 밀리초보다 큰 피크를 실행하고 모니터링합니다.

최소한 빈 터미널에는 피크가 없는지 확인해야 합니다. 100,000번의 빠른 반복은 결과적으로 아무 의미가 없습니다.

그런 어드바이저-모니터링을 스케치했습니다.

 // Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10 ;     // Циклов проверки в одном OnTick
input int inAlertTime = 1 ; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
   MqlTick Tick;
  
   if (_B2( SymbolInfoTick (Symb, Tick)))
  {
     MqlTick Ticks[];
    
    _B2( CopyTicks (Symb, Ticks, COPY_TICKS_ALL , 0 , 1 ));
    _B2( CopyTicks (Symb, Ticks, COPY_TICKS_ALL , Tick.time_msc));
    _B2( CopyTicksRange (Symb, Ticks, COPY_TICKS_ALL , Tick.time_msc));

    _B2( HistorySelect (Tick.time, INT_MAX ));
    
    _B2( HistoryDealsTotal ());
    _B2( HistoryDealGetTicket ( 0 ));
    _B2( HistoryDealGetInteger ( 0 , DEAL_MAGIC ));
    _B2( HistoryDealGetDouble ( 0 , DEAL_PRICE ));
    _B2( HistoryDealSelect ( 0 ));

    _B2( HistoryOrdersTotal ());
    _B2( HistoryOrderGetTicket ( 0 ));
    _B2( HistoryOrderGetInteger ( 0 , ORDER_MAGIC ));
    _B2( HistoryOrderGetDouble ( 0 , ORDER_PRICE_CURRENT ));
    _B2( HistoryOrderSelect ( 0 ));
    
    _B2( GetLastError ());
    _B2( IsStopped ());
    
    _B2( SymbolInfoDouble (Symb, SYMBOL_ASK ));
    _B2( SymbolInfoDouble (Symb, SYMBOL_TRADE_TICK_VALUE ));
    _B2( SymbolInfoDouble (Symb, SYMBOL_POINT ));
    _B2( SymbolInfoInteger (Symb, SYMBOL_DIGITS ));

    _B2( TimeCurrent ());
    _B2( TimeLocal ());
    _B2( TimeTradeServer ());
    
    _B2( OrdersTotal ());
    _B2( OrderSelect ( 0 ));
    _B2( OrderGetDouble ( ORDER_PRICE_CURRENT ));
    _B2( OrderGetInteger ( ORDER_MAGIC ));
    _B2( OrderGetString ( ORDER_SYMBOL ));
    
    _B2( PositionsTotal ());
    _B2( PositionSelect (Symb));
    _B2( PositionSelectByTicket ( 0 ));
    _B2( PositionGetDouble ( POSITION_PRICE_CURRENT ));
    _B2( PositionGetInteger ( POSITION_MAGIC ));
    _B2( PositionGetString ( POSITION_SYMBOL ));
    
    _B2( AccountInfoDouble ( ACCOUNT_EQUITY ));
    _B2( AccountInfoInteger ( ACCOUNT_MARGIN_MODE ));
    
     MqlTradeRequest Request = { 0 };
     MqlTradeCheckResult CheckResult;

    _B2( OrderCheck (Request, CheckResult));
    
    _B2( MQLInfoInteger ( MQL_TRADE_ALLOWED ));
    _B2( AccountInfoInteger ( ACCOUNT_TRADE_EXPERT ));
    _B2( AccountInfoInteger ( ACCOUNT_TRADE_ALLOWED ));
    _B2( TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ));
    
    _B2( SymbolsTotal ( true ));
    _B2( SymbolName ( 0 , true ));
    _B2( Symbol ());
    
    _B2( GlobalVariableCheck ( NULL ));
    _B2( GlobalVariableGet ( NULL ));
    
    _B2( ResourceFree ( NULL ));
  }
}

void OnTick ()
{
   for ( int i = 0 ; i < inCycle; i++)
    Check( _Symbol , inAlertTime);
}


5분의 모니터링 결과.

         Alert : Time[Test6.mq5 18 : HistorySelect (Tick.time, INT_MAX )] = 21 ms.
         Alert : Time[Test6.mq5 24 : HistoryDealSelect ( 0 )] = 4 ms.
         Alert : Time[Test6.mq5 10 : SymbolInfoTick (Symb,Tick)] = 24 ms.
         Alert : Time[Test6.mq5 14 : CopyTicks (Symb,Ticks, COPY_TICKS_ALL , 0 , 1 )] = 4 ms.
         Alert : Time[Test6.mq5 30 : HistoryOrderSelect ( 0 )] = 3 ms.
         Alert : Time[Test6.mq5 35 : SymbolInfoDouble (Symb, SYMBOL_ASK )] = 2 ms.


PS 이 입력 매개변수 값을 사용하면 훨씬 적은 수의 경고가 발생합니다.

 input int inAlertTime = 10 ; // Нижний порог в миллисекундах


그러나 결과는 더 좋습니다.

         Alert : Time[Test6.mq5 21 : HistorySelect (Tick.time, INT_MAX )] = 19 ms.
         Alert : Time[Test6.mq5 21 : HistorySelect (Tick.time, INT_MAX )] = 10 ms.
         Alert : Time[Test6.mq5 38 : SymbolInfoDouble (Symb, SYMBOL_ASK )] = 10 ms.
         Alert : Time[Test6.mq5 13 : SymbolInfoTick (Symb,Tick)] = 10 ms.
         Alert : Time[Test6.mq5 38 : SymbolInfoDouble (Symb, SYMBOL_ASK )] = 10 ms.
         Alert : Time[Test6.mq5 17 : CopyTicks (Symb,Ticks, COPY_TICKS_ALL , 0 , 1 )] = 148 ms.
         Alert : Time[Test6.mq5 74 : SymbolName ( 0 , true )] = 11 ms.
 

마지막으로 각 주문에 대한 주문 팩을 수정하는 데 3-10초가 소요되는 경우가 있습니다. 그런 다음 다시 0.1초의 긴 시간 동안.

서버 로그 발생 - 즉시.


전투 고문에게는 매우 불쾌합니다.

 2020.06 . 04 15 : 24 : 48.771 Alert : Time[NewTicks.mqh 31 : :: SymbolInfoTick ( _Symbol ,Tick)] = 61 ms.
2020.06 . 04 15 : 25 : 21.729 Alert : Time[NewTicks.mqh 31 : :: SymbolInfoTick ( _Symbol ,Tick)] = 29 ms.
2020.06 . 04 15 : 27 : 57.842 Alert : Time[NewTicks.mqh 31 : :: SymbolInfoTick ( _Symbol ,Tick)] = 142 ms.


환상적인 가치.

 
fxsaber :

마지막으로 각 주문에 대한 주문 팩을 수정하는 데 3-10초가 소요되는 경우가 있습니다. 그런 다음 다시 0.1초의 긴 시간 동안.

서버 로그 발생 - 즉시.

상황은 다른 거래 서버에서 반복되었습니다.

터미널이 열린 위치를 수정하는 데 2.5초가 걸립니다. 서버에서 - 2밀리초.

아마도 여기에서 FORTS 성능 문제의 다리가 커집니다.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.03.30
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 

재전송합니다.

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

MetaTrader 5 플랫폼 빌드 1700 베타 버전: MetaEditor 및 합성 도구의 프로젝트

레나트 팻쿨린 , 2017.12.14 12:47

이것은 연결 품질을 나타내는 지표입니다. TCP/IP 프로토콜에서 재전송된 네트워크 패킷의 백분율입니다.

전체 운영 체제의 모든 응용 프로그램에 대해 네트워크 인터페이스 수준에서 전역적으로 고려됩니다. 브레이크 및 문제가 의심되는 경우 이 표시기를 참조하십시오. 브로커의 서버가 매우 멀리 떨어져 있는 경우 중요합니다. 예를 들어, 아시아 거래자와 유럽 중개인의 경우.

이미 재전송의 3%에서는 거래가 불가능하다고 말할 수 있습니다. 엄청난 수준의 재전송은 나쁜 Wi-Fi를 제공합니다.

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

MetaTrader 5 플랫폼 빌드 2360의 새 버전: SQLite와의 확장된 통합

레나트 팻쿨린 , 2020.04.06 12:33

비율은 1% 미만이어야 합니다. 그리고 이미 네트워크 손실의 3%가 저지연 서비스로 인해 사망합니다.

예를 들어, 분명히 더 많은 사용자(현재 MetaQuotes-Demo에서 17k 온라인)와 함께 0.68 - 0.75%의 재전송이 있습니다. 그리고 우리는 모스크바/러시아가 아닌 전 세계에 봉사합니다.

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

오류, 버그, 질문

레나트 팻쿨린 , 2017.12.17 23:03

이것은 Metatrader가 사용자 중 한 명인 전체 컴퓨터의 네트워크 인터페이스에 대한 통계입니다. 반드시 거래 서버와 관련이 있는 것은 아닙니다.

일부 버그가 있고 먼 사이트에 성공적으로 액세스하지 못한 후 웹 브라우저에서 일반 통계를 망치기 쉽습니다. 또는 로컬 Wi-Fi와 네트워크 충돌을 포착하고 임의의 시간에 수십 퍼센트의 재전송을 얻을 수 있습니다.

재전송의 20%에서는 원칙적으로 트레이드 서버와의 통신이 유지되지 않고 재연결이 일정하고 끝이 없습니다. 터미널은 영구적인 연결을 가지고 있으며 이를 위해(좀 더 정확하게는 TCP/IP의 경우) 재전송의 3-5%라도 긴 연결을 유지하는 작업에서 치명적입니다.

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

오류, 버그, 질문

레나트 팻쿨린 , 2017.12.18 11:36

이것은 운영 체제에서 보고하는 로컬 TCP/IP 스택의 기술적 특성이며 거래 서버에 대한 특정 연결의 품질을 나타내는 지표가 아닙니다. 여기에는 시스템/백그라운드 활동을 포함한 모든 네트워크 활동이 포함됩니다.


거래 클러스터는 확실히 고품질 연결을 갖고 있으며 우리는 일상적으로 많은 매개변수(플랫폼의 일반 기능임)를 기록하고 후속 분석을 통해 미세한 스냅샷을 수집합니다.

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

오류, 버그, 질문

레나트 팻쿨린 , 2017.12.18 00:13

확인했습니다.

아시아를 포함한 데모 클러스터의 노드는 하루 종일(그리고 다른 날에도) 다시 시작되거나 재전송 수준이 증가하지 않았습니다. 모든 것은 0.5%에서 1.5%까지 정상입니다.


많이 가지고 있는 것 같습니다.

지금은 자정이며 견적은 거의 업데이트되지 않습니다. 재전송이 우리 눈앞에서 증가합니다. VPS에서 지연 시간이 짧은 거래에 대해 높은 값 > 1%로 경고를 설정하고 싶습니다. 그러나 이러한 거대한 가치로 인해 이 아이디어는 무의미해집니다.


무엇을 추천할 수 있습니까? 트레이서를 트레이드 서버로 추적합니까? 모니터링 소프트웨어가 있습니까? 일반적으로 MT5가 짧은 대기 시간을 위해 준비되었는지 확인하는 방법은 무엇입니까?


위협 호가가 더 빨리 움직이기 시작하면 지표가 크게 떨어집니다.

 
fxsaber :

재전송합니다.


많이 가지고 있는 것 같습니다.

오전 5-6시:

집에서(광학, 라우터에 ETH, 컴퓨터에 케이블) - 8-19%, 핑 60-70

네덜란드의 VPS(현재 9개 통화/11개 차트가 있는 1MT5) - 1.2-1.6%, 핑 3.7

사유: