Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 742
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку https://www.mql5.com/ru/forum/1111
С моими правками код работает, как надо. Без - нет. А вот должен ли Ваш код работать - лучше в ветку по ссылке выше.
Спасибо за ссылку.
Может кто сможет подсказать.
Я не могу понять, как можно прервать выполнение эксперта после того, как вручную изменить входные настройки.
1) Запускаем на чарте такой код эксперта:
2) Открываем окно настроек и меняем параметр "Setting_" на 1.
3) И применяем изменения.
Так вот, чтобы изменения начали применяться должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick (или в любой другой) не прекратятся.
На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag - флаг остановки mql5-программы, но это только для полного выхода. А вот как понять, что входные настройки изменились, чтобы остановить вычисления я не знаю.
Может кто сталкивался с такой ситуацией? Может есть какой-нибудь секретный хак?
Может кто сможет подсказать.
Я не могу понять, как можно прервать выполнение эксперта после того, как вручную изменить входные настройки.
1) Запускаем на чарте такой код эксперта:
2) Открываем окно настроек и меняем параметр "Setting_" на 1.
3) И применяем изменения.
Так вот, чтобы изменения начали применяться должен выполниться OnInit, но OnInit не будет выполняться до тех пор, пока вычисления в OnTick (или в любой другой) не прекратятся.
На сколько я знаю, есть лишь проверка на остановку программы через _StopFlag - флаг остановки mql5-программы, но это только для полного выхода. А вот как понять, что входные настройки изменились, чтобы остановить вычисления я не знаю.
Может кто сталкивался с такой ситуацией? Может есть какой-нибудь секретный хак?
Проверяйте код деинициализации в OnInit()
Причины деинициализации
Коды причины деинициализации эксперта, возвращаемые функцией UninitializeReason(). Могут иметь любые из следующих значений:
Константа
Значение
Описание
REASON_PROGRAM
0
Эксперт прекратил свою работу, вызвав функцию ExpertRemove()
REASON_REMOVE
1
Программа удалена с графика
REASON_RECOMPILE
2
Программа перекомпилирована
REASON_CHARTCHANGE
3
Символ или период графика был изменен
REASON_CHARTCLOSE
4
График закрыт
REASON_PARAMETERS
5
Входные параметры были изменены пользователем
REASON_ACCOUNT
6
Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета
REASON_TEMPLATE
7
Применен другой шаблон графика
REASON_INITFAILED
8
Признак того, что обработчик OnInit() вернул ненулевое значение
REASON_CLOSE
9
Терминал был закрыт
Проверяйте код деинициализации в OnInit()
...
Эмм... Вы меня не поняли :)
Нужно узнать внутри функции (например в OnTick), что пользователь изменил входные параметры, т.е. узнать, что пора закругляться и дать программе уйти в OnDeinit.
Эмм... Вы меня не поняли :)
Нужно узнать внутри функции (например в OnTick), что пользователь изменил входные параметры, т.е. узнать, что пора закругляться и дать программе уйти в OnDeinit.
Как только пользователь вызывает окно настроек советника (F7) и, изменив параметры, нажимает там кнопку ОК, сразу же вызывается OnDeinit(), и он, в свою очередь записывает в код деинициализации значение REASON_PARAMETERS. Далее вызывается OnInit(), где при помощи UninitializeReason() можно проверить код деинициализации и, если его значение равно REASON_PARAMETERS, то решать что нужно делать дальше.
Ну ладно.
Пожалуйста:
1) Сначала запустите мой код, который я привел в своем первом сообщении. Я его не для красоты там привел... Можете запустить на любом чарте.
2) Вызовите окно настроек советника.
3) Измените параметр и нажмите ОК.
Если вы внимательно посмотрите мой код, тогда полученный, закономерный результат вас не удивит: OnDeinit() не будет вызван.
Мало того, я в деините добавил принтовку, как причины, так и параметра, чтобы можно было убедиться, что эксперт НЕ доходит до деинита.
Пожалуйста, обратите внимание на самый важный кусок в коде:
Это наглядная эмуляция продолжительного вычисления, которая не будет прервана из-за изменения входных параметров. А мне нужно его прервать и вопрос как? :)
Я просто хочу убедиться, что я ничего не упускаю в MQL5 и в языке, действительно, нет ничего больше кроме _StopFlag, который, к сожалению, не решает данную ситуацию.
Грубо говоря, мне нужно поймать момент изменения входных параметров во время тяжелого вычисления.
Мало того, я в деините добавил принтовку, как причины, так и параметра, чтобы можно было убедиться, что эксперт НЕ доходит до деинита.
Пожалуйста, обратите внимание на самый важный кусок в коде:
Это наглядная эмуляция продолжительного вычисления, которая не будет прервана из-за изменения входных параметров. А мне нужно его прервать и вопрос как? :)
Я просто хочу убедиться, что я ничего не упускаю в MQL5 и в языке, действительно, нет ничего больше кроме _StopFlag, который, к сожалению, не решает данную ситуацию.
Грубо говоря, мне нужно поймать момент изменения входных параметров во время тяжелого вычисления.
Грубо говоря - перечитайте внимательно то, что я вам написал, и выкиньте из своего кода бесконечный цикл.
Вы точно уверены, что загон эксперта в бесконечный цикл - верное решение?
Здравствуйте все! Вопрос по MQL5.
Мне хочется вставлять комменты в функцию закрытия сделки по тикету.
Пока пользовался классом CTrade, но он не даёт такую возможность.
То есть надо использовать OrderSend, правильно?
Тут я не понимаю: https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions#trade_action_deal в примере пишется функция OnStart. Или можно прописать всё в пользовательскую функцию и вызывать её при необходимости?
Надо ли что-то добавлять в OnInit?
И не будет ли конфликтов, если я закрытие напишу через OrderSend, а открытия и модификации оставлю на базе класса CTrade?
Спасибо!
Грубо говоря - перечитайте внимательно то, что я вам написал, и выкиньте из своего кода бесконечный цикл.
Вы точно уверены, что загон эксперта в бесконечный цикл - верное решение?
Во-первых, это не решение, а пример для демонстрации сути того, о чем я говорю.
Во-вторых, это не бесконечный цикл, он корректно и безопасно прервется при завершении программы.
И в-третьих, вы мне пишите про решение совсем другой вещи, для решения которой я могу придумать миллион способов.
Т.е. мой цикл вы посчитали камнем преткновения моей ситуации? Серьезно?
В общем, я понял. Неудачно меня занесло в эту тему...
Но, в любом случае, спасибо!