Вопрос разработчикам. Запуск терминала после подмены версии эксперта

 

Уважаемые разработчики терминала,

столкнулся с такой проблемой. Я запускаю терминалы как процессы, управляя ими через параметры командной строки (раздел справки "Конфигурация при старте"). При этом, если выпущена новая версия (обновление) эксперта, я подменяю для всех терминалов файлы эксперта (.ex4 и .mq4) из базы данных в папку \experts\, и запускаю терминал (terminal.exe) с параметрами на тестирование.

Собственно суть проблемы - при первом запуске терминал не работает с новой версией эксперта. Т.е. у него:

  • в списке "Советник" видна надпись о старой версии эксперта (я ставлю в #property copyright конкретную дату, её видно в имени советника);
  • терминал не запускается автоматически с соотв. параметрами командной строки сразу на тестирование (как это делают терминалы без обновления эксперта), т.е. у него активна кнопка Старт (не Стоп).
  • и он не закрывается после проведения тестирования автоматически, т.к. не вошёл в этот режим.

Если терминал закрыть и запустить заново, то всё Ok. Он работает, как надо. Но первый запуск не успешен.

Я пробовал после записи файлов эксперта на диск вызывать принудительно компиляцию эксперта (процесс - полный путь к MetaLang.exe с параметром имени эксперта, с опцией -q, и без -q ). Не помогло, к сожалению. Поскольку это автоматический запуск терминалов, то критична необходимость в данном случае ручного вмешательства, либо принудительного снятия процесса терминала, т.к. он не вошёл в режим тестирования и не закрывается.

Прошу уважаемых разработчиков терминала подсказать какое-либо решение, если оно есть.

Если это важно, код обновления на диске файлов эксперта и его компиляции ниже (C# .Net):

 

Копирайтная строка при первом запуске берётся не из эксперта, а из файла mqlcache.dat.

Странно. Я не смог воспроизвести Вашу проблему. Автономно перекомпилировал эксперта после этого запустил терминал с конфигурацией.

Попробуйте сделать следующее:

1. Скопируйте новый mq4

2. Удалите соответствующий ex4

3. Запустите клиентский терминал без конфигурации на старте. Эксперт автоматически перекрмпилируется.

4. Через некоторое время закройте клиентский терминал

5. Запустите клиентский терминал на тестирование с конфигурацией на старте.

 
stringo писал (а) >>

Копирайтная строка при первом запуске берётся не из эксперта, а из файла mqlcache.dat.

Странно. Я не смог воспроизвести Вашу проблему. Автономно перекомпилировал эксперта после этого запустил терминал с конфигурацией.

Попробуйте сделать следующее:

1. Скопируйте новый mq4

2. Удалите соответствующий ex4

3. Запустите клиентский терминал без конфигурации на старте. Эксперт автоматически перекрмпилируется.

4. Через некоторое время закройте клиентский терминал

5. Запустите клиентский терминал на тестирование с конфигурацией на старте.

Вячеслав, спасибо за Ваш ответ.

1. Вопрос - терминалы запускаются в автоматическом режиме из другой системы, и для выполнения п. 4 (закрыть терминал) мне придётся закрыть его принудительно также через API, Ренат в своё время выдал пример C++ кода корректного закрытия посылкой сообщений терминалу.

Такой способ закрытия годится?
Иного я просто не вижу, система работает в этом блоке без участия человека.

И всё-таки, почему запуск MetaLang.exe, который я делаю перед запуском терминала явно, вижу его консольное окно, висящее пару секунд на экране, вижу .log файл с именем эксперта после компиляции - почему эксперт не перекомпилируется ещё этой стадии? Точнее, .ex4 файл появляется на диске, но терминал его не воспринимает что-ли?

2. Опять же, сколько времени дать терминалу на перекомпиляцию? Если в эксперте .mq4 файл почти 700 кб, ~20 тыс. строк кода, 3-5-7 секунд ему хватит? Это же зависит от железа машины.

Если хотите, я могу сделать видео с моей машины, как это всё происходит, и выслать Вам на email.

 

0. Станислав

1. Именно такой способ закрытия и нужно применять.

2. Надо давать не время на перекомпиляцию, а отслеживать появление файла ex4

 

Понял, Станислав, теперь ясно.

Вечером исправлю свой solution, думаю, Ваших ответов теперь достаточно.

 

1. не перезапуская терминал, информацию о советниках/индикаторах/скриптах можно обновить примерно так:

function TMTExpGen.UpdateTerminal: boolean;
var
  Msg, lParam: Cardinal;
  i: integer;
  ok: bool;
begin
  if GetTerminalWindow then begin
    Msg:= RegisterWindowMessage('MetaTrader4_Internal_Message');
    ok:= false;
    for i := -100 to 100 do begin
      lParam:= Msg+i;
      if SendMessage(TerminalHandle, Msg, $3039, lParam)=$303A then begin
        ok:= true;
        break;
      end;
    end;
    if ok then begin
      PostMessage(TerminalHandle, Msg, $303D, lParam);
      Log1.Lines.Add(DT+'Данные в терминале обновлены. Msg='
      + FloatToStr(Msg)+ ' lparam='+FloatToStr(lParam));
    end else begin
      Log1.Lines.Add(DT+'Ошибка. Данные в терминале не обновлены');
    end;
    result:= true;
  end else begin
    result:= false;
  end;
end;
конечно кривоват кусочек с циклом [-100;100], но мой мозг завис и я оставил пока так...


2. узнать о том скомпилировался ли исходник можно проверив не завершился ли процесс компилятора (например if AU3_ProcessExists('MetaLang.exe') из длл-ки AutoItX3), если завершился, то смотрим наличие .ex4, либо .log файлов и делаем соответствующие выводы (и тот и другой предварительно надо удалить)...

 
stringo писал (а) >>

Копирайтная строка при первом запуске берётся не из эксперта, а из файла mqlcache.dat.

Странно. Я не смог воспроизвести Вашу проблему. Автономно перекомпилировал эксперта после этого запустил терминал с конфигурацией.

Попробуйте сделать следующее:

1. Скопируйте новый mq4

2. Удалите соответствующий ex4

3. Запустите клиентский терминал без конфигурации на старте. Эксперт автоматически перекрмпилируется.

4. Через некоторое время закройте клиентский терминал

5. Запустите клиентский терминал на тестирование с конфигурацией на старте.

Станислав, ещё раз спасибо Вам за точный алгоритм. Мне удалось таким способом обновлять версии эксперта, перекомпилируя его силами самого терминала.

Только один досадный момент. Отладчик Visual Studio показал, что терминал не закрывается, к сожалению, посылкой ему сообщений (PostMessage) три раза, и на финальном шаге приходится просто "прибить" его (kill process). Затем он нормально стартует, всё в общем работает, но всё же хотелось бы закрыть его по возможности корректно.

Вот закрывающий код:

Прототип был взят от C++ кода Рената с ветки 'Когда вы уже наконец совместите МТ4 с новой программой "Vista"???'

Я показывал ещё тогда на снимках экранов, что терминал и раньше "снимался" долго, по 5 нарастающих пауз, общее время было больше 40 сек. Если, конечно, kill process ему не сильно вредит, можно и так?

 

Вопрос снимается, разобрался. Метод CloseMainWindow() процесса шлёт ему верное событие и закрывает терминал, лог системы это подтверждает.

 

Заметил ещё одну особенность - при компиляции эксперта, одного и того же исходного .mq4 файла, бинарный файл .ex4 получается разный при каждой компиляции.

Я при обновлении эксперта из SQL базы данных почему-то положился на собственное утверждение, что .ex4 файл будет неизменным при компиляции. И первоначальный алгоритм подменял его на диске из взятого образа БД.

Но после описания Станиславом Стариковым другого алгоритма из БД на диск пишется исходный .mq4 файл, и ожидается перекомпиляция эксперта самим терминалом.

Так вот, идентификация устарелого .ex4 файла проводилась двумя критериями: размером файла в байтах, и его MD5 хэшем, хранящимися в таблице MS SQL 2005 SP2 CU#8:

CREATE TABLE [dbo].[TestExpert](
    [ID] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
    ...
    [BinSize] [int] NULL,
    [BinMD5] [varbinary](max) NULL,
    [BinFile] [varbinary](max) NULL,
) ON [PRIMARY]

Отладка показала, что на проверке MD5 хэша .ex4 файла всегда выдаётся утверждение, что файл другой. Я сделал небольшой тестовый проект, вычисляющий MD5 хэш для файла. При удалении контрольного .ex4 файла и его новой компиляции терминалом (без изменения .mq4 файла) MD5 хэш от разных компиляций .ex4 файла был разным. Т.е. .ex4 содержит метку времени или что-то иное, и не является идентичным.

Вывод. Сравнивать при проверке идентичности хэш от .ex4 файла нельзя, он разный от разных компиляций. Как вариант, можно сравнивать хэш исходного .mq4 файла, полагая, что неизменный исходник даст того же логически идентичного .ex4 бинарника.

Причина обращения: