Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 742
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В реальном коде - функция возвращает объект.
Конструктор копирования, по моему, и должен создавать в этом случае временную копию.
Код работает правиьно и в билде MQL5 1545.
В новом билде конструктор копирования не может изменить размер даже одномерного массива: ошибка 4007.
По моему, это не правильно.
Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку https://www.mql5.com/ru/forum/1111
С моими правками код работает, как надо. Без - нет. А вот должен ли Ваш код работать - лучше в ветку по ссылке выше.
В реальном коде - функция возвращает объект.
Конструктор копирования, по моему, и должен создавать в этом случае временную копию.
Код работает правиьно и в билде MQL5 1545.
В новом билде конструктор копирования не может изменить размер даже одномерного массива: ошибка 4007.
По моему, это не правильно.
В билде 1580 ошибку исправили, спасибо, всё работает как должно).
Мне сложно что-то однозначно утверждать в данном случае. Есть очень хорошие спецы по Вашему вопросу, поэтому рекомендую с ним обратиться в ветку 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, который, к сожалению, не решает данную ситуацию.
Грубо говоря, мне нужно поймать момент изменения входных параметров во время тяжелого вычисления.
Грубо говоря - перечитайте внимательно то, что я вам написал, и выкиньте из своего кода бесконечный цикл.
Вы точно уверены, что загон эксперта в бесконечный цикл - верное решение?