Скачать MetaTrader 5

Вопросы перекомпиляции после переноса MQ4 файлов на другой терминал

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Player 2
95
Player 2  
Сегодня было 2 бага.
Первый: советник выставил стоп-лосс туда куда не надо.
Второй: советники неверно отобразили первую строку комментария.

Баги советников я исключаю.

Подробнее.
Есть терминал №1, в котором я пишу советник. Есть еще несколько рабочих терминалов, которые торгуют на счетах. Каждую новую версию советника я копирую из терминала №1 во все остальные терминалы, где они потом работают (копирую ex4 и mq4).

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

Во втором баге после копирования советника из терминала №1 во все остальные, на одном из терминалов верхняя строка комментария стала отображаться неправльно (у остальных терминалов с тем же советником всё работало нормально). Замена файла советника на тот же самый решила проблему.

Вопрос: в чём причина?
Еще я заметил что каждый терминал перекомпилирует скопированный в него советник. Зачем?
Левитин Сергей В.
5163
Левитин Сергей В.  
Player_2:
Сегодня было 2 бага.
...
Вопрос: в чём причина?

Вы считаете что предоставили достаточно информации что бы получить ответ или говорить о багах?
Player 2
95
Player 2  
Figar0:
Player_2:
Сегодня было 2 бага.
...
Вопрос: в чём причина?

Вы считаете что предоставили достаточно информации что бы получить ответ или говорить о багах?

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

А вот вопрос про перекомпиляцию (или, точнее говоря, изменение даты последнего изменения файла, посколько перекомпиляцию я не могу точно проверить) вполне можно и узнать (зачем она нужна).
Rashid Umarov
Админ
12278
Rashid Umarov  
Поищите по форуму про перекомпиляцию. О багах: детально и точно, иначе художественная проза.
Player 2
95
Player 2  
Rosh:
Поищите по форуму про перекомпиляцию. О багах: детально и точно, иначе художественная проза.


Так я и описал детально и точно. Один и тот же советник в разных копиях терминала работает по-разному, куда уж точнее.
Igor Kim
2741
Igor Kim  
Player_2:
Первый: советник выставил стоп-лосс туда куда не надо.
Второй: советники неверно отобразили первую строку комментария.

Баги советников я исключаю.

А почему? Как раз их-то и не надо исключать...

Player_2:
Есть терминал №1, в котором я пишу советник. Есть еще несколько рабочих терминалов, которые торгуют на счетах. Каждую новую версию советника я копирую из терминала №1 во все остальные терминалы, где они потом работают (копирую ex4 и mq4).

Я в торговые терминалы копирую только mq4. Затем их все по очереди перезагружаю. Они сами делают ex4.

Player_2:
В первом баге только в одном терминале советник отработал как надо, в остальных терминалах та же копия советника выставляла стоп-лосс неверно, пока я не заменил файлы советников.

Ну вот видите, Вы сами нашли отличное решение. Баг был связан со старыми файлами советников. При обновлении советников удаляйте старые ex4 и кэш-файл mqlcache.dat. Копируйте только mq4 и обязательно пререзагружайте терминалы. Пусть они сами создадут ex4.

Player_2:
Во втором баге после копирования советника из терминала №1 во все остальные, на одном из терминалов верхняя строка комментария стала отображаться неправльно (у остальных терминалов с тем же советником всё работало нормально). Замена файла советника на тот же самый решила проблему.

Такое ощущуние, что Вы просто копировали файлы советников в торовые терминалы и не перезагружали их. По крайней мере, Вы этого не говорите.

Player_2:

Еще я заметил что каждый терминал перекомпилирует скопированный в него советник. Зачем?

Чтобы он работал. Не компилированный не будет работать

Player 2
95
Player 2  
KimIV:
Player_2:
Первый: советник выставил стоп-лосс туда куда не надо.
Второй: советники неверно отобразили первую строку комментария.

Баги советников я исключаю.

А почему? Как раз их-то и не надо исключать...


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

Описываю второй баг (первый баг - аналогичен).
Есть, условно говоря, "терминал №1" (в нём же метаедитор, всё в отдельной папке). В нём я пишу код советника. Компилирую в нём же. Советник (mq4 и ex4) находится в его подпапке experts.
Также есть, условно говоря, "терминал №2", и "другие терминалы" ("другие терминалы" - это несколько терминалов, они отработали одинаково, поэтому объединил их в одну группу). Все они каждый в отдельной папке.
Все терминалы выключены (не открыты как приложения).

1. Открываю Метаедитор "терминала №1" (в котором я пишу советник).
2. Модифицирую исходный код советника.
3. Компилирую советник в открытом метаедиторе (нажимаю F5).
4. Закрываю метаедитор.
5. Копирую советник (оба файла - mq4 и ex4) из "терминала №1" в "терминал №2" и в "другие терминалы" (в их папки experts). Везде там уже есть файлы с такими же именами, поэтому копирование происходит с заменой файлов.
6. Запускаю "терминал №2" и "другие терминалы".
7. Советник в "других терминалах" работает верно, а советник в "терминале №2" работает неверно.
8. Закрываю все терминалы.
9. Запускаю "терминал №2".
10. Баг повторяется (советник работает неверно).
11. Закрываю "терминал №2".
12. Запускаю "терминал №2".
13. Баг повторяется (советник работает неверно).
14. Закрываю "терминал №2".
15. Запускаю один из "других терминалов".
16. Советник в нём работает правильно.
17. Закрываю этот терминал (открытых терминалов больше нет).
18. Копирую советник (mq4 и ex4) из "терминала №1" в "терминал №2" (т.е. это уже повторное копирование, которое уже было совершено в пункте 5. Файлы советника те же самые и за это время не модифицировались).
19. Запускаю "терминал №2".
20. Советник работает в нём правильно.

Таким образом, один и тот же код советника работал в разных терминалах по-разному. Отсюда вывод - баг не в коде советника. Более того,  советник даже в одном терминале работал по-разному. Сам код советника настолько прост и понятен, что не понятно как он мог выдавать баги, и как они могли исчезнуть заменой советника на тот же самый.

KimIV писал (а):

Player_2:
Есть терминал №1, в котором я пишу советник. Есть еще несколько рабочих терминалов, которые торгуют на счетах. Каждую новую версию советника я копирую из терминала №1 во все остальные терминалы, где они потом работают (копирую ex4 и mq4).

Я в торговые терминалы копирую только mq4. Затем их все по очереди перезагружаю. Они сами делают ex4. 


Я думаю что причина бага как раз перекомпиляция (поскольку баг сохранялся при перезапуске терминала. Думаю компиляция произошла с ошибкой, и баг был занесен в советник на этом этапе). Теперь я буду копировать только ex4. А там посмотрим.


KimIV:

Player_2:
В первом баге только в одном терминале советник отработал как надо, в остальных терминалах та же копия советника выставляла стоп-лосс неверно, пока я не заменил файлы советников.

 Ну вот видите, Вы сами нашли отличное решение. Баг был связан со старыми файлами советников. При обновлении советников удаляйте старые ex4 и кэш-файл mqlcache.dat. Копируйте только mq4 и обязательно пререзагружайте терминалы. Пусть они сами создадут ex4.


Файлы советников были новые (старый советник таких багов не давал).
ex4 был заменён. А вот mqlcache.dat я не удалял. Копирую советники всегда при выключенных терминалах (иначе там сбиваются настройки советника).

KimIV писал (а):

 Такое ощущуние, что Вы просто копировали файлы советников в торовые терминалы и не перезагружали их. По крайней мере, Вы этого не говорите.


Копировал при выключенных терминалах. Потом их запускал.

KimIV:

Player_2:

Еще я заметил что каждый терминал перекомпилирует скопированный в него советник. Зачем?


Чтобы он работал. Не компилированный не будет работать


Речь вот о чем.
Из терминала №1 копирую mq4 и ex4 в терминал №2.
Запускаю терминал №2.
Сразу после запуска файл ex4 изменяется (меняется дата его последнего изменения), хотя изменяться ему незачем, он и так является компилированным кодом и может сам работать безо всяких изменений. Подтверждение тому в следующем: достаточно скопировать только ex4 (без mq4), и всё будет работать. В этом случае при запуске терминала никакой перекомпиляции не будет, дата модификации ex4 не изменится.
Igor Kim
2741
Igor Kim  
Player_2 писал (а):
Таким образом, один и тот же код советника работал в разных терминалах по-разному. Отсюда вывод - баг не в коде советника. Более того, советник даже в одном терминале работал по-разному. Сам код советника настолько прост и понятен, что не понятно как он мог выдавать баги, и как они могли исчезнуть заменой советника на тот же самый.
Да, теперь понятно, что и как Вы делали...

Я считаю, что в файле mqlcache.dat что-то есть. Может быть он как-то некорректно переформируется для новых версий mq4. Попробуйте его удалять при обновлении советников. Я всегда удаляю. И начал это делать после того как обнаружил, что один из терминалов продолжает работать на старой версии советника после обновления файла mq4. Ex4 я не обновлял, т.к. никогда не видел смысла это делать. Предпочитаю работать с первоисточниками, в данном случае с mq4. Ex4 - это посредник, меняющийся от версии к версии МТ4. Не люблю посредников :-)

Player_2:
Я думаю что причина бага как раз перекомпиляция

Вряд-ли... Это всего-лишь видимое действо... причём однозначное. Компиляция по определению не может выполниться сейчас так, а через 5 секунд по-другому. Результат компиляции всегда один и тот же. В этом процессе нет нечёткой логики и неоднозначных факторов. Поэтому для одного и того же mq4 всегда будет ставится в соответствие один и тот же ex4. Это аксиома. Нет смысла подвергать её сомнению.

Player 2
95
Player 2  
KimIV:

Я считаю, что в файле mqlcache.dat что-то есть. Может быть он как-то некорректно переформируется для новых версий mq4. Попробуйте его удалять при обновлении советников. Я всегда удаляю. И начал это делать после того как обнаружил, что один из терминалов продолжает работать на старой версии советника после обновления файла mq4. Ex4 я не обновлял, т.к. никогда не видел смысла это делать. Предпочитаю работать с первоисточниками, в данном случае с mq4. Ex4 - это посредник, меняющийся от версии к версии МТ4. Не люблю посредников :-) 



Если не обновить ex4, то обновление mq4 не приведет к перекомпиляции, и ex4 останется прежним несмотря на новый mq4. Поэтому то, что Вы обнаружили работу старого советника, - нормальное дело, так и должно быть.

Можете провести такой эксперимент.
Пусть условно есть 2 терминала: Т1 и Т2.
Пишем советник в Т1.
Копируем его mq4 и ex4 из Т1 в Т2.
Открываем папку experts терминала Т2.
Запускаем Т2, и в это время смотрим в его папку experts на файл ex4.
Смотрим, что время последнего изменения файла ex4 и mqlcache.dat изменилось в момент старта терминала Т2.
Закрываем Т2.
Запускаем снова.
Видим, что время последнего изменения ex4 не изменилось при очередном старте Т2. Таким образом, оно меняется только однажды.

Потом сделайте еще один эксперимент (если Вам это интересно, разумеется).
Измените исходный код советника в терминале Т1.
Скопируйте mq4 (без ex4) в терминал Т2 (там останется старый ex4)
Запустите Т2. Результат будет такой: файл ex4 не будет изменен терминалом (перекомпиляции не произойдет).

Если подвести итог, то получается:
Изменение (вероятно, перекомпиляция) существующего файла ex4 происходит только в одном случае:
если он соответствует имеющемуся mq4 по своему содержанию и был скомпилирован другим терминалом. Если код mq4 не соответствует ex4, либо этот ex4 уже был компилирован этим терминалом, то изменения ex4 не происходит.

Предположительный механизм таков.
Терминал Т1 при компиляции ex4 записывает в него какие-то свои уникальные данные.
Потом мы копируем ex4 и mq4 в терминал Т2.
Запускаем Т2.
Т2 при запуске компилирует mq4 и сравнивает с ex4. Если обнаруживается совпадение,  то проверяется был ли ex4 компилирован собой 
или другим терминалом. Если выясняется, что ex4 компилирован другим терминалом, то происходит его перезапись и в ex4 вносятся данные о себе (терминале Т2) (чтобы этот же терминал не 
компилировал этот файл повторно).
Если содержимое ex4 не совпадает с mq4, или если ex4 компилирован собой (терминалом Т2), то перезаписи ex4 не происходит.



KimIV:

Player_2:
Я думаю что причина бага как раз перекомпиляция

 Вряд-ли... Это всего-лишь видимое действо... причём однозначное. Компиляция по определению не может выполниться сейчас так, а через 5 секунд по-другому. Результат компиляции всегда один и тот же. В этом процессе нет нечёткой логики и неоднозначных факторов. Поэтому для одного и того же mq4 всегда будет ставится в соответствие один и тот же ex4. Это аксиома. Нет смысла подвергать её сомнению.

Аксиомы тут нет. Программа может выполниться сейчас так, а при следующем запуске по-другому. Такое бывает, например, если в программе есть ошибка в работе с указателями (в этом случае переменные начинают принимать случайные значения, зависящие от содержимого памяти, которое может не зависит от самой программы, а может зависеть от неё, но совершенно непредсказуемым для программиста образом).
Так что одна и та же программа может работать по-разному в разных запусках.
Igor Kim
2741
Igor Kim  
Player_2:
Если не обновить ex4, то обновление mq4 не приведет к перекомпиляции, и ex4 останется прежним несмотря на новый mq4. Поэтому то, что Вы обнаружили работу старого советника, - нормальное дело, так и должно быть.
Где-то Рош отвечал, что для перекомпиляции mq4 достаточно удалить файл mqlcache.dat. Я иду немного дальше и удаляю ещё и ex4. Копирую только mq4. После того, как я стал так делать, багов не было никаких. Вы верите мне? Если верите, попробуйте делать также.
MetaQuotes
Админ
25288
Renat Fatkhullin  
KimIV:
Player_2:
Если не обновить ex4, то обновление mq4 не приведет к перекомпиляции, и ex4 останется прежним несмотря на новый mq4. Поэтому то, что Вы обнаружили работу старого советника, - нормальное дело, так и должно быть.
Где-то Рош отвечал, что для перекомпиляции mq4 достаточно удалить файл mqlcache.dat. Я иду немного дальше и удаляю ещё и ex4. Копирую только mq4. После того, как я стал так делать, багов не было никаких. Вы верите мне? Если верите, попробуйте делать также.
Да, все верно. В mqlcache.dat хранится информация о перекомпиляциях и если при нормальном EX4 файле просто обновить MQ4, то автоматической компиляции не произойдет. Нужно стереть EX4 файл или принудительно перекомпилировать MQ4 файл. Файл mqlcache используется для экономной перекопиляции файлов и серьезно ускоряет старт терминала, когда в каталогах лежат десятки и сотни MQ4 файлов.

Ошибок с перекопиляциям нет - все работает как задумано.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий