MQL4: Управление компьютером из советника

Иногда бывает необходимо программно нажать кнопку в стороннем приложении, считать текст с определенного компонента, запустить другой терминал, любую другую программу, открыть текстовый файл, выключить компьютер в определенное время, произвести еще какие-либо операции. Здесь нам поможет функция WinAPI — ShellExecute, которая находится в библиотеке shell32.dll и библиотека WinUser32.mqh. Как можно автоматизировать весь этот процесс — узнаем из нашего нового урока по программированию форекс роботов. Тема необычная, сильно расширит ваши навыки как программиста.

Более подробную информацию о функции ShellExecute вы можете получить в справке MSDN. Там же можно получить подробную информацию обо всех функциях, доступных из библиотеки WinUser32.mqh. Я же приведу краткое описание каждой из них:

  • ShellExecute — выполняет операцию с указанным файлом;
  • SendMessage — Отправляет указанное сообщение окну или окнам, ожидает ответа;
  • SendNotifyMessage – то же самое, но не ждет ответа;
  • PostMessage – помещает сообщение в поток, не дожидаясь ответа;
  • keybd_event – синтезирует нажатие заданной клавиши на клавиатуре;
  • mouse_event — синтезирует движение мыши и нажатия кнопок;
  • FindWindow — извлекает дескриптор окна верхнего уровня;
  • SetWindowText – помещает текст в название окна;
  • GetWindowText – считывает текст из названия окна;
  • GetWindowTextLength – считывает количество символов в названии окна;
  • GetWindow — извлекает дескриптор окна, которое имеет отношение к указанному окну;
  • GetParent — извлекает дескриптор указанного или родительского окна;
  • UpdateWindow – обновляет окно программы;
  • EnableWindow — включает или отключает ввод с клавиатуры и мыши в указанное окно или элемент управления;
  • DestroyWindow — деактивирует окно или убирает с него фокус клавиатуры;
  • ShowWindow — устанавливает состояние показа указанного окна;
  • SetActiveWindow — активирует окно;
  • AnimateWindow — позволяет создавать специальные эффекты при отображении или скрытии окон;
  • FlashWindow – заставляет мигнуть указанное окно один раз;
  • CloseWindow — минимизирует (но не закрывает) указанное окно;
  • MoveWindow — изменяет положение и размеры указанного окна;
  • SetWindowPos — изменяет размер и положение дочернего, всплывающего окна или окна верхнего уровня;
  • IsWindowVisible — определяет состояние видимости указанного окна;
  • IsIconic — определяет, является ли указанное окно свернутым;
  • IsZoomed — определяет, развернуто ли окно;
  • SetFocus — устанавливает фокус клавиатуры на указанное окно;
  • GetFocus — извлекает дескриптор окна, которое имеет фокус клавиатуры;
  • GetActiveWindow — получает дескриптор активного окна;
  • IsWindowEnabled — определяет, включено ли указанное окно для ввода с клавиатуры и мыши;
  • MessageBox — отображает модальное диалоговое окно, которое содержит системный значок, набор кнопок и краткое сообщение для конкретного приложения, такое, как информация о состоянии или об ошибке;
  • MessageBeep — воспроизводит звук с помощью системного динамика;
  • GetSystemMetrics — извлекает указанную метрику системы или параметр конфигурации системы;
  • ExitWindows — выход из системы интерактивного пользователя, выключение системы или выключение и перезагрузка системы;
  • SwapMouseButton — меняет или восстанавливает значение левой и правой кнопок мыши.

Что мы будем сегодня делать?

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

  • выключение или перезагрузка компьютера;
  • запуск другой программы из терминала (например, google chrome);
  • замена названия окна программы.

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

Запуск приложения

Первое, что нужно сделать – объявить функцию ShellExecuteW:

//—- импорт функции из внешней DLL
#import «shell32.dll»
int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import

Затем в методе onStart() запустим нужную программу:

ShellExecuteW(NULL,NULL,»C:Program Files (x86)GoogleChromeApplicationchrome.exe»,NULL,NULL,1);

Бросим скрипт на любой график и у нас откроется указанная программа.
Теперь включим в наш скрипт библиотеку терминала WinUser32.mqh:

#include <WinUser32.mqh>

Теперь нам нужно найти хэндл окна запущенной программы. Это можно осуществить с помощью функции WinApi — FindWindowW.
В библиотеке терминала функция описана следующим образом:

int FindWindowW(string lpClassName,string lpWindowName);

Это означает, что в параметр string lpClassName необходимо ввести имя класса нашего приложения, а вместо параметра string lpWindowName имя окна программы — «Новая вкладка». Имя класса приложения можно узнать с помощью таких утилит как: Spy++, WinSight, WinInspector и другие. Скачаем и установим программу Spy++.

Утилита очень проста в использовании. Достаточно запустить программу, нажать кнопку с изображением бинокля и перетащить прицел на нужное нам окно, и мы сразу увидим его имя, класс и прочую информацию. В функции FindWindowW можно указывать и имя класса, и имя окна (или по отдельности). Нам достаточно будет указать только имя окна:

int handle=FindWindowW(NULL,» Новая вкладка — Google Chrome»);

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

Добавим в наш код еще одну простую функцию SetWindowTextW. Она изменит текст окна на любой другой:

SetWindowTextW(handle,»Мой Chromчик»);

Для выключения компьютера найдем на диске программу shutdown.exe. И так же, как и в предыдущем случае, пропишем в функции адрес программы с необходимыми нам параметрами:

ShellExecuteW(NULL,NULL,»C:WindowsSystem32shutdown.exe»,»-s -t 00″,NULL,1);

Чтобы выключить компьютер, введите следующую строку:

shutdown.exe -s -t 00

Чтобы перезагрузить компьютер, введите следующую строку:

shutdown.exe -r -t 00

Чтобы посмотреть параметры для различных версий Windows — пройдите по этой ссылке.

Заключение

В библиотеке WinUser32.mqh вы сможете также найти и много других интересных функций, которые позволят вам управлять сторонней программой прямо из советника, написанного на MQL4. Полный список функций WinApi вы можете найти на сайте MSDN.

Таким образом, вы можете полноценно управлять вашим компьютером из mql скрипта, автоматизировать все ваши действия по подготовке к торговле: открывать журналы сделок, новостные сайты при открытии терминала и так далее.

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

Тема на форуме

С уважением, Дмитрий аkа Silentspec
TradeLikeaPro.ru

Уроки по MQL , , , ,