Ускорение работы эксперта путем запуска дополнительного скрипта

 

В MQL5 ввели механизм, при котором эксперт не ждет результат выполнения торговой операции. Но небольшая проблема все же осталась: эксперту приходится ждать код возврата от сервера. На это обычно уходит 2-3 секунды, что в некоторых случаях является критичным. За эти 2-3 секунды вынужденного простоя эксперт мог бы произвести какие-то другие расчеты или среагировать на изменение текущей ситуации (действия пользователя на чарте, приход Trade и т.д.). Эту проблему можно решить путем передаче прав по исполнению торговых операций скрипту, который принудительно вызвать. Действительно, все получается: создаем скрипт, назначаем ему горячую клавишу (например, Ctrl+M) и в момент, когда эксперту требуется совершить необходимую операцию, эмулируем нажатие клавиш Ctrl+M, передав информацию скрипту через глобальные переменные терминала:

     keybd_event(VK_CONTROL, 29, 0, 0);
     keybd_event(M_KEY, 50, 0, 0);
     keybd_event(M_KEY, 50, KEYEVENTF_KEYUP, 0);
     keybd_event(VK_CONTROL, 29, KEYEVENTF_KEYUP, 0);

Но подобный запуск имеет один существенны недостаток: если в этот момент пользователь работает с другим приложением, то нажатие клавиши перехватит именно это приложение. Поэтому нужно эмулировать нажатие клавиши именно в Meta Trader. Здесь и появляется проблема: отправка сообщения различным окнам и самому МТ не приводят к желаемому результату:

   PostMessageA(handle, WM_KEYDOWN, VK_MENU, 1);           // Эмуляция нажатия клавиши Ctrl
   Sleep(10);
   PostMessageA(handle, WM_KEYDOWN, M_KEY, 1);             // Эмуляция нажатия клавиши M
   Sleep(10);
   PostMessageA(handle, WM_KEYUP, M_KEY, 1);               // Эмуляция отпускания клавиши M
   Sleep(10);
   PostMessageA(handle, WM_KEYUP, VK_MENU, 1);             // Эмуляция отпускания клавиши Ctrl

В качестве значения handle использовались следующие значения:

   CChart fChart;                                                                                                 
   fChart.Attach(ChartID());                                                                                      // Привяжемся к текущему чарту
   handle_cur = fChart.WindowHandle();                                                                            // Получим дескриптор чарта
   fChart.Detach();                                                                                               // Отвяжемся от чарта

   handle_win = GetParent(handle_cur);                                                                            // Окно, в котором находится чарт
   handle_client = GetParent(handle_win);                                                                         // Окно, в котором находятся все графики МТ
   handleMT = GetParent(handle_client);                                                                           // Главное окно МТ
Есть у кого-то другие идеи по запуску скрипта из советника?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 

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

Это будет надежнее, чем эмуляция нажатия кнопок.

 
Scriptong:
Есть у кого-то другие идеи по запуску скрипта из советника?

Идеи конечно ест - основная заключается в том, что нужно реализовать вызов скрипта средствами самого MQL5 (подобно тому как происходит работа с индикаторами) и передать в параметрах все нужные  настройки скрипта.

осталось убедить разработчиков в необходимости такого функционала.

komposter:

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

Это будет надежнее, чем эмуляция нажатия кнопок.

Вариант хороший, но не универсальный (особенно если учесть что по некоторым причинам сообщения могут и не дойти до получателя). А так я тоже о таком варианте подумал.
 
komposter:

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

Это будет надежнее, чем эмуляция нажатия кнопок.

Согласен, это хороший способ, но для него потребуется дополнительный график, а скрипт я могу запустить на том же графике, на котором работает эксперт. Была еще идея запуска зацикленного скрипта, но это будет необоснованным разбазариванием ресурсов.
 
Interesting:

Идеи конечно ест - основная заключается в том, что нужно реализовать вызов скрипта средствами самого MQL5 (подобно тому как происходит работа с индикаторами) и передать в параметрах все нужные  настройки скрипта.

осталось убедить разработчиков в необходимости такого функционала.

Это было бы вообще отлично! Создадим агиткомпанию? )))
 
Scriptong:
Это было бы вообще отлично! Создадим агиткомпанию? )))
Считайте что я свой голос уже отдал на благо торгового люда. Минимализм и простота не всегда и не везде хороши, что-то нужно и усложнять (а то недолго и в каменном веке очутиться)...
 
Действительно, ведь программный запуск скрипта может оказаться полезным не только для решения описанной мною проблемы. Таким образом можно осуществлять параллельные вычисления, создавая множество потоков в одном МТ. Подобный путь описан в статье https://www.mql5.com/ru/articles/197, но там в качестве параллельной программы используется индикатор. По моему мнению, это схоже на забивание гвоздей микроскопом. Индикатор - для отображения информации, а скрипт - как раз для различных расчетов.
Параллельные вычисления в MetaTrader 5 штатными средствами
Параллельные вычисления в MetaTrader 5 штатными средствами
  • 2010.11.24
  • Andrew
  • www.mql5.com
Время является неизменной ценностью на протяжении всей истории человечества, и мы стремимся не расходовать его понапрасну. Из этой статьи вы узнаете, как можно ускорить работу вашего эксперта, если у вашего компьютера многоядерный процессор. Причем, реализация описываемого метода не требует знания каких-либо еще языков кроме MQL5.
 
Кстати, ни у кого нет идей, почему не работает метод эмуляции нажатия клавиш путем отправки сообщений окнам МТ? Может я сам что-то упустил из виду? Дело в том, что отправка клавиш чарту работает - у эксперта срабатывает событие ChartEvent.
Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - Документация по MQL5
 
Scriptong:
Действительно, ведь программный запуск скрипта может оказаться полезным не только для решения описанной мною проблемы. Таким образом можно осуществлять параллельные вычисления, создавая множество потоков в одном МТ. Подобный путь описан в статье https://www.mql5.com/ru/articles/197, но там в качестве параллельной программы используется индикатор. По моему мнению, это схоже на забивание гвоздей микроскопом. Индикатор - для отображения информации, а скрипт - как раз для различных расчетов.
Как раз с точки зрения параллельных расчетов все очень даже хорошо, параллельные расчеты при помощи индюков реализовать и правильно и полезно, но вот для торговых операций такая схема становится практически невозможной.
 
Scriptong:
Согласен, это хороший способ, но для него потребуется дополнительный график, а скрипт я могу запустить на том же графике, на котором работает эксперт. Была еще идея запуска зацикленного скрипта, но это будет необоснованным разбазариванием ресурсов.

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

А ресурсы он кушать не будет, достаточно вставить минимальный слип.

 
Interesting:

<...кастомные события...> Вариант хороший, но не универсальный (особенно если учесть что по некоторым причинам сообщения могут и не дойти до получателя). А так я тоже о таком варианте подумал.

Извиняюсь, что отвлекаю на попутную тему, но по каким причинам пользовательские события могут не дойти до получателя? - Кроме как про переполнение очереди событий больше ничего придумать не могу :/