Управление мышью и клавиатурой

В данном разделе мы познакомимся с группой свойств, которые влияют на перехват графиком некоторых манипуляций с мышью и клавиатурой, которые расцениваются по умолчанию как управляющие действия. В частности, пользователи MetaTrader 5 хорошо знают, что график можно прокручивать мышью, а для выполнения наиболее востребованных команд можно вызвать контекстное меню. MQL5 позволяет отключить такое поведение графика полностью или частично. Важно отметить, что сделать это можно только программно: аналогичных опций в пользовательском интерфейсе терминала нет.

Исключение составляет лишь опция CHART_DRAG_TRADE_LEVELS (см. в таблице ниже): для неё в настройках терминала, на закладке Графики имеется выпадающий список, управляющий разрешением перетаскивать торговые уровни мышью.

Все свойства данной группы имеют логический тип (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

Разрешение на управление графиком с клавиатуры (кнопками Home, End, PageUp/PageDown, +/-, стрелки вверх/вниз и т.д.). Установка в значение false позволяет отключить прокрутку и масштабирование графика, но при этом сохраняется возможность получать события нажатия данных клавиш в OnChartEvent. Значение по умолчанию true.

CHART_QUICK_NAVIGATION

Разрешение на работу в графике строки быстрой навигации, которая автоматически появляется в левом углу шкалы времени при двойном клике мышки или нажатии клавиш Пробел или Ввод. Таким образом можно быстро сменить символ, таймфрейм или дату первого видимого бара. По умолчанию свойство равно 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

При этом вы не сможете двигать график ни мышью, ни клавиатурой, и даже вызвать контекстное меню. Поэтому для того, чтобы восстановить его работоспособность, придется набросить на график этот же или другой скрипт (напомним, что скрипт на графике может быть только один, и при нанесении нового происходит выгрузка предыдущего;). Новый экземпляр скрипта достаточно набросить, но не запускать (нажать Отмена в диалоге ввода входных переменных).