Кто знает MQL4 и С++ подскажите

 

Суть заключается в следующем: один из советников в одном терминале, назовем его советник1, при оптимизации создает файл, и другой советник, в другом терминале советник2, должен узнать когда закончится перезапись файла, то есть оптимизация советника1. Далее советник2 работает с созданным файлом, но это не важно. 

Проблема в том, что советник2 ждет пока соптимизируется советник1 фиксированное кол-во секунд функцией sleep, и иногда советник1 оптмизируется слишком быстро, и получается в итоге советник2 простаивает время зря, либо, может быть обратная ситуация, советник1 все еще оптимизируется и следственно записан не до конца, а советник 2 его уже скопировал и обрабатывает.

Так вот, нужно решение которое бы решило эти проблемы, мне кажется советник2 должен с помощью какой-то dll из windows то и дело проверять, меняется ли размер файла, либо смотреть на дату изменения...

 

Нужно, чтобы советник1 записал в файл признак окончания своей оптимизации. Для этого используйте событие OnTesterDeinit. Советник2 в итоге должен с некоторой периодичностью считывать создаваемый файл в поисках признака окончания оптимизации.

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

 
Игорь Герасько:

Нужно, чтобы советник1 записал в файл признак окончания своей оптимизации. Для этого используйте событие OnTesterDeinit. Советник2 в итоге должен с некоторой периодичностью считывать создаваемый файл в поисках признака окончания оптимизации.

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

Я использую mql4, там нет такой функции.

 

Думаю, можно во втором советнике постоянно пытаться читать этот файл и проверять на номер ошибки доступа. Как только удастся прочитать файл, так можно продолжать дальше.

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

 
Igor Ramensky:

Думаю, можно во втором советнике постоянно пытаться читать этот файл и проверять на номер ошибки доступа. Как только удастся прочитать файл, так можно продолжать дальше.

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

При оптимизации советник открывает файл, записывает, закрывает, и так при каждом проходе. То есть не все время файл не доступен.

Как создавать флаг? Я не знаю таких функций, которые бы срабатывали именно 1 раз при последнем проходе оптимизации. 

 
Sheer:

Я использую mql4, там нет такой функции.

Да, действительно. В MQL4 это событие еще не появилось. Возможно, скоро появится. Кстати, можно попытаться узнать у разработчиков, планируется ли вообще появление OnTesterDeinit в MQL4, и, если да, то как скоро?

Каким-то другим способом эта задача вряд ли решается красиво. Сразу оговорюсь, что не рассматриваю в качестве хороших решений способы слежения за статусом элементов управления оптимизатора при помощи WinAPI.

 
Игорь Герасько:

Да, действительно. В MQL4 это событие еще не появилось. Возможно, скоро появится. Кстати, можно попытаться узнать у разработчиков, планируется ли вообще появление OnTesterDeinit в MQL4, и, если да, то как скоро?

Каким-то другим способом эта задача вряд ли решается красиво. Сразу оговорюсь, что не рассматриваю в качестве хороших решений способы слежения за статусом элементов управления оптимизатора при помощи WinAPI.

У меня уже в советнике2 используется несколько функций из dll shell32 и kernel32, так что тоже вариант, просто с++ я лично не знаю, вот и спрашиваю тут как лучше сделать.

Как я уже говорил, возможно на си можно сравнивать размер файла, например каждые 100мс, или сравинвать также но дату последнего изменения. 

 
Sheer:

У меня уже в советнике2 используется несколько функций из dll shell32 и kernel32, так что тоже вариант, просто с++ я лично не знаю, вот и спрашиваю тут как лучше сделать.

Как я уже говорил, возможно на си можно сравнивать размер файла, например каждые 100мс, или сравинвать также но дату последнего изменения. 

"сравинвать также но дату последнего изменения" - в MQL это возможно.

"Как создавать флаг?" - в простейшем случае просто функцией FileWrite.

 
Igor Ramensky:

"сравинвать также но дату последнего изменения" - в MQL это возможно.

"Как создавать флаг?" - в простейшем случае просто функцией FileWrite.

Каким образом можно оповестить советник2 с помощью MQL если он находится в другом терминале, то есть другой директории?

Как функция FileWrite узнает что сейчас последний проход оптимизации и нужно поставить флаг? 

 
Sheer:

Каким образом можно оповестить советник2 с помощью MQL если он находится в другом терминале, то есть другой директории?

Как функция FileWrite узнает что сейчас последний проход оптимизации и нужно поставить флаг? 

1. например, этим флагом FILE_COMMON функций FileOpen, FileWrite и тп

[in] комбинация флагов, определяющая режим работы с файлом. Флаги определены следующим образом:

FILE_COMMON расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files

2. пока не могу сказать, но надо думать, все возможно.

 
Igor Ramensky:
1. например, этим флагом FILE_COMMON функций FileOpen, FileWrite и тп

[in] комбинация флагов, определяющая режим работы с файлом. Флаги определены следующим образом:

FILE_COMMON расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files

2. пока не могу сказать, но надо думать, все возможно.

Спасибо, завтра попробую первый вариант.
Причина обращения: