鼠标和键盘控制

在本节中,我们将了解一组特性,这些特性会影响图表如何捕获特定鼠标和键盘操作,这些操作在默认情况下被视为控制操作。特别是,MetaTrader 5 用户都很清楚,图表可以通过鼠标滚动,还可以调用上下文菜单来执行最常用的命令。MQL5 允许完全或部分禁用图表的这种行为。需要注意的是,这只能通过编程方式实现:终端用户界面中没有类似选项。

需要注意的是,唯一的例外是 CHART_DRAG_TRADE_LEVELS 选项(见下表):终端设置的 Charts选项卡中提供了一个下拉列表,用于控制是否允许通过鼠标拖动交易水平线。

该组的所有特性均为布尔类型(true表示允许,false 表示禁用),且它们包含在 ENUM_CHART_PROPERTY_INTEGER 枚举中。

标识符

说明

CHART_CONTEXT_MENU

通过按下鼠标右键启用/禁用对上下文菜单的访问。false值仅会禁用图表的上下文菜单,而图表上对象的上下文菜单仍可使用。默认值为 true

CHART_CROSSHAIR_TOOL

通过按下鼠标中键启用/禁用对十字准线工具的访问。默认值为 true

CHART_MOUSE_SCROLL

通过鼠标左键或滚轮滚动图表。当启用滚动时,这不仅适用于水平滚动,还适用于垂直滚动,但垂直滚动仅在设置固定比例时可用:即应用 CHART_SCALEFIX、CHART_SCALEFIX_11 或 CHART_SCALE_PT_PER_BAR 特性之一的情况下。默认值为 true

CHART_KEYBOARD_CONTROL

使用键盘管理图表的能力(通过 HomeEndPageUp/PageDown、+/-、上下箭头等按键)。设置为 false可禁用图表的滚动和缩放功能,但与此同时,仍可在 OnChartEvent中接收这些按键的击键事件。默认值为 true

CHART_QUICK_NAVIGATION

在图表中启用快速导航栏,当你双击鼠标或按下 SpaceInput 键时,该导航栏会自动出现在时间轴左侧区域。使用该导航栏,你可以快速更改交易品种、时间范围或第一个可见柱线的日期。默认情况下,该特性设置为 true,即启用快速导航功能。

CHART_DRAG_TRADE_LEVELS

允许通过鼠标在图表上拖动交易水平线的权限。默认情况下拖动模式处于启用状态 (true)。

在测试脚本ChartInputControl.mq5中,我们将为上述所有特性设置监控功能,并额外提供输入变量,供用户设置任意值。我们的脚本会在启动时保存设置的备份副本,因此当脚本结束时,所有已更改的特性都将恢复原状。

#property script_show_inputs
   
#include <MQL5Book/ChartModeMonitor.mqh>
   
input bool ContextMenu = true// CHART_CONTEXT_MENU
input bool CrossHairTool = true// CHART_CROSSHAIR_TOOL
input bool MouseScroll = true// CHART_MOUSE_SCROLL
input bool KeyboardControl = true// CHART_KEYBOARD_CONTROL
input bool QuickNavigation = true// CHART_QUICK_NAVIGATION
input bool DragTradeLevels = true// CHART_DRAG_TRADE_LEVELS
   
void OnStart()
{
   const bool Inputs[] =
   {
      ContextMenuCrossHairToolMouseScroll,
      KeyboardControlQuickNavigationDragTradeLevels
   };
   const int flags[] =
   {
      CHART_CONTEXT_MENUCHART_CROSSHAIR_TOOLCHART_MOUSE_SCROLL,
      CHART_KEYBOARD_CONTROLCHART_QUICK_NAVIGATIONCHART_DRAG_TRADE_LEVELS
   };
   ChartModeMonitor m(flags);
   Print("Initial state:");
   m.print();
   m.backup();
   
   for(int i = 0i < ArraySize(flags); ++i)
   {
      ChartSetInteger(0, (ENUM_CHART_PROPERTY_INTEGER)flags[i], Inputs[i]);
   }
   
   while(!IsStopped())
   {
      m.snapshot();
      Sleep(500);
   }
   m.restore();
}

例如,当我们运行脚本时,可以将上下文菜单、十字准线工具、鼠标和键盘控制的权限重置为false。结果将如下日志所示。

Initial state:
    [key] [value]
[0]    50       1
[1]    49       1
[2]    42       1
[3]    47       1
[4]    45       1
[5]    43       1
CHART_CONTEXT_MENU 1 -> 0
CHART_CROSSHAIR_TOOL 1 -> 0
CHART_MOUSE_SCROLL 1 -> 0
CHART_KEYBOARD_CONTROL 1 -> 0

在这种情况下,你将无法通过鼠标或键盘移动图表,甚至无法调用上下文菜单。因此,为了恢复图表的性能,你需要将在图表上运行相同或另一个脚本(请记住,单个图表只能运行一个脚本,当应用新脚本时,之前的脚本将被卸载)。只需拖放脚本的新实例,但无需运行(在用于提供输入变量的对话框中点击 Cancel即可)。