Программное управление кнопкой "Авто-Торговля"

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Программное управление кнопкой "Авто-Торговля"

Сообщение Kalkin » 07 сен 2016, 14:29

Кнопка "Авто-Торговля" разрешает советникам и скриптам выполнять торговые операции. Имея такой общий выключатель, неплохо было бы автоматизировать его управление. Например, можно написать отдельный советник, который бы в зависимости от времени суток включал/выключал кнопку. Или скрипт, который дожидается отсутствия позиций и выключает кнопку, чтобы работающие советники не смогли установить новую позицию. Мало ли - примеров использования можно придумать массу.

Чисто средствами 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 отвечает за нажатие/отжатие кнопки "Авто-Торговля".
Вложения
KS_AutoTradeButton.mq4
(3 KB) Скачиваний: 152
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Программное управление кнопкой "Авто-Торговля"

Сообщение YURIY007 » 15 фев 2017, 17:10

Kalkin писал(а):Кнопка "Авто-Торговля" разрешает советникам и скриптам выполнять торговые операции. Имея такой общий выключатель, неплохо было бы автоматизировать его управление. Например, можно написать отдельный советник, который бы в зависимости от времени суток включал/выключал кнопку. Или скрипт, который дожидается отсутствия позиций и выключает кнопку, чтобы работающие советники не смогли установить новую позицию. Мало ли - примеров использования можно придумать массу.

Чисто средствами MQL4 доступ к управлению кнопкой "Авто-Торговля" невозможен. Всё, что можно сделать - это выяснить её состояние опосредованно, воспользовавшись функцией IsExpertEnabled(). Функция возвращает true, если в клиентском терминале разрешен запуск экспертов (кнопка "Авто-Торговля" нажата), иначе возвращает false.

Однако, в нашем распоряжении есть замечательное средство - функции API из комплекта Windows. Благодаря им мы можем сымитировать клик по кнопке. Если надо включить кнопку, а она отключена, то "кликаем" по ней, если и так включена, то ничего не делаем. Аналогично для случая отключения: если включена - кликаем, иначе оставляем в покое.

Итак, состояние кнопки определяем при помощи IsExpertEnabled(), а чтобы "кликнуть" по ней, нужно до неё добраться.
Кнопка находится на панели инструментов окна МТ4. Программа наша выполняется на каком-то из подокон терминала, на котором расположен график. Нам надо получить системный дескриптор подокна с графиком, затем через него выйти на дескриптор МТ4, и уже потом добраться до дескриптора панели инструментов, на которой находится кнопка. И в завершении - послать команду "клика" на кнопку "Авто-Торговля".
Системный дескриптор активного окна графика можно получить функцией WindowHandle(Symbol(), Period()), остальное - функциями API библиотеки user32.dll. Поскольку окно МТ4 является родительским для активного окна графика, то его дескриптор получим функцией

Интересно вы пишете, но вот зачем изобретать велосипед разбирая автомобиль, ведь вы описываете операции которые многие просто не поймут, а в советник проще вставить условие на включение или выключение работы советника, у меня так и работает один в ночном флете открывает, утром по времени идет запрет на открытие но советник работает на закрытие по определенных условиях, а потом под вечер , вообще все закрывает в определенное мной время не зависимо убыток там или профит.
Аватар пользователя
YURIY007
 
Сообщений: 563
Зарегистрирован: 02 фев 2017, 17:47
Средств на руках: 2.30 Доллар
Откуда: Украина
Группа: Базовая
Благодарил (а): 271 раз.
Поблагодарили: 222 раз.
ПРОДАМ СТРОЧКУ В ПОДПИСИ — 25 WMZ на месяц. (для рекламы любого ресурса с вашей реф ссылкой).
мой журналквазиарбитражрегистрация на форум
1000$ в управление, без вложений (пишите в ЛС)

Программное управление кнопкой "Авто-Торговля"

Сообщение Kalkin » 15 фев 2017, 19:07

Все правильно, если это свой советник или есть возможность изменить его код. Да, в моих советниках обычно есть возможность включения временной зоны торговли. Но статья эта была написана после вопроса, примерно такого: "На счете работают несколько советников разных авторов. Надо, чтобы в определенный момент времени они автоматически отключались, а потом включались". Один из способов решения как раз и заключается в общем запрете работы всех советников, воздействуя на кнопку "Авто-Торговля".
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Программное управление кнопкой "Авто-Торговля"

Сообщение YURIY007 » 17 фев 2017, 05:34

Kalkin писал(а):Все правильно, если это свой советник или есть возможность изменить его код. Да, в моих советниках обычно есть возможность включения временной зоны торговли. Но статья эта была написана после вопроса, примерно такого: "На счете работают несколько советников разных авторов. Надо, чтобы в определенный момент времени они автоматически отключались, а потом включались". Один из способов решения как раз и заключается в общем запрете работы всех советников, воздействуя на кнопку "Авто-Торговля".

Ну в таком случаи я извиняюсь, что сделал замечание и влез в дискуссию, возможно я не видел вопроса.
Но если на счете торгует несколько роботов с закрытым кодом, то целесообразней открывать два терминала, может быть случай что одному советнику нужно торговать а другому нужно запретить, Эта кнопка запрещает все даже скрипты не будут выполняться, полный запрет не всегда нужен.
Аватар пользователя
YURIY007
 
Сообщений: 563
Зарегистрирован: 02 фев 2017, 17:47
Средств на руках: 2.30 Доллар
Откуда: Украина
Группа: Базовая
Благодарил (а): 271 раз.
Поблагодарили: 222 раз.
ПРОДАМ СТРОЧКУ В ПОДПИСИ — 25 WMZ на месяц. (для рекламы любого ресурса с вашей реф ссылкой).
мой журналквазиарбитражрегистрация на форум
1000$ в управление, без вложений (пишите в ЛС)

Программное управление кнопкой "Авто-Торговля"

Сообщение Kalkin » 17 фев 2017, 07:47

:-): На то он и форум, чтобы "влезать в дискуссию". Так что наоборот - очень хорошо, что есть замечания и предложения.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения