Metatrader 5 - 기호를 통해 차트를 순환할 때 많은 메모리를 사용합니다.

 
안녕,

기호를 순환하도록 설정된 Expert Advisor가 있으며 많은 메모리를 씹습니다.

나는 이것이 천천히 올라오는 Market Watch에 기호가 로드되거나 로드될 때라는 것을 알아차렸습니다. 따라서 Market Watch의 기존 항목을 순환하는 차트가 아니라 새 기호가 로드 및 제거될 때 차트가 순환합니다.

다음을 수행하도록 설정됩니다.

  1. OnInit는 타이머를 3초마다 실행하도록 설정합니다.
  2. 온타이머
    1. SymbolTotal() SymbolName()을 사용하여 목록에서 다음 기호를 가져옵니다.
    2. SymbolSelect()를 사용하여 차트를 다음 기호로 설정하여 Market Watch에 로드하고 ChartSetSymbolPeriod()를 사용하여 현재 차트를 다음 기호로 설정합니다.
    3. SymbolSelect()를 사용하여 Market Watch에서 사용하지 않는 기호를 제거합니다.

가능한 한 많은 사용자 정의 코드를 제거하고 위의 단계를 사용하여 사용 가능한 기호를 순환하는 차트를 사용하면 내 컴퓨터의 메모리 사용량이 계속 증가하는 것을 알 수 있습니다.

CPU는 그대로 유지되고 속도는 일정하지만 메모리는 바로 올라갑니다.

질문:

  1. 왜 이런 일이 발생합니까?
  2. 누군가가 메모리 촬영을 중지해야 하는 해결 방법이나 제안 사항이 있습니까?
    (즉, ChartSetSymbolPeriod()로 기존 차트를 사용하는 대신 ChartOpen()으로 새 차트를 엽니다.
  3. 해결 방법이 있습니까?
    (즉, 이것이 바로 작동하는 방식입니다)
  4. 다른 제안 사항이 있으신가요?


감사합니다

 
어쩌면 끝없는 루프? 코드가 없으면 추측하기 어렵습니다.
 

예, 그것은 끝없는 루프이지만 그것이 아이디어입니다.

모든 기호를 계속 순환합니다.

아래 코드는 3초마다 실행됩니다.

다음은 코드 스니펫입니다(데모 목적으로 한 가지 방법으로 모두 제공됨).

 void OnTimer ()
  {
       // Find next symbol
       long symbolsTotal = SymbolsTotal ( false );
       long count = GlobalVariableGet ( "testmem" );
       if (count >= symbolsTotal)
      {
         count = 0 ;         
      }                  
       string newSymbol = SymbolName (count, false );
       SymbolSelect (newSymbol, true );
      count++;
       GlobalVariableSet ( "testmem" , count);
      
       // Change chart symbol
       ChartSetSymbolPeriod ( 0 , newSymbol, Period ());         
      
       // Remove other symbols from Market Watch
      CArrayString *symbols = new CArrayString();
       for ( int i = 0 ; i < SymbolsTotal ( true ); i++)
      {
         string symbol = SymbolName (i, true ); // Get name from local market watch
         symbols.Add(symbol);
      }           
            
       int total = symbols.Total();
       for ( int i = 0 ; i < total; i++)
      {
         string symbolToRemove = symbols.At(i);
         
         // Is the symbol not the current chart or about to  
         // be added?
         if (newSymbol != symbolToRemove)
         {            
             // Remove from Market Watch
             SymbolSelect (symbolToRemove, false );   
         }         
      }
      
       delete symbols;
   
  }
 
기호는 어디에서 시작됩니까?
 

"기호"가 무엇을 의미하는지 확실하지 않지만 위의 코드는 ExecuteTimer()가 3초로 설정된 새로운 Expert Advisor에 있습니다.

다음은 코드입니다(EA에 있음).

int OnInit()
{
//--- 타이머 생성
이벤트 세트 타이머(3);

//---
반환(INIT_SUCCEEDED);
}

 
안녕,

첨부 파일 "ForumQuestion1.mq5"를 참조하여 전체 스크립트를 추가했습니다.

오류를 재현하는 단계:

  1. Metatrader 5용 Metaeditor(안전함)에서 첨부된 스크립트를 엽니다.
  2. Windows에서 작업 관리자 열기
    1. "Metatrader 5 Client Terminal"을 찾아 메모리 양을 확인합니다.
  3. 스크립트를 실행하고 작업 관리자에서 메모리 열을 확인하십시오.

스크립트가 기호를 순환함에 따라 메모리가 천천히 증가합니다.

파일:
 
gr101 :
안녕,

첨부 파일 "ForumQuestion1.mq5"를 참조하여 전체 스크립트를 추가했습니다.

오류를 재현하는 단계:

  1. Metatrader 5용 Metaeditor(안전함)에서 첨부된 스크립트를 엽니다.
  2. Windows에서 작업 관리자 열기
    1. "Metatrader 5 Client Terminal"을 찾아 메모리 양을 확인합니다.
  3. 스크립트를 실행하고 작업 관리자에서 메모리 열을 확인하십시오.

스크립트가 기호를 순환함에 따라 메모리가 천천히 증가합니다.

귀하의 코드를 시도했지만 메모리 문제가 없습니다.

MT5 빌드 1325.

 

안녕 알랭

응답해 주셔서 감사합니다.

같은 빌드에 있어요. 메모리 증가가 느립니다. 몇 분 정도 걸립니다. 기본적으로 점차 증가합니다.

첨부 파일 "메모리 증가.docx.png"를 참조하십시오. 시간이 지남에 따라 축적되는 것을 보여주는 스크린샷이 몇 개 있습니다.

나는 같은 빌드 "MT5 Build 1325"에 있습니다.

기계 정보:

  • 윈도우 8.1 엔터프라이즈
  • 64비트 OS
  • 16Gb 램
  • i7 프로세서

감사해요

파일:
 
gr101 :

안녕 알랭

응답해 주셔서 감사합니다.

같은 빌드에 있어요. 메모리 증가가 느립니다. 몇 분 정도 걸립니다. 기본적으로 점차 증가합니다.

첨부 파일 "메모리 증가.docx.png"를 참조하십시오. 시간이 지남에 따라 축적되는 것을 보여주는 스크린샷이 몇 개 있습니다.

같은 빌드 "MT5 Build 1325"에 있습니다.

기계 정보:

  • 윈도우 8.1 엔터프라이즈
  • 64비트 OS
  • 16Gb 램
  • i7 프로세서

감사해요

차이가 있다면 Windows 10을 사용 중입니다.

귀하의 스크립트는 내 이전 게시물보다 몇 분 전부터 실행 중입니다. 현재 메모리 사용량은 내가 시작할 때보다 낮습니다(280Mb 대 300Mb).

편집: 방금 다시 확인 했는데 이제 189Mb입니다!!! 여전히 감소 중 :D

EDIT2: Metaquotes Demo-Server에서 실행 중입니다.

 

피드백을 주셔서 감사합니다.

Windows 10으로 업그레이드하고 차이가 있는지 확인하겠습니다.

 

나는 Windows Server 12 R2에 그것을 넣었고 그것은 또한 메모리를 밀어냅니다.

잠시 동안 이것을 모니터링하고 이 스레드에 대한 피드백을 제공하겠습니다.