Из-за таких багов нельзя быть уверенным, что советник отрабатывает логику правильно, а главное эти баги очень трудно отловить, потому что просто рушится логика выполнения кода. Никогда ведь не подумаешь, что if (1 > 5) может сработать.
В старой версии МТ5 еще могли пропускаться некоторые элементы массива в цикле, что тоже не поддавалось никакому здравому смыслу, а списать на утечку памяти было нельзя, т.к. массив не менял свой размер в процессе выполнения.
Как-то раз решил перенести свой советник с МТ4 на МТ5. И все было по началу хорошо, пока не обнаружил странное поведение в коде. При помощи записи состояния всех переменных стратегий в лог я выяснил, что некоторые условия срабатывали тогда, когда не надо. И наоборот, некоторые условия не срабатывали.
Самый простой пример. В любом языке программирования такое условие не выполнится. Но в MQL5 подобные условия иногда выполняются. И от чего это зависит — не понятно.
Тогда мне помогло лишь одно: я переехал с терминала МТ5 от брокера Альпари (он не хотел обновляться до свежей версии) на оригинальный МТ5 последней (на тот момент) версии. И это помогло, подобные баги исчезли. Менять что либо в коде было бесполезно.
И вот недавно я решился сделать заказ для знакомого. По началу все шло хорошо, но вот захотелось добавить асинхронное открытие и закрытие сделок. Казалось бы, что может быть проще?
Иногда сделки не открываются с первого раза. Да и не всегда закрываются. Значит, нужно добавить повторные попытки открыть/закрыть позицию. Но код, который работает с точки зрения здравого смысла, не работает в MQL5:
Переменная close_error содержит 1, так как ошибка при закрытии позиции возникла 1 раз. Это видно в терминале в соответствующем сообщении. Переменная m_open_attempts содержит 5. Внимание, вопрос: какие условия сработают в этом коде?
Правильный ответ
1. Условия:
Не сработают, что логично.
2. Условия:
Сработают, что тоже логично.
3. Условие:
Сработает! При этом ранее
Не сработало!
Сами условия находятся в switch.
Отключение оптимизации не помогает.
С такой подачей материала, я думаю, вам придётся ……… это… Как заниматься любовью без девушки.
Откуда какие значения переменных берутся, где они могут потеряться… И всё остальное покрыто мраком.
Удачи вам в этом неблагородном деле…
Более того, брокеры не имеют возможности их менять, упаковывают их MQ на сколько мне известно.
Тут дело с неверной работой с памятью.
Попытайтесь упростить свои примеры до минимума. Внутри каждого if добавляйте элементарный лог через print, много интересного узнаете о своем коде.
Так много текста и ни одного рабочего примера, где воспроизводится проблема.
А без примера вам никто не поверит.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как-то раз решил перенести свой советник с МТ4 на МТ5. И все было по началу хорошо, пока не обнаружил странное поведение в коде. При помощи записи состояния всех переменных стратегий в лог я выяснил, что некоторые условия срабатывали тогда, когда не надо. И наоборот, некоторые условия не срабатывали.
Самый простой пример. В любом языке программирования такое условие не выполнится. Но в MQL5 подобные условия иногда выполняются. И от чего это зависит — не понятно.
Тогда мне помогло лишь одно: я переехал с терминала МТ5 от брокера Альпари (он не хотел обновляться до свежей версии) на оригинальный МТ5 последней (на тот момент) версии. И это помогло, подобные баги исчезли. Менять что либо в коде было бесполезно.
И вот недавно я решился сделать заказ для знакомого. По началу все шло хорошо, но вот захотелось добавить асинхронное открытие и закрытие сделок. Казалось бы, что может быть проще?
Иногда сделки не открываются с первого раза. Да и не всегда закрываются. Значит, нужно добавить повторные попытки открыть/закрыть позицию. Но код, который работает с точки зрения здравого смысла, не работает в MQL5:
Переменная close_error содержит 1, так как ошибка при закрытии позиции возникла 1 раз. Это видно в терминале в соответствующем сообщении. Переменная m_open_attempts содержит 5. Внимание, вопрос: какие условия сработают в этом коде?
Правильный ответ
1. Условия:
Не сработают, что логично.
2. Условия:
Сработают, что тоже логично.
3. Условие:
Сработает! При этом ранее
if (close_error > m_open_attempts)
Не сработало!
Сами условия находятся в switch.
Отключение оптимизации не помогает.