Еще раз о возможности компиляции mql файла из командной строки

 

В свое время на вопрос о возможности сабжа Renat ответил: Есть же штатный компилятор MQL4 C:\Program Files\MetaTrader 4>MetaLang.exe

Конечно, MetaLang прекрасно работает, но результаты отличаются от компиляции из Metaeditor'a. Код, конечно, тот же, но когда компилируешь кнопкой Metaeditor'a, а индикатор находится на чарте, то изменения сразу появляются на графике, то есть индикатор автоматически перезагружается. А MetaLang оставляет код в файле, на графике же остается работать старая версия индикатора. Даже, когда текст индикатора не изменялся, после компиляции Metaeditor'ом индикатор "освежается", исправляются сбои, удаляется мусор. Это, конечно, касается самописных неоптимизированных индикаторов, но они привычны и нужны авторам и тем, кто привык ими пользоваться. Вот и приходится периодически их "освежать" вручную.

Хотелось бы иметь возможность программно "освежать" индикаторы вызовом из советника. Мне известны три способа "освежения": -смена ТФ, вызов и подтверждение окна свойств индикатора и компиляция индикатора из Metaeditor'a. Проще всего было бы программно вызвать Metaeditor с параметрами для пакетной компиляции и решить проблему, но это, если его можно вызывать с параметрами. Применение двух других способов, насколько я понял из обсуждений на форуме, требует разработки специальной dll с эмуляцией нажатий клавиш в терминале. что намного сложнее.

Вопрос к разработчикам - вызов Metaeditor'a с параметрами для компиляции невозможен однозначно?

Вопрос к программистам - есть ли другие доступные способы "освежения" индикаторов с вызовом из советника?

 

Сделал кривыми ручками функцию смены ТФ из эксперта (спасибо klot'у и Itso за выложенные коды).
Я не программист, поэтому прошу ногами не пинать.
Вот макет эксперта для циклической смены ТФ.
Сценарий предполагает, что эксперт на ТФ М1 вызывает строку быстрой навигации клавишей Enter,
очищает окно строки Backspaсе'ом, набирает и подтверждает М30, пауза, далее набор и подтверждение М1.

//+------------------------------------------------------------------+
//|                                                 Keys_proba.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|Подключение библиотек                                             |
//+------------------------------------------------------------------+
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| Ф-ция нажимания кнопок                                                   |
//+------------------------------------------------------------------+
void KeyScript()
{
//---коды используемых клавиш
   //Enter=13
   //Backspace=8
   //m=77
   //3=51
   //0=48
   //m=77
   //1=49
//---примечание
   //keybd_event(N,0,0,0) - нажатие    клавиши с кодом N
   //keybd_event(N,0,2,0) - отпускание клавиши с кодом N
   
   Comment("  Переключаемся на период М30");
   //открываем строку быстрой навигации
   keybd_event(13,0,0,0);Sleep(10);keybd_event(13,0,2,0);Sleep(50);
   //очищаем старые значения (4 раза Backspace) 
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   //пишем m30
   keybd_event(51,0,0,0);Sleep(10);keybd_event(51,0,2,0);Sleep(50);
   keybd_event(48,0,0,0);Sleep(10);keybd_event(48,0,2,0);Sleep(50);
   // Enter - подтверждаем и закрываем панель строки 
   keybd_event(13,0,0,0);Sleep(10);keybd_event(13,0,2,0);Sleep(50);
   Sleep(1000);
   Comment("  Перекур после переключения на период М30");
   Sleep(1000);
   
   Comment("  Возвращаемся на период М1");
   //открываем строку быстрой навигации
   keybd_event(13,0,0,0);Sleep(10);keybd_event(13,0,2,0);Sleep(50);
   //очищаем старые значения (4 раза Backspace) 
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   keybd_event(8,0,0,0);Sleep(10);keybd_event(8,0,2,0);Sleep(50);
   //пишем m1
   //keybd_event(77,0,0,0);Sleep(10);keybd_event(77,0,2,0);Sleep(50);
   keybd_event(49,0,0,0);Sleep(10);keybd_event(49,0,2,0);Sleep(50);
   // Enter - подтверждаем и закрываем панель строки
   keybd_event(13,0,0,0);Sleep(10);keybd_event(13,0,2,0);Sleep(50);
   Sleep(1000);
   Comment("  Перекур после возврата на период М1, ожидание нового бара");
   Sleep(1000)
   
}
 
int init()
{
    return(0);
}
int deinit()
{
    return(0);
}
int start()
{
if(Period()==1 && Volume[0]<2)
KeyScript();
}
// the end.

В принципе, работает, кнопки нажимаются, что уже хорошо, но есть несколько, мягко говоря, "недоработок".


1. Кнопки нажимаются в активном окне любой программы. Допустим, найду я дескриптор рабочего окна
win_handle=WindowHandle("EURUSD",PERIOD_M1), а как его использовать? То есть, как сделать, чтобы кнопки
нажимались именно (и только) в окне терминала?
2. Иногда выскакивает окно с запросом на разрешение использование user32.dll, хотя в эксперте библиотека
WinUser32.mqh подключена, а в ней прописан импорт user32.dll и определена функция keybd_event.
Галочка "Разрешить импорт DLL" стоит, а "Подтверждать вызов функций DLL" снята.
Что еще надо дописать, чтобы запрос не появлялся?
3. Удобнее было бы работать мышкой, но не знаю как ею управлять.

P.S.
Неожиданно получил впечатляющий побочный эффект!
Ночью запустил советника на демо, он нажимает себе кнопки, а я открыл Metaeditor и, засыпая, тупо смотрю на код.
Вдруг кто-то мне начинает текст править, а ручки-то, вот они! Как будто Массачусетская машина заработала.
Сидел в обалдении минуту, пока не сообразил, что советник нажимает кнопки в активном окне, то есть в редакторе
и реально переписывает мне код. Смех смехом, но такая фича может пригодиться.

 
Ну ты фокусник, granit77. Хотя есть у меня подозрение, что программное переключение ТФ делается как-то проще... Вот смотри (https://www.mql5.com/ru/forum/49608):

Роман 30.09.05 13:24

Я уж чего только не делал. Отловил, короче, то что надо. Почему-то команды не упорядочено:

33137 - M1
33138 - M5
33139 - M15
33140 - M30
35400 - H1
33136 - H4
33134 - D1
33141 - W1
33334 - MN

Интересно получается, когда в блок инит советника вставляешь - не дает на другой таймфрейм переключиться. Обратно перескакивает.

 
Mathemat:
Ну ты фокусник, granit77. Хотя есть у меня подозрение, что программное переключение ТФ делается как-то проще... Вот смотри (https://www.mql5.com/ru/forum/49608):

Мне положительно нравится, что из въедливого цензора ты постепенно превращаешься в незаменимого архивариуса. Если бы только не народническая тяга к наставлению всех сирых и убогих...На форуме вменяемых чайников достаточно, нас и воспитывай! Чтобы мы не гуляли просто так, а "гуляли под присмотром".

Что касается твоего подозрения, то большое спасибо за ссылку. Переделаю, выложу сюда. Хотя проделанную работу все равно не считаю зряшной, нажимание кнопок пригодится еще не раз.

В качестве прикола: представь, что ты находишь на каком-либо форуме эксперта.ex4 с шикарным стейтом. Запускаешь у себя, он честно торгует, но периодически сам открывает Word и на твоих глазах печатает рекламу типа: "Посетите наш самый лучший в мире сайт WWW.Sado-Mazo-Deneg.net "

 
granit77:

Если бы только не народническая тяга к наставлению всех сирых и убогих...

Ну да, есть такое, это неистребимо. Это этап развития. Вспомни историю: сначала были народники, а потом, осознав, что сирых и убогих воспитывать бесполезно, перешли к активным действиям (террористы, революционеры марксистского толка и пр.). Пожалуй, и правда пора становиться революционером-радикалом и рубить лес, не обращая внимания на щепки...
 
Mathemat:
granit77:

Если бы только не народническая тяга к наставлению всех сирых и убогих...

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

Спасибо, что предупредил, пойду копать убежище. :-)
 

Очевидно, что terminal.exe, metaeditor.exe и metalang.exe обмениваются управляющими командами через мьютексы, семафоры, ключи реестра или файлы на диске. Можно попробовать поймать их через внешние средства разработки, но эти фишки будут недокументированными возможностями и могут измениться без уведомления то Metaquotes.

Разработчикам - может, внести их в официальное MQL API?

 
chv:

Очевидно, что terminal.exe, metaeditor.exe и metalang.exe обмениваются управляющими командами через мьютексы, семафоры, ключи реестра или файлы на диске. Можно попробовать поймать их через внешние средства разработки, но эти фишки будут недокументированными возможностями и могут измениться без уведомления то Metaquotes.

Разработчикам - может, внести их в официальное MQL API?


chv, вы загоняете метаквотов в семантический тупик. Если недокументированные возможности описать в  MQL API , они перестанут быть недокументированными, и как их тогда называть? Исходя из этого сомнительного положения, рискну предположить, что разработчики не станут ни при каких обстоятельствах официально их документировать, хотя и не будут отрицать их существования, каждый раз предупреждая о рискованности применения. Мне кажется, это обычная практика всех серьезных разработчиков.

Кстати, chv, раз вы уже заглянули в эту ветку, окажите помощь по основной теме. Вы же профи в API, подскажите, пожалуйста, как сделать, чтобы функция keybd_event нажимала кнопки только в том окне, где запущен использующий ее эксперт? Или поправьте, если не влом, выложенный макет эксперта.

 
granit77:
chv, вы загоняете метаквотов в семантический тупик. Если недокументированные возможности описать в MQL API , они перестанут быть недокументированными, и как их тогда называть? Исходя из этого сомнительного положения, рискну предположить, что разработчики не станут ни при каких обстоятельствах официально их документировать, хотя и не будут отрицать их существования, каждый раз предупреждая о рискованности применения. Мне кажется, это обычная практика всех серьезных разработчиков.

Кстати, chv, раз вы уже заглянули в эту ветку, окажите помощь по основной теме. Вы же профи в API, подскажите, пожалуйста, как сделать, чтобы функция keybd_event нажимала кнопки только в том окне, где запущен использующий ее эксперт? Или поправьте, если не влом, выложенный макет эксперта.


Можно взглянуть на это по-другому - я предлагаю разработчикам "выходить из тени", и соотношение докумен. / не документир. функций перераспределять в сторону первых за счёт последних ;). В идеале это соотношение должно стремиться к +бесконечности.

По поводу Key events - я не знаю способа, как узнать о наличии работы эксперта на графике, чтобы посылать сигнал только в это время. Думаю, это можно сделать через глобальные переменные - эксперт в init устанавливает такую переменную (GlobalVariableSet) и в deinit удаляет, а код скрипта выше Keys_proba перед посылкой события проверяет, задана ли global variable через GlobalVariableCheck. Должно работать, попробуйте.
Главная засада в этом - возможное зависание и крах терминала и не удаление переменной. В этом случае придётся перезапустить терминал и проверить это вручную (терминал | F3).

 

int h=WindowHandle(.....

PostMessageA(h,WM_KEYDOWN,...,...);

 
Integer:

int h=WindowHandle(.....

PostMessageA(h,WM_KEYDOWN,...,...);

А вот это дело. Сегодня поздно, завтра с утра.
Причина обращения: