Чисто средствами MQL4 доступ к управлению кнопкой "Авто-Торговля" невозможен. Всё, что можно сделать - это выяснить её состояние опосредованно, воспользовавшись функцией IsExpertEnabled(). Функция возвращает true, если в клиентском терминале разрешен запуск экспертов (кнопка "Авто-Торговля" нажата), иначе возвращает false.
Однако, в нашем распоряжении есть замечательное средство - функции API из комплекта Windows. Благодаря им мы можем сымитировать клик по кнопке. Если надо включить кнопку, а она отключена, то "кликаем" по ней, если и так включена, то ничего не делаем. Аналогично для случая отключения: если включена - кликаем, иначе оставляем в покое.
Итак, состояние кнопки определяем при помощи IsExpertEnabled(), а чтобы "кликнуть" по ней, нужно до неё добраться.
Кнопка находится на панели инструментов окна МТ4. Программа наша выполняется на каком-то из подокон терминала, на котором расположен график. Нам надо получить системный дескриптор подокна с графиком, затем через него выйти на дескриптор МТ4, и уже потом добраться до дескриптора панели инструментов, на которой находится кнопка. И в завершении - послать команду "клика" на кнопку "Авто-Торговля".
Системный дескриптор активного окна графика можно получить функцией WindowHandle(Symbol(), Period()), остальное - функциями API библиотеки user32.dll. Поскольку окно МТ4 является родительским для активного окна графика, то его дескриптор получим функцией
- Код: выделить все
// Возвращает идентификатор hierarchyid, представляющий n-го предка данного элемента.
int GetAncestor(int hWnd, // Идентификатоp окна.
int gaFlags); // Уровень окна от текущего окна (1, 2, 3...).
Доступ к панели инструментов организовывается благодаря функции
- Код: выделить все
// Считывает описатель оpгана упpавления, содеpжащийся в указанном блоке диалога. Возвpащаемое значение: идентификатоp оpгана упpавления; 0 - если указанный оpган упpавления не существует.
int GetDlgItem(int hDlg, // Блок диалога, содеpжащий оpган упpавления.
int nIDDlgItem); // Идентификатоp оpгана упpавления.
А сам "клик" по кнопке выполним, направив соответствующую команду через функцию
- Код: выделить все
int SendMessageA(int hWnd, // Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
int Msg, // Тип сообщения.
int wParam, // Дополнительная инфоpмация о сообщении.
int& lParam[]); // Дополнительная инфоpмация о сообщении.
Итак, функция для управления кнопкой "Авто-Торговля" будет иметь примерно следующий вид:
- Код: выделить все
#define WM_COMMAND 0x0111
void ExpertEnabled(bool Switch) // TRUE - включить кнопку, FALSE - отключить кнопку.
{
int HandlWindow = WindowHandle(Symbol(), Period()); // Системный дескриптор окна.
int HandlMT4; // Системный дескриптор окна МТ4.
int HandlToolbar; // Системный дескриптор окна инструментов.
// Массвы.
int ArIntTemp[1]; // Временный массив.
//----
if (Switch == true) // Если требуется разрешить работу эксперта.
{
if (!IsExpertEnabled()) // Разрешаем работу экспертов, если она была запрещена.
{
HandlMT4 = GetAncestor(HandlWindow, 2);
HandlToolbar = GetDlgItem(HandlMT4, 0x63);
ArIntTemp[0] = HandlToolbar;
SendMessageA(HandlMT4, WM_COMMAND, 33020, ArIntTemp);
}
}
else // Если требуется запретить работу экспертов.
{
if (IsExpertEnabled()) // Разрешаем работу экспертов, если она была запрещена.
{
HandlMT4 = GetAncestor(HandlWindow, 2);
HandlToolbar = GetDlgItem(HandlMT4, 0x63);
ArIntTemp[0] = HandlToolbar;
SendMessageA(HandlMT4, WM_COMMAND, 33020, ArIntTemp);
}
}
}
А все необходимые функции импортируем из библиотеки user32.dll:
- Код: выделить все
#import "user32.dll"
int SendMessageA(int hWnd, // Окно, пpинимающее сообщение или $FFFF для посылки всем всплывающим окнам в системе.
int Msg, // Тип сообщения.
int wParam, // Дополнительная инфоpмация о сообщении.
int& lParam[]); // Дополнительная инфоpмация о сообщении.
// Возвращает идентификатор hierarchyid, представляющий n-го предка данного элемента.
int GetAncestor(int hWnd, // Идентификатоp окна.
int gaFlags); // Уровень окна от текущего окна (1, 2, 3...).
// Считывает описатель оpгана упpавления, содеpжащийся в указанном блоке диалога. Возвpащаемое значение: идентификатоp оpгана упpавления; 0 - если указанный оpган упpавления не существует.
int GetDlgItem(int hDlg, // Блок диалога, содеpжащий оpган упpавления.
int nIDDlgItem); // Идентификатоp оpгана упpавления.
#import
В приложении - скрипт для управления кнопкой. Параметр Enable отвечает за нажатие/отжатие кнопки "Авто-Торговля".