오류, 버그, 질문 - 페이지 2676

 
Sergey Dzyublik :

MT5(빌드 2347) ArrayResize를 사용하여 배열에 하나의 요소를 추가할 때 메모리가 이전에 예약된 경우 왜 이렇게 큰 오버헤드가 발생합니까?

ArrayResize를 사용하여 내부 예약 알고리즘을 개선하는 것을 고려하십시오.

예를 들어 클래스의 경우 생성자를 호출하는 것 외에도 일종의 "목록에 내부 등록"을 수행한다고 가정할 수 있습니다.
그리고 ArrayResize를 사용하는 예약의 일부로 직접 메모리 할당 외에도 프로세스를 최적화할 수 있습니다.
- 생성된 인접 요소에서 데이터를 가져옵니다(예: 가상 기능 테이블에 대한 포인터).
- 아직 생성되지 않은 클래스의 "내부 등록"을 위한 사전 또는 예약 공간

메시지 주셔서 감사합니다.

ArrayResize 코드는 빈 호출에 대한 보호 기능이 있으므로(요소 수에 변경 사항이 없는 경우) 함수 코드가 작동하지 않습니다.

요소 수가 실제로 변경되면 배열에 따라 ArrayResize 함수 중 하나 또는 일부가 작동합니다.


제공한 코드 덕분에 ArrayResize 부분 중 하나의 복잡성을 0으로 줄일 수 있었습니다. 이렇게 하면 개체 배열에 대한 함수의 속도가 빨라집니다.
 
Ilyas :

터미널의 메모리 소모를 줄이는 방법을 알려주세요. 어드바이저를 시작할 때 수백만 틱을 요청합니다. 나는 그것들에 대해 계산을 하고 그것들은 더 이상 필요하지 않습니다. 간격이 없도록 틱 함수만 사용하여 새 틱을 로드합니다.


이 백만 틱 때문에 터미널은 500MB의 메모리를 소비하고 서두르지 않습니다. 보다 정확하게는 단순히 해제되지 않습니다. 소비를 최소화하기 위해 터미널이 모든 캐시를 지우도록 강제할 수 있습니까? VPS용 0.5GB 각 단말기 - 과감하게 나옵니다.

 
fxsaber :

터미널의 메모리 소모를 줄이는 방법을 알려주세요. 어드바이저를 시작할 때 수백만 틱을 요청합니다. 나는 그것들에 대해 계산을 하고 그것들은 더 이상 필요하지 않습니다. 간격이 없도록 틱 함수만 사용하여 새 틱을 로드합니다.


이 백만 틱 때문에 터미널은 500MB의 메모리를 소비하고 서두르지 않습니다. 보다 정확하게는 단순히 해제되지 않습니다. 소비를 최소화하기 위해 터미널이 모든 캐시를 지우도록 강제할 수 있습니까? VPS용 0.5GB 각 단말기 - 과감하게 나옵니다.

어레이 프리

프로그램이 복잡한 동적 조건에서 메모리를 독립적으로 관리해야 하는 경우 ArrayFree() 함수를 사용하면 이미 불필요한 동적 배열이 차지하고 있는 메모리를 명시적으로 즉시 해제할 수 있습니다.

Документация по MQL5: Операции с массивами / ArrayFree
Документация по MQL5: Операции с массивами / ArrayFree
  • www.mql5.com
//| Класс диалога для работы с памятью                               | //| Освобождение памяти текущего массива                             | //| Попытка добавления памяти для текущего массива                   | //| Обработка событий                                                |...
 

물론 풀어줍니다. 터미널 자체는 작동 중에 필요하지 않은 캐시에 틱을 저장합니다.

감기에 걸렸을 때 이 틱을 다시 올리는 것이 좋습니다. 터미널의 "냉각" 메커니즘이 필요합니다.

 

안녕하세요 테스터의 CopyTicks와 CopyTicksRange가 다른 악기에서 데이터를 가져올 수 없는 문제에 봉착했는데 차트에 추가하면 모든 것이 작동합니다.

빌드 2363(2361에서도 동일)

내가 실수를 한 건 아닐까? 도와주세요, 감사합니다!

 #property copyright "Copyright 2020, LittleBitTime"
#property link        "https://login.mql5.com/ru/users/LittleBitTime"
#property version    "1.00"

int OnInit () {
   return INIT_SUCCEEDED ;
}

void OnDeinit ( const int reason) {
}

void OnTick () {
   MqlTick LastTick;
   if ( SymbolInfoTick ( Symbol (), LastTick)) {
       //Print("START");
      
       if (GetTicks( "RTS-3.20" , LastTick.time_msc) && GetTicks( "RTS-6.20" , LastTick.time_msc)) {
         Print ( "История загружена" );
      } else {
         Print ( "Ошибка загрузки истории" );
      }
       //Print("END");
   } else {
       Print ( "Ошибка получения последнего тика, для получения последнего известного времени" );
   }
}

bool GetTicks( string symbol, ulong TimeEnd) {
   ulong TimeStartPeriod = TimeEnd-( 60 * 1000 );
   
   MqlTick ticks[];
   bool success = false ; //флаг успешного выполнения копирования тиков
   uint start = GetTickCount (); //замерим время старта перед получением тиков
   
   int received = CopyTicksRange (symbol, ticks, COPY_TICKS_ALL , TimeStartPeriod, TimeEnd);
   if (received != - 1 ) {
       //выведем информацию о количестве тиков и затраченном времени времени
       PrintFormat ( "%s: received %d ticks in %d ms" , symbol, received, GetTickCount ()-start);
       //если тиковая история синхронизирована, то код ошибки равен нулю
       if ( GetLastError () == 0 )
         success = true ;
       else
         PrintFormat ( "%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d" , symbol, received, GetTickCount ()-start, _LastError );
   }
   
   if (!success) {
       PrintFormat ( "Ошибкаp загрузки тиков! " + symbol);
      
       return false ;
   }
   
   
   return true ;
}
파일:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime :

안녕하세요 테스터에서 CopyTicks와 CopyTicksRange가 다른 악기에서 데이터를 가져올 수 없는 문제가 발생했는데 차트에 추가하면 모든 것이 작동합니다.

빌드 2363(2361에서도 동일)

내가 실수를 한 건 아닐까? 도와주세요, 감사합니다!

CopyTicks는 테스터에서 데이터 다운로드를 시작하지 않습니다.

먼저 원하는 악기의 CopyRates를 요청합니다. 적어도 1 바. 그런 다음 th 시퀀스 의 틱 다운로드 및 생성 이 수행됩니다.

그 후 침착하게 틱을 요청

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas :

메시지 주셔서 감사합니다.
ArrayResize 코드는 빈 호출에 대한 보호 기능이 있으므로(요소 수에 변경 사항이 없는 경우) 함수 코드가 작동하지 않습니다.
요소 수가 실제로 변경되면 배열에 따라 ArrayResize 함수 중 하나 또는 일부가 작동합니다.

제공한 코드 덕분에 ArrayResize 부분 중 하나의 복잡성을 0으로 줄일 수 있었습니다. 이렇게 하면 개체 배열에 대한 함수의 속도가 빨라집니다.

좋은 오후입니다! 정말 감사합니다.
논리적으로 예약된 메모리가 있는 ArrayResize보다 느려야 하기 때문에 이전에 new 연산자 를 사용하지 않았습니다.
그러나 결과는 인상적이었습니다. 새로운 연산자를 통해 자체 제작한 배열이 더 빠릅니다.

MT5(빌드 2363):

 #define K 1000
#define M ( 1000 * K)

#define   SpeedTest(test_count,msg,EX)        { uint mss= GetTickCount (); ulong count=test_count; for ( ulong ii= 0 ;ii<count&&! _StopFlag ;ii++){EX;} \
                                               printf ( "%-60s: loops=%i ms=%u" ,msg,count, GetTickCount ()-mss);}
                                              
class A{
public :
   int data;
};


template < typename T>
void test1( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize all" ,
   {
      T class_array[];
       ArrayResize (class_array, array_size);
   }
   )
};

template < typename T>
void test2( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize one by one with reserved memory" ,
   {
      T class_array[];
       ArrayResize (class_array, 1 , array_size - 1 );
       for ( int i = 2 ; i <= array_size; i++){
         ArrayResize (class_array, i);
      }
   }
   )
};

template < typename T>
void test3( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize one by one with new operator" ,
   {
      T* class_array[];
       ArrayResize (class_array, array_size);
       for ( int i = 0 ; i < array_size; ++i){
         class_array[i] = new T();
      }
       for ( int i = 0 ; i < array_size; ++i){
         delete class_array[i];
      }
   }
   )
};


void OnStart ()
{
   const int test_count = 1 *K;
   const int array_size = 25 *K;  
  
   printf ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" );
   test1<A>(test_count, array_size);               // Avg time: release( 730) / debug( 830)
   test2<A>(test_count, array_size);               // Avg time: release(1540) / debug(1720)
   test3<A>(test_count, array_size);               // Avg time: release(1200) / debug(1470)
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
}
  
 
Slava :

CopyTicks는 테스터에서 데이터 다운로드를 시작하지 않습니다.

먼저 원하는 악기의 CopyRates를 요청합니다. 최소 1바. 그런 다음 th 시퀀스 의 틱 다운로드 및 생성 이 수행됩니다.

그 후 침착하게 틱을 요청

정말 감사합니다. 도움이 되었습니다. 근데 이거 문서에서 못찾았는데.. 아님 제가 못생겼나요? 거기에 대해 쓰는 것이 좋을 것입니다 :)
 
LittleBitTime :
정말 감사합니다. 도움이 되었습니다. 근데 이거 문서에서 못찾았는데.. 아님 제가 못생겼나요? 거기에 대해 쓰는 것이 좋을 것입니다 :)

CopyRates 에 따라 자동 다운로드를 수행하는 것이 좋습니다.

 

어제 프로필에서 "이전" 비활성 에이전트 목록을 정리했습니다.

하루 후 프로필로 이동하여 삭제된 항목이 에이전트 목록에서 복원된 것을 확인합니다.

또한 에이전트 생성 날짜 및 활동이 변경되었습니다.

cloud.mql5.com 에서 에이전트 통계를 본 후 목록이 복원된다는 가정(오류 가능성 있음)이 있습니다.