错误、漏洞、问题 - 页 2522

 

我在向WinAPI寻求帮助。需要能在MT5中做这两个动作。

调用所示菜单,选择保存报告。


调用所显示的菜单,选择加载一个设定的文件。


在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对象中实现的,你需要上到根终端.exe窗口,然后通过窗口下到突出显示的 "SysListView32 "并使用其句柄。
可能有一个更简单的方法,试试吧......


 
Sergey Dzyublik:

很可能你用错了手柄。
图表是在MDIClient对象中实现的,你需要上到根终端.exe窗口,然后通过窗口下到突出显示的 "SysListView32 "并使用其句柄。
可能有一个更简单的方法,试试吧...

到了Handle,没有任何帮助。

#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);
}


可能是一个不同的信息。

 

一个长期困扰我的问题是,如何正确激励思想过程

如果(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 终端 C:\PROGI\MT-5


感觉在终端加载了图表对象时,这种情况更经常发生。

例如:交易、日历事件

发生故障后的指示器

一段时间后,指示灯停止正常工作。

- M1图。

- 任何指标(在图中为标准移动平均线)。

- 在三台机器上测试。

如果你改变了计划期,一切都会落到实处。

对我来说,这是至关重要的,因为我在我的EA中使用图表指标的信号。

 
Gudgeon:

你好,请你告诉我为什么终端会有这样的行为?


一段时间后,指标停止正常工作。

- M1图。

- 任何指标(图片中显示的是标准移动平均线)。

- 我在三台机器上检查了它。

如果你改变图表的周期,一切都会归位。

对我来说,这很关键,因为我在我的专家顾问中使用图表指标的信号。

指定数据。

从 "日志 "标签中复制三行(选择三行 -> 鼠标右键 -> 复制)。


并将其粘贴到你的信息中。它应该看起来像这样。

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-3120 M  @ 2.50 GHz, 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 终端 C:\PROGI\MT-5


当终端加载图形对象时,这种情况似乎更经常发生。

例如:交易、日历事件和小的时间框架
 
fxsaber:

到了Handle,没有任何帮助。
可能是一个不同的信息。

用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);
}