Чисто средствами 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 отвечает за нажатие/отжатие кнопки "Авто-Торговля".

 
 

 
				
					 
				
			
 На то он и форум, чтобы "влезать в дискуссию". Так что наоборот - очень хорошо, что есть замечания и предложения.
  На то он и форум, чтобы "влезать в дискуссию". Так что наоборот - очень хорошо, что есть замечания и предложения.