Новая версия платформы MetaTrader 5 build 2650: Фоновая загрузка графиков и улучшения в профилировщике MQL5-кода - страница 18

 
Vladimir Pastushak:
2656 билд, после профилированя на реальных данных при скролинге отработавших функций Метаедитор зависает наглухо...

2660 Метаедитор зависает после профилирования

 
Fab:

Уважаемая служба поддержки, Я использую сборку 2650 на Windows10, установленном на 64-битной (x64) Intel. Это странная вещь, которую я заметил. Создаю скрипт для записи файлов через Win32 API:

Скрипт работает отлично, и в указанном каталоге я нахожу файл «TestWinFiles.txt», который содержит контент «Hallo world!». Сейчас делаю НЕМНОГО МОДИФИКАЦИЮ:

Я просто вставляю инструкцию printf. Прикрепив этот скрипт к графику, во вкладке Terminal Expert я получаю такой результат:

Что не так с моим кодом? Почему printf так кардинально меняет поведение скрипта? Почему у меня вылетает память? Что-то не так с командами printf и WIN32 API? это, возможно, небольшая ошибка? Я был бы признателен за возможность использовать printf в библиотеках, содержащих импорт Win32 API. Огромное спасибо заранее.

Самое первое - тип FileHandle должен быть long, 64-битным, так как Вы работаете в 64-битной системе

#import "kernel32.dll"
   long CreateFileW(string Filename, uint AccessMode, int ShareMode, int PassAsZero, int CreationMode, int FlagsAndAttributes, int AlsoPassAsZero);
   int  WriteFile(long FileHandle, uchar & Buffer[], int BufferLength, int & BytesWritten[], int PassAsZero);
   int  CloseHandle(long FileHandle);
#import
 
Vladimir Pastushak :

2660 Metaeditor trava após criação de perfil

https://www.mql5.com/en/forum/353809#comment_18867237

Bug On "Profiler", it is not working
Bug On "Profiler", it is not working
  • 2020.10.19
  • www.mql5.com
Hi, When I try load my EA with Profiler it closes the MT5 as you can see on video, maybe some bug...
 

Уважаемые разработчики,

Почему ты меня игнорируешь? Есть причина?

Извините за мой язык, я использую переводчик.


Я столкнулся с ошибкой, это должно быть для вас приоритетом, верно?

Здесь у нас есть ошибка с объектами мини-диаграммы: при создании мини-диаграммы в несфокусированном окне функции ChartSymbol() и ChartPeriod() возвращают неверные значения, пока мы не сфокусируем окно.

То же самое происходит, если мы закрываем и открываем терминал, а график с объектом minichart не сфокусирован.


Эта ошибка приводит к тому, что ChartIndicatorAdd() всегда терпит неудачу (возвращает false), пока мы не сфокусируем диаграмму!

Пожалуйста, исправьте эту ошибку!


Вот простой код советника для воспроизведения проблемы (проверьте журнал экспертов):


int OnInit() { EventSetTimer(4);  return(INIT_SUCCEEDED);}
void OnDeinit(const int reason){ EventKillTimer(); }
void OnTimer(){
  checkMiniChart();  
}




string MC_name="Minichart";   //minichart name
long MC_ID=-1;                //minichart ID
long chartID=-1;              //Chart ID
bool created = false;         //check if chart and minichart created or not




void checkMiniChart(){
   if(!created){
      createMinichart();
   }else{
      Print("["+chartID+"] Minichart: "
                +" obj symbol: "+(ObjectGetString(chartID,MC_name,OBJPROP_SYMBOL))
                +" - obj period: "+(ObjectGetInteger(chartID,MC_name,OBJPROP_PERIOD))
                +" - chart symbol: "+(ChartSymbol(MC_ID))
                +" - chart period: "+(ChartPeriod(MC_ID))
      );
      
      if(ObjectGetString(chartID,MC_name,OBJPROP_SYMBOL)!=ChartSymbol(MC_ID))
         Print("Wrong symbol in Minichart object! Focus the chart to get correct symbol...");
      if(ObjectGetInteger(chartID,MC_name,OBJPROP_PERIOD)!=ChartPeriod(MC_ID))
         Print("Wrong period in Minichart object! Focus the chart to get correct period...");
   } 
}





void createMinichart(){
   string chart_symbol = "EURUSD";
   ENUM_TIMEFRAMES chart_period = PERIOD_D1;
   string minchart_symbol = "GBPUSD";
   ENUM_TIMEFRAMES minchart_period = PERIOD_H4;

   //open a chart
   chartID = ChartOpen(chart_symbol,chart_period);
   
   //came back to current EA chart
   ChartSetInteger(0,CHART_BRING_TO_TOP,true);
   ChartRedraw(0);
   Sleep(2000); //wait FOCUS on current EA chart, new chart loose FOCUS!
   

   if(chartID!=0){

      //create mini chart   
      if( ObjectMiniChartCreate(chartID, MC_name, minchart_symbol, minchart_period) ){

         MC_ID=ObjectGetInteger(chartID,MC_name,OBJPROP_CHART_ID);

         ChartRedraw(MC_ID);   
         ChartRedraw(chartID);
         
         created=true;
      }
   }
}






bool ObjectMiniChartCreate(const long             chart_ID=0,               // chart's ID
                          const string            name="Minichart",         // object name
                          const string            symbol=NULL,              // symbol
                          const ENUM_TIMEFRAMES   period=0,                 // period
                          const int               x=0,                      // X coordinate
                          const int               y=0,                      // Y coordinate
                          const int               width=400,                // width
                          const int               height=300,               // height
                          const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // anchoring corner
                          const int               sub_window=0,             // subwindow index                          
                          const int               scale=2,                  // scale
                          const bool              date_scale=false,          // time scale display
                          const bool              price_scale=false,         // price scale display
                          const color             clr=clrRed,               // border color when highlighted
                          const ENUM_LINE_STYLE   style=STYLE_SOLID,        // line style when highlighted
                          const int               point_width=1,            // move point size
                          const bool              back=false,               // in the background
                          const bool              selection=false,          // highlight to move
                          const bool              hidden=false,              // hidden in the object list
                          const long              selectable=true,          //selectable                          
                          const long              z_order=0)                // priority for mouse click
  {
//--- reset the error value
   ResetLastError();
//--- create Chart object
   if(!ObjectCreate(chart_ID,name,OBJ_CHART,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": failed to create \"Chart\" object! Error code = ",GetLastError());
      return(false);
     }
//--- set object coordinates
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- set object size
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- set the chart's corner, relative to which point coordinates are defined
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- set the symbol
   ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol);
//--- set the period
   ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period);
//--- set the scale
   ObjectSetInteger(chart_ID,name,OBJPROP_CHART_SCALE,scale);
//--- display (true) or hide (false) the time scale
   ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,date_scale);
//--- display (true) or hide (false) the price scale
   ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,price_scale);
//--- set the border color when object highlighting mode is enabled
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set the border line style when object highlighting mode is enabled
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set a size of the anchor point for moving an object
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of moving the label by mouse
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }
 

Давно назрел вопрос, на форуме попытался найти ответ, но не нашел.

Почему так: имеется процессор E2650 (8/16) и 16Гб ОЗУ, при запуске оптимизации из MT5 доступно к использованию 16 агентов, все замечательно.

Но если попытаться из данного сервера сделать локальных агентов с помощью утилиты тестера стратегий - можно создать только 8 агентов? Это баг или фича?

Агенты нужны только для меня, я не собираюсь продавать их мощности.

Пробовал и удалить MT5, оставив только утилиту тестера - ничего не поменялось.

Прилагаю картинку для наглядности.


З.Ы. Сразу хочу ответить на комментарий, что гипертрединг в данном случае не даст прироста и скорости будут одинаковы.

Это не так, проверено, скорость генетики на 16 потоках почти в 1.5 раза быстрее, чем на чистых 8 ядрах тестера стратегий.

 
Maksim Emeliashin:

Давно назрел вопрос, на форуме попытался найти ответ, но не нашел.

Почему так: имеется процессор E2650 (8/16) и 16Гб ОЗУ, при запуске оптимизации из MT5 доступно к использованию 16 агентов, все замечательно.

Но если попытаться из данного сервера сделать локальных агентов с помощью утилиты тестера стратегий - можно создать только 8 агентов? Это баг или фича?

Агенты нужны только для меня, я не собираюсь продавать их мощности.

Пробовал и удалить MT5, оставив только утилиту тестера - ничего не поменялось.

Прилагаю картинку для наглядности.


З.Ы. Сразу хочу ответить на комментарий, что гипертрединг в данном случае не даст прироста и скорости будут одинаковы.

Это не так, проверено, скорость генетики на 16 потоках почти в 1.5 раза быстрее, чем на чистых 8 ядрах тестера стратегий.

Физических ядер сколько? Не логических.

 
Maksim Emeliashin:

Давно назрел вопрос, на форуме попытался найти ответ, но не нашел.

Почему так: имеется процессор E2650 (8/16) и 16Гб ОЗУ, при запуске оптимизации из MT5 доступно к использованию 16 агентов, все замечательно.

Но если попытаться из данного сервера сделать локальных агентов с помощью утилиты тестера стратегий - можно создать только 8 агентов? Это баг или фича?

Агенты нужны только для меня, я не собираюсь продавать их мощности.

Пробовал и удалить MT5, оставив только утилиту тестера - ничего не поменялось.

Прилагаю картинку для наглядности.


З.Ы. Сразу хочу ответить на комментарий, что гипертрединг в данном случае не даст прироста и скорости будут одинаковы.

Это не так, проверено, скорость генетики на 16 потоках почти в 1.5 раза быстрее, чем на чистых 8 ядрах тестера стратегий.

Просто подумайте об приоритетах MQ - первый и главный приоритет для компании - заработок денег, а с локальных агентов их не заработать.

Раньше можно было продавать патоки, потом это дело пофиксили.

Эффективность потоков зависит от задачи и фактически кода, и согласен что результаты могут быть разными.

Видимо, тяжело обеспечить расчет обработанной вычислительной информации по факту, поэтому тарификация идет исходя из коэффициентов, получаемых периодическими замерами.

На мой взгляд, конечно радикально можно сделать, что если делаешь агентов на все патоки, то получаешь запрет на торговлю своими ресурсами в клауде.

 
Artyom Trishkin:

Физических ядер сколько? Не логических.

Физических 8, я написал (8/16) 8 - физических, 16 логических. В MT5 все 16 доступны к использованию и к оптимизации, а в утилите для создания локальных агентов доступно 8 (на картинке это видно).

В этом и был вопрос, это баг или фича? Зачем зарезать в тестере, который создает службы 8 логических ядер, которые доступны в том же терминале? Я же их не собираюсь продавать, они нужны только мне.

 
Aleksey Vyazmikin:

Просто подумайте об приоритетах MQ - первый и главный приоритет для компании - заработок денег, а с локальных агентов их не заработать.

Раньше можно было продавать патоки, потом это дело пофиксили.

Эффективность потоков зависит от задачи и фактически кода, и согласен что результаты могут быть разными.

Видимо, тяжело обеспечить расчет обработанной вычислительной информации по факту, поэтому тарификация идет исходя из коэффициентов, получаемых периодическими замерами.

На мой взгляд, конечно радикально можно сделать, что если делаешь агентов на все патоки, то получаешь запрет на торговлю своими ресурсами в клауде.

Печально, если это действительно так. Получается мне ограничивают использование своих же логических ядрер, для самого же себя.
 
Да, это фича, MQ уже отвечали.
Но правильнее было бы позволять использовать все агенты, если к ним обращаются из локальной сети.
Мои замеры тоже подтверждают, что на 4 ядрах 8 потоков примерно в 1.5 раза производительнее 4-х. Главное, чтобы памяти хватало.
Причина обращения: