MT5와 속도 - 페이지 56

 
Renat Akhtyamov :
프로게이머 여러분...
먼저 컴퓨터의 메모리 할당에 대해 읽은 다음 어떻게 그리고 어떤 수단으로 수행되는지를 읽고 정리하고 읽는 방법은 어렵지 않습니다. kr에 따르면 개발자에게 가능한 한 더 합리적인 제안

mt4에서 당신은 그것에 대해 알지 못합니까?
사전 정의된 입찰 요청을 직접 사용하십니까?
전체 MqlTick 구조에 대한 MT5에서는 어떤 이유로 그렇지 않습니다.
함수를 호출하고 구조를 채운 다음에만 값을 가져옵니다.
또는 즉시 값을 얻습니다. 차이가 있습니까?

아니면 내 방향이 아닌가?
적어도 나는 내가 쓴 사람을 나타낼 것입니다))

 
Roman :

현재 틱에 대해 미리 정의된 변수가 더 나을 것입니다.

개발자들은 이전에 직접 액세스에 대한 근본적인 제한이 있다고 설명했습니다.

 void f()
{
         MqlTick t1 = _Tick;
         MqlTick t2 = _Tick;
}

일반적으로 t1은 t2와 같지 않습니다. 또한 t1과 t2 자체 내부의 필드 값은 결국 일반적으로 다른 틱을 참조할 수 있습니다.

 
A100 :

개발자들은 이전에 직접 액세스에 대한 근본적인 제한이 있다고 설명했습니다.

일반적으로 t1은 t2와 같지 않습니다. 게다가, t1과 t2 내부의 필드 값은 관련 필드가 있다는 사실에도 불구하고 일반적으로 다른 틱을 참조할 수 있습니다(하나의 틱을 참조해야 함)

Brr, 근본적인 한계는 무엇입니까?
귀하의 예에서 구조는 여기에서 불필요하므로 채울 필요가 없습니다.

소켓에서 값이 나왔고 _Ask, _Bid 등의 변수에 값을 썼습니다. 구조로.
_ 물어보세요 != _당신에 따라 물어보세요?
구조를 채우면 제한이 발생하며 시간이 걸립니다.
작성하지 않으셔도 되며 _Ask, _Bid 등 직접 입력하시면 됩니다.

 
Roman :

Brr, 근본적인 한계는 무엇입니까?
귀하의 예에서 구조는 여기에서 불필요하므로 채울 필요가 없습니다.

 void f()
{
         double ask1 = _Ask;
         double ask2 = _Ask;
}

구조 없이 다시 쓸 수 있습니다. 일반적으로 Ask1은 Ask2와 같지 않습니다.

 
A100 :

구조 없이 다시 쓸 수 있습니다. 일반적으로 Ask1은 Ask2와 같지 않습니다.

저것들. 비동기 환경에 대한 요청이며 현재 환경 상태에 따라 응답을 얻습니까? 그리고 OnTick은 현재 틱을 잡아서 EA만 처리하지만, 동시에 EA를 계산할 때 틱 구조에 대한 쿼리는 다음 틱에서 답을 얻을 수 있나요?

 
A100 :

구조 없이 다시 쓸 수 있습니다. 일반적으로 Ask1은 Ask2와 같지 않습니다.

따라서 실수의 마지막 숫자가 0.0000000000000000000001인 100500자리를 사용할 필요가 없습니다.
각 변수에는 고유한 숫자가 있으며 이중 가격의 경우 최대값은 8입니다.

 
Renat Fatkhullin :

그들은 중요한 베타 2652를 출시했습니다.

  • 향상된 컴파일 중단(22%)
  • SymbolInfoTick에 대한 액세스의 기본 가속

22% - 우수합니다.

SymbolInfoTick - 가정용 컴퓨터에서 경고하지 않는다는 것을 눈으로 확인했습니다. 그러나 저널에서 이러한 경고에 대한 필터를 만들었고 하루 전 같은 기간에 발행된 2650개보다 훨씬 더 많은 경고가 있음을 확인했습니다.

두 로그를 모두 PM에게 보냈습니다.

 
Valeriy Yastremskiy :

저것들. 비동기 환경에 대한 요청이며 현재 환경 상태에 따라 응답을 얻습니까? 그리고 OnTick은 현재 틱을 잡아서 EA만 처리하지만, 동시에 EA를 계산할 때 틱 구조에 대한 쿼리는 다음 틱에서 답을 얻을 수 있나요?

네.

 
Renat Fatkhullin :

진드기를 사용한 대량 작업의 경우 더 많은 메모리를 설정하십시오.

4GB(가격 20유로)는 2020년에 분석 및 연구와 관련하여 좋지 않습니다.

이것은 CopyTicks에 대한 일회성 호출입니다. OnInit에서 이러한 진드기에 대한 가상 백테스트를 실제 생활에서 수행한 다음 실시간으로 계속 진행하여 신선한 진드기만 공급하기 위해 수행됩니다.

타협으로 CopyTicks가 OnInit에서 호출된 후 즉시 터미널에서 메모리를 해제하는 것이 좋습니다. 그러면 강제 냉각 기능 CopyTicks에 들어갈 수 없습니다.

Now Sleep (냉각 옵션)은 매우 중요합니다. 그러나 위에서 이 목발이 어떻게 메모리를 절약하는지 보여주었습니다.


이제 20명의 고문이 느린 VPS에서도 빠르게 쟁기질하는 것으로 나타났습니다. 그러나 그들의 시작은 심각한 문제입니다.


다음은 문제를 보여주는 EA입니다.

 // Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define PRINT(A) Print ( #A + " = " + ( string )(A))

input datetime inFrom = D'2020.06.01' ; // С какой даты анализировать историю

int OnInit ()
{
   MqlTick Ticks[];
  
   Print ( "Before CopyTicks:" );
  PRINT( MQLInfoInteger ( MQL_MEMORY_USED ));     
  PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
  
  PRINT( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , ( long )inFrom * 1000 ));
   ArrayFree (Ticks);
  
   Print ( "After CopyTicks:" );
  
   for ( int i = 0 ; i < 10 ; i++)
  {
    PRINT(i);
    PRINT( MQLInfoInteger ( MQL_MEMORY_USED ));    
    PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
    
     Sleep ( 1000 );
  }
  
   return ( INIT_FAILED );
}


결과.

 2020.10 . 14 08 : 49 : 24.016 Before CopyTicks :
2020.10 . 14 08 : 49 : 24.016 MQLInfoInteger ( MQL_MEMORY_USED ) = 0
2020.10 . 14 08 : 49 : 24.031 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 864
2020.10 . 14 08 : 49 : 25.399 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 14372119
2020.10 . 14 08 : 49 : 25.465 After CopyTicks :
2020.10 . 14 08 : 49 : 25.465 i = 0
2020.10 . 14 08 : 49 : 25.465 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 25.499 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 26.594 i = 1
2020.10 . 14 08 : 49 : 26.594 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 26.630 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 27.729 i = 2
2020.10 . 14 08 : 49 : 27.729 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 27.762 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 28.852 i = 3
2020.10 . 14 08 : 49 : 28.852 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 28.884 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 29.977 i = 4
2020.10 . 14 08 : 49 : 29.977 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 30.009 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 31.102 i = 5
2020.10 . 14 08 : 49 : 31.102 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 31.136 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 32.224 i = 6
2020.10 . 14 08 : 49 : 32.225 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 32.257 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 33.348 i = 7
2020.10 . 14 08 : 49 : 33.348 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 33.381 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 34.468 i = 8
2020.10 . 14 08 : 49 : 34.468 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 34.501 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 35.593 i = 9
2020.10 . 14 08 : 49 : 35.593 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 35.605 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 860
 
fxsaber :

22% - 우수합니다.

SymbolInfoTick - 가정용 컴퓨터에서 경고하지 않는다는 것을 눈으로 확인했습니다. 그러나 저널에서 이러한 경고에 대한 필터를 만들었고 하루 전 같은 기간에 발행된 2650개보다 훨씬 더 많은 경고가 있음을 확인했습니다.

두 로그를 모두 PM에게 보냈습니다.

대규모 병렬 액세스의 경우 수십 배 더 빠릅니다.

다른 경우에는 프로세서, 메모리 및 OS만 업그레이드하면 됩니다.