MT5와 속도 - 페이지 54

 
Roman :

알겠습니다. 다시 말하겠습니다. mql 내에서는 프로세서의 클럭 속도에 따라 대략적으로 가능합니다.
그러나 PWM은 어떻습니까? - 일정한 주파수 및 가변 듀티 사이클의 펄스 신호.
지속성을 설정하지 않습니까?

시작하려면 WinAPI 절전 기능이 무엇이며 실제로 어떤 역할을 하는지 읽어 보십시오.

PS Windows는 실시간 시스템이 아닙니다.

 
Slava :

시작하려면 WinAPI 절전 기능이 무엇이며 실제로 어떤 역할을 하는지 읽어보십시오.

PS Windows는 실시간 시스템이 아닙니다.

흠, 묻기 민망합니다. WinAPI Sleep이 그것과 어떤 관련이 있습니까?
마이크로초 슬립 에 대해 이야기할 때
프로세서에 대해 개별적으로 타이머의 빈도를 결정하고 반복 횟수를 계산할 수 있습니다.
즉, mql에서 자신의 MicrosecondCount를 작성할 수 있지만 요점이 무엇입니까? 표준형이면 충분합니다.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman :

흠, 묻기 민망합니다. WinAPI Sleep이 그것과 어떤 관련이 있습니까?
마이크로초 슬립 에 대해 이야기할 때
프로세서에 대해 개별적으로 타이머의 빈도를 결정하고 반복 횟수를 계산할 수 있습니다.
즉, mql에서 자신의 MicrosecondCount를 작성할 수 있지만 요점이 무엇입니까? 표준형이면 충분합니다.

컨텍스트 전환 없이 보류 중인 절전 모드는 코어를 100% 소모합니다.

그것은 끔찍한 프로그래밍 기술입니다. 신은 그런 코드가 시장에 스며드는 것을 금지합니다.

 
Renat Fatkhullin :

컨텍스트 전환 없이 보류 중인 절전 모드는 코어를 100% 소모합니다.

그것은 끔찍한 프로그래밍 기술입니다. 신은 그런 코드가 시장에 스며드는 것을 금지합니다.

그리고 아무도 그 하드코어 를 부정하지 않았어   ))
컨텍스트 스위칭의 예를 보여주면 개선할 수 있습니까?

다음은 2개의 코어와 4개의 스레드가 할당된 VirtualBox에서 µsSLEEP(µsRange)의 CPU 사용량입니다.
광부는 더 심하게 화상을 입습니다))

cp

 

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

라이브러리: 시퀀스

fxsaber , 2020.10.13 12:54

대부분의 VPS를 죽일 EA의 예.
 #include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define PRINT(A) Print ( #A + " = " + ( string )(A))

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

void OnInit ()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
     MqlTick Ticks[];
    
    PRINT( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , ( long )inFrom * 1000 ));
    PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
    
     Sleep ( 10000 ); // Ждем освобождения CopyTicks-данных.
  }
}


우리는 다양한 기호의 여러 차트에서 이를 출시합니다. 이 작업을 자동화하기 위해 inAmount = 5 와 함께 이 스크립트 를 사용했습니다.


결과.

 2020.10 . 13 13 : 26 : 53.199 Test9 (AUDCAD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5406953
2020.10 . 13 13 : 26 : 53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 2838
2020.10 . 13 13 : 26 : 53.528 Test9 (EURCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 3430958
2020.10 . 13 13 : 26 : 53.807 Test9 (EURCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3144
2020.10 . 13 13 : 26 : 53.924 Test9 (EURUSD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4244747
2020.10 . 13 13 : 26 : 54.214 Test9 (EURUSD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3464
2020.10 . 13 13 : 26 : 54.344 Test9 (AUDCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4327679
2020.10 . 13 13 : 26 : 54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3797
2020.10 . 13 13 : 26 : 54.864 Test9 (GBPCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5340006
2020.10 . 13 13 : 26 : 55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 4308
2020.10 . 13 13 : 26 : 55.666 Test9 (EURAUD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 7730155
2020.10 . 13 13 : 26 : 55.756 Test9 (EURAUD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 4316

이 6명의 Expert Advisors를 실행하려면 터미널에서 4Gb 이상의 메모리가 필요했습니다. 이것은 초기화에만 필요하지만 이러한 Expert Advisors의 작업에는 필요하지 않습니다. 전문가 고문이 있는 터미널을 시작한다고 상상해보십시오. 정직한 무료 4Gb RAM이 없으면 거의 재앙입니다.


이제 소스 코드에서 이 줄의 주석을 제거합니다.

   if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

따라서 Expert Advisor를 순차적으로 초기화할 수 있습니다.


우리는 결과를 봅니다(재컴파일 후).

 2020.10 . 13 13 : 27 : 24.002 Test9 (AUDCAD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5406980
2020.10 . 13 13 : 27 : 24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1234
2020.10 . 13 13 : 27 : 35.407 Test9 (EURUSD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4244772
2020.10 . 13 13 : 27 : 35.422 Test9 (EURUSD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1095
2020.10 . 13 13 : 27 : 46.886 Test9 (GBPCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5340072
2020.10 . 13 13 : 27 : 46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1224
2020.10 . 13 13 : 27 : 58.293 Test9 (AUDCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4327724
2020.10 . 13 13 : 27 : 58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1114
2020.10 . 13 13 : 28 : 09.683 Test9 (EURCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 3430999
2020.10 . 13 13 : 28 : 09.696 Test9 (EURCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1015
2020.10 . 13 13 : 28 : 21.339 Test9 (EURAUD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 7730313
2020.10 . 13 13 : 28 : 21.363 Test9 (EURAUD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1519


Expert Advisors 출시 당시 터미널의 메모리 사용량을 2.5Gb 이상 줄이는 것이 가능했습니다. VPS 재해(및 약한 가정용 기기)의 가능성이 크게 감소했습니다.


이것이 두 출시가 역학적으로 보이는 방식입니다.

순차적 실행은 전체 초기화 시간을 늘렸지만 터미널이 엄청난 RAM 소비를 방지하도록 관리했습니다.


위쪽 및 아래쪽 그래프는 병렬 초기화(높은 왼쪽 피크)와 6개의 연속 초기화(6개의 중간 피크) 과정을 명확하게 보여줍니다.


위협 실험 중에 수면과 관련된 불쾌한 뉘앙스가 드러났습니다. 출처를 참조하십시오.


CopyTicks를 사용한 후 강제로 메모리 해제를 어떻게든 허용해 주시길 부탁드립니다. 그런 수면 목발을 만들지 않기 위해.

 
주어진 간격으로 틱의 이력을 조회하는 메모리 소모 측면에서 가장 저렴한 방법을 추천하십시오.
 
fxsaber :
주어진 간격으로 틱의 이력을 조회하는 메모리 소모 측면에서 가장 저렴한 방법을 추천하십시오.

내 생각에 당신은 저렴하지만 빠르게 메모리를 확보할 수 있는 방법을 찾고 있는 것이 아닙니다.

확인 옵션으로:

- 동적 배열 MqlTick Ticks[]를 클래스에 래핑하고 new(즉, 동적 개체)를 통해 개체를 만들고 필요하지 않은 경우 삭제

- 동일하지만 구조가 있지만 로컬 범위 (함수 또는 로컬 블록 { } - 또는 한 번의 반복이 있는 루프? )에서 구조는 클래스처럼 작동하지 않습니다. - 내 EA 코드의 대부분을 다음과 같이 다시 작성 클래스에서 벗어나 데이터 구조를 교체함으로써 최적화 속도가 상당히 빨라졌습니다. 아마도 주관적으로 새 빌드가 더 빠르게 작동할 수 있을 것입니다.

- 소멸자에 ArrayFree()를 추가해 보십시오.

 
Igor Makanu :

내 생각에 당신은 저렴하지만 빠르게 메모리를 확보할 수 있는 방법을 찾고 있는 것이 아닙니다.

터미널 메모리를 해제하지 않습니다. MQL 변수는 그것과 아무 관련이 없습니다.

 
fxsaber :

터미널 메모리를 해제하지 않습니다. MQL 변수는 이와 관련이 없습니다.

크기를 강제로 설정하면 = 1 ?

그리고 당신이 할 경우

 MqlTick   Tick[];
MqlTick   ZeroTick[ 1 ] = { 0 };
.....
ArrayResize (Tick, 1 );
ArrayCopy (Tick,ZeroTick)
 
Igor Makanu :

그리고 만약

CopyTicks를 호출한 후 터미널은 모든 데이터를 몇 초 동안 메모리에 보관합니다. 누군가가 진드기 기록 을 다시 읽고 싶은 경우.

저것들. 터미널이 소비하는 메모리의 양은 MQL 변수의 크기에 어떤 식으로든 의존하지 않습니다.


작업은 터미널이 강제로 여유 메모리를 사용하도록 하는 것입니다.