Бета-версия платформы MetaTrader 5 build 1910: Свободное перетаскивание графиков и .Net библиотеки в MQL5 - страница 9

 

Хочу дожать вопрос по скорости выполнения TerminalInfoInteger(TERMINAL_MEMORY_USED).

Грубое сравнение скорости с WinAPI:

#include <WinAPI\winapi.mqh>
//---
#define PROCESS_QUERY_INFORMATION          (0x0400)
#define PROCESS_VM_READ                    (0x0010) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct PROCESS_MEMORY_COUNTERS
  {
   uint              cb;
   uint              PageFaultCount;
   long              PeakWorkingSetSize;
   long              WorkingSetSize;
   long              QuotaPeakPagedPoolUsage;
   long              QuotaPagedPoolUsage;
   long              QuotaPeakNonPagedPoolUsage;
   long              QuotaNonPagedPoolUsage;
   long              PagefileUsage;
   long              PeakPagefileUsage;
  };

#import "psapi.dll" // for Windows 7 x64
int GetProcessMemoryInfo(HANDLE Process,PROCESS_MEMORY_COUNTERS &ppsmemCounters,uint cb);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

//--- native   
   ulong gtc= GetMicrosecondCount();
   for(int i=0;i<100;i++)
     {
      int mem=TerminalInfoInteger(TERMINAL_MEMORY_USED);
      if(i==0)
         Print("MEMORY_USED: ",mem);
     }
   printf("Native: %.02f us",(GetMicrosecondCount()-gtc)/100.0);

//--- WinAPI
   gtc=GetMicrosecondCount();
   for(int i=0;i<100;i++)
     {
      //--- get main window handle
      long hwnd=ChartGetInteger(0,CHART_WINDOW_HANDLE);
      hwnd=GetAncestor(hwnd,2);//GA_ROOT=2
      uint processId=0;

      //--- get process ID by window handle
      uint res=GetWindowThreadProcessId(hwnd,processId);
      if(res==0)
        {
         printf("error: %d",kernel32::GetLastError());
         return;
        }

      //--- get process HANDLE by ID
      HANDLE processHandle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,processId);
      if(processHandle==0)
        {
         printf("error: %d",kernel32::GetLastError());
         return;
        }

      //--- get process memory info
      PROCESS_MEMORY_COUNTERS memCounters={};
      memCounters.cb=sizeof(memCounters);
      res=GetProcessMemoryInfo(processHandle,memCounters,sizeof(memCounters));
      if(res==0)
        {
         printf("error: %d",kernel32::GetLastError());
         return;
        }
      else
        {
         if(i==0)
            printf("MEMORY_USED: %d",memCounters.PagefileUsage/1024/1024);
        }

      //---
      CloseHandle(processHandle);
     }
//---
   printf("WinAPI: %.02f us",(GetMicrosecondCount()-gtc)/100.0);
  }

2018.10.16 10:45:21.666    memory_used (EURUSD,H1)    MEMORY_USED: 959
2018.10.16 10:45:23.732    memory_used (EURUSD,H1)    Native: 20883.52 us

2018.10.16 10:45:23.733    memory_used (EURUSD,H1)    MEMORY_USED: 694
2018.10.16 10:45:23.736    memory_used (EURUSD,H1)    WinAPI: 35.07 us

 
Andrey Voytenko:

Хочу дожать вопрос по скорости выполнения TerminalInfoInteger(TERMINAL_MEMORY_USED).

Грубое сравнение скорости с WinAPI:

2018.10.16 10:45:21.666    memory_used (EURUSD,H1)    MEMORY_USED: 959
2018.10.16 10:45:23.732    memory_used (EURUSD,H1)    Native: 20883.52 us

2018.10.16 10:45:23.733    memory_used (EURUSD,H1)    MEMORY_USED: 694
2018.10.16 10:45:23.736    memory_used (EURUSD,H1)    WinAPI: 35.07 us

Тут по другому не будет.

Нам приходится проходиться по внутренним базам и кешам для сборка рилтаймовой статистики. Так что не надо эту функцию часто вызывать.

 

Обратите пожалуйста внимание на это баг: no history data



Файлы для воспроизведения ошибки здесь https://www.mql5.com/ru/forum/1111/page2304#comment_8930335

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.10.05
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
threat:
На открепленном графике при сохранении изображения (активный график как есть) внизу png остается черная полоса. build 1911
Приложите пожалуйста скриншот.
 
Andrey Voytenko:

Обратите пожалуйста внимание на это баг: no history data



Файлы для воспроизведения ошибки здесь https://www.mql5.com/ru/forum/1111/page2304#comment_8930335

А если выставить валюту депозита USD, то тоже будет no history data?
 
Slava:
А если выставить валюту депозита USD, то тоже будет no history data?

Перепробовал разные настройки в тестере, поведение не меняется.

 
Andrey Voytenko:

Перепробовал разные настройки в тестере, поведение не меняется.

Полный лог тестерного агента покажите пожалуйста
 

Проблема с ExpertRemove в 1911 не воспроизводится, Спасибо.

Остался вопрос, почему пустые Remove-проходы длятся долго и столь разнятся по времени выполнения?

Core 5  pass 56 tested with error "expert removed itself in global initialization function" in 0:00:00.109
Core 5  pass 57 tested with error "expert removed itself in global initialization function" in 0:00:00.437
 
Slava:
Полный лог тестерного агента покажите пожалуйста
После нажатия на кнопку 'Start' пишется только одна строка:

2018.10.16 16:18:38.717    Tester    EURUSD_test: no history data from 1970.01.01 00:00 to 2018.10.15 00:00

 
fxsaber:

Проблема с ExpertRemove в 1911 не воспроизводится, Спасибо.

Остался вопрос, почему пустые Remove-проходы длятся долго и столь разнятся по времени выполнения?

После ExpertRemove эксперт должен быть снова загружен для выполнения. Это не означает синхронизацию с клиентским терминалом, а всего лишь распаковка уже имеющегося в тестерном агенте эксперта в нативный код.