Ошибки, баги, вопросы - страница 2522

 

Прошу помощи по WinAPI. Нужно уметь делать эти два действия в MT5.

Вызвать показанное меню и выбрать сохранение отчета.


Вызвать показанное меню и выбрать загрузку set-файла.


В MT4 с подобными вещами очень просто. В MT5 никак не выходит.

Т.е. нужно только вызвать меню и выбрать в нем соответсвующий пункт. Но не выходит.


ЗЫ Похоже, это нужно

 

Если записать Message log для вызова контекстного меню по задаче №2, то можно получить следующий результат: 


Пробуйте програмно вызвать это меню через SendMessage WinApi.

 
Sergey Dzyublik:

Если записать Message log для вызова контекстного меню по задаче №2, то можно получить следующий результат: 

Пробуйте програмно вызвать это меню через SendMessage WinApi.

Не получилось

#include <WinAPI\winuser.mqh>

#define GA_ROOT           0x00000002

#define GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {}; // Пробовал углубляться по дереву окон - не помогает.
  GET_HANDLE
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}
 
fxsaber:

Не получилось

Скорее всего не тот хендл используете.
Чарты реализованы в рамках объекта MDIClient, вам же нужно подняться к root окну terminal.exe, а затем спуститься по окнам к выделенному "SysListView32" и использовать его хендл.
Может можно как-то и проще, пробуйте...


 
Sergey Dzyublik:

Скорее всего не тот хендл используете.
Чарты реализованы в рамках объекта MDIClient, вам же нужно подняться к root окну terminal.exe, а затем спуститься по окнам к выделенному "SysListView32" и использовать его хендл.
Может можно как-то и проще, пробуйте...

Добрался до хендла, не помогло.

#include <WinAPI\winuser.mqh>

#define GA_ROOT           0x00000002

#define GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {0xE81E, 0x804E, 0x28EF, 0x28FE};
  GET_HANDLE
  
  Print(Handle); // Распечатал хендл.
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}


Скорее всего, Message другой.

 

давно мучает вопрос, как правильно мотивировать ход мысли

if (value[0] > value[1]

или наоборот

сперва нулевой и затем следующий?

 

Здравствуйте! Подскажите пожалуйста почему так ведет себя терминал на VMware x64?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Gudgeon, 2019.07.31 12:16

2019.07.31 08:20:46.595    Terminal    MetaTrader 5 x64 build 2085 started (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596    Terminal    Windows 10 (build 14393) on VMware x64, IE 11, UAC, Intel Core i5-3450  @ 3.10GHz, Memory: 2728 / 4095 Mb, Disk: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596    Terminal    C:\PROGI\MT-5


По ощущениям чаще это происходит при нагруженном графическими объектами терминале.

например: торговые операции, события календаря

Индикатор после сбоя

После некоторого времени индикатор перестает правильно работать:

- график М1;

- индикатор любой (на рисунке стандартный Moving Average);

- проверял на трех машинах.

Если поменять период графика - все становиться на место.

Для меня это критично, так как использую в советнике сигналы от графических индикаторов.

 
Gudgeon:

Здравствуйте! Подскажите пожалуйста почему так ведет себя терминал?


После некоторого времени индикатор перестает правильно работать:

- график М1;

- индикатор любой (на рисунке стандартный Moving Average);

- проверял на трех машинах.

Если поменять период графика - все становиться на место.

Для меня это критично, так как использую в советнике сигналы от графических индикаторов.

Укажите такие данные:

скопируйте из вкладки "Журнал" три строчки (выделить три строки -> правый клик мышки -> Копировать)


и вставьте в сообщение. Должно получится вроде этого:

2019.07.31 11:53:10.681 MetaTrader 5 x64 build 2093 started (MetaQuotes Software Corp.)
2019.07.31 11:53:10.685 Windows 10 (build 18362) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 3188 / 8077 Mb, Disk: 99 / 415 Gb, GMT+2
2019.07.31 11:53:10.685 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
 

2019.07.31 08:20:46.595    Terminal    MetaTrader 5 x64 build 2085 started (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596    Terminal    Windows 10 (build 14393) on VMware x64, IE 11, UAC, Intel Core i5-3450  @ 3.10GHz, Memory: 2728 / 4095 Mb, Disk: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596    Terminal    C:\PROGI\MT-5


По ощущениям чаще это происходит при нагруженном графическими объектами терминале.

например: торговые операции, события календаря и на мелких таймфреймах
 
fxsaber:

Добрался до хендла, не помогло.
Скорее всего, Message другой.

Удалось с помощью WM_CONTEXTMENU.
Чуть подправил код, так проще дебажить, и можно повторно использовать:

#include <WinAPI\winuser.mqh>

#define GA_ROOT            0x00000002
#define WM_CONTEXTMENU     0x007B


#define PRINT(x) ; Print(#x, ":", string(x))
#define PRINT64(x) ; printf("%s%s%#.08x", #x, ":", x)


long GetHandle(long handle, int &controls[]){
   long next_handle = handle;                                                                        
   for (int i = 0; i < ArraySize(controls); i++){
      next_handle = user32::GetDlgItem(next_handle, controls[i]);
      PRINT64(next_handle);
   }           
   return next_handle;                
}
  

void OnStart(){
  long RootHandle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);
  PRINT64(RootHandle);  
  
  int controls[] = {0xE81E, 0x804E, 0x28EF, 0x28FE}; 
  long handle = GetHandle(RootHandle, controls);
  PRINT64(handle);
  
  
  //PRINT(user32::SendMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT(user32::PostMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT("Sleep");

  Sleep(10 * 1000);
}
Причина обращения: