Новая версия платформы MetaTrader 5 build 2280 - страница 5

 
Slava:

С чего это?

Просто не надо вызывать EventKillTimer вместе с ExpertRemove и не будет никакого бага. Документацию надо читать. Внимательно. 

Природу этого "не бага" опишите, пожалуйста. По какой причине EventKillTimer где-то не должен вызываться?

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции  OnInit() была вызвана функция EventSetTimer(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается функция EventSetTimer().

Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql5-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().

Можно же в той же OnChartEvent включать и выключать таймер, когда вздумается.

 
Artyom Trishkin:

OnTick() запустите хоть раз. ExpertRemove() не удаляет советник, а взводит флаг необходимости удаления на следующем тике.

Я не помню где и кто из разработчиков пояснял, но было сказано что эксперт выгружается при первом return (явном или неявном) после взвода флага удаления эксперта.

 

fxsaber:

void OnTimer()
{
  EventKillTimer(); // Если это закомментировать, то все норм.
  ExpertRemove();
  Print("ExpertRemove()");
}

А поменять местами удаление эксперта и удаление таймера не пробовали?

 
Alexey Viktorov:

А поменять местами удаление эксперта и удаление таймера не пробовали?

Не влияет на результат.

 
Alexey Viktorov:

Я не помню где и кто из разработчиков пояснял, но было сказано что эксперт выгружается при первом return (явном или неявном) после взвода флага удаления эксперта.

ОК, я ошибся в одном (писал ответ по памяти) - эксперт выгружается при наступлении следующего события (что тут означает "событие" - точно не ясно, но предполагаю - следующая строка кода за командой ExpertRemove())

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

Но чтобы оно наступило (событие это), эксперт-то должен быть запущен хотя бы раз.

Документация по MQL5: Общие функции / ExpertRemove
Документация по MQL5: Общие функции / ExpertRemove
  • www.mql5.com
//|                                            Test_ExpertRemove.mq5 | //|                        Copyright 2009, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Expert deinitialization function                                 |...
 
fxsaber:

Природу этого "не бага" опишите, пожалуйста. По какой причине EventKillTimer где-то не должен вызываться?

Можно же в той же OnChartEvent включать и выключать таймер, когда вздумается.

Из документации

Примечание

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.

В вышеуказанном примере удаляется таймер. Нет обработчика OnTick. Нет обработчика OnChartEvent. Вообще нет других обработчиков. Это значит, что данный эксперт после удаления таймера больше не получит событий.

Во-вторых, какой смысл удалять таймер тут же, если был вызов ExpertRemove?

В-третьих, в документации явно даны рекомендации по удалению таймера. Если таймер запущен в OnInit, то лучше его удалять в OnDeinit.

Документация по MQL5: Обработка событий / OnDeinit
Документация по MQL5: Обработка событий / OnDeinit
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Возвращает текстовое описания причины деинициализации            |
 
Artyom Trishkin:

ОК, я ошибся в одном (писал ответ по памяти) - эксперт выгружается при наступлении следующего события (что тут означает "событие" - точно не ясно, но предполагаю - следующая строка кода за командой ExpertRemove())

Но чтобы оно наступило (событие это), эксперт-то должен быть запущен хотя бы раз.

Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.


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

 
Slava:

Из документации

В вышеуказанном примере удаляется таймер. Нет обработчика OnTick. Нет обработчика OnChartEvent. Вообще нет других обработчиков. Это значит, что данный эксперт после удаления таймера больше не получит событий.

Если добавить обработчики, ничего не изменится. Даже OnDeinit не сработает.

Во-вторых, какой смысл удалять таймер тут же, если был вызов ExpertRemove?

Если наступило событие A - отключить таймер. Если наступило B - выгрузить эксперт. Логично, что A и B иногда могу выполняться одновременно.

В-третьих, в документации явно даны рекомендации по удалению таймера. Если таймер запущен в OnInit, то лучше его удалять в OnDeinit.

Так это только рекомендация.

Сейчас получается так, что в какой нибудь f1 произошло выключение таймера. В какой-нибудь f2 - выгрузка советника. И если f1 и f2 вызвались в результате каких-то условий в OnTimer, то советник останется висеть, при этом не будет реагировать на какие-либо события. Ручное снятие запустит OnDeinit и глобальный деструктор.

 
Christian:

2280 немецкий:

Разрешение меню ошибки перевода

Поправили. Спасибо!

 

Билд 2280 ФОРТС

Ошибка установки отложенного ордера Buy по нижнему пределу цены

2019.12.16 10:00:01.259 Trades  'xxxxx': failed buy limit 2.00 Si-6.20 at 61692 [Invalid price]
2019.12.16 10:00:02.169 Trades  'xxxxx': failed buy limit 2.00 RTS-6.20 at 139630 [Invalid price]
2019.12.16 10:00:02.170 Trades  'xxxxx': failed buy limit 2.00 MIX-6.20 at 281950 [Invalid price]
2019.12.16 10:00:02.225 Trades  'xxxxx': failed buy limit 1.00 LKOH-6.20 at 55446 [Invalid price]
2019.12.16 10:00:02.974 Trades  'xxxxx': failed buy limit 1.00 CHMF-6.20 at 84776 [Invalid price]
2019.12.16 10:00:02.999 Trades  'xxxxx': failed buy limit 1.00 ROSN-6.20 at 40860 [Invalid price]
2019.12.16 10:00:07.021 Trades  'xxxxx': failed buy limit 2.00 MIX-12.20 at 277350 [Invalid price]
2019.12.16 10:00:07.021 Trades  'xxxxx': failed buy limit 2.00 ROSN-12.20 at 42014 [Invalid price]
2019.12.16 10:00:07.022 Trades  'xxxxx': failed buy limit 1.00 LKOH-12.20 at 55549 [Invalid price]
2019.12.16 10:00:29.769 Trades  'xxxxx': failed buy limit 2.00 RTS-6.21 at 131790 [Invalid price]
2019.12.16 10:04:02.026 Trades  'xxxxx': failed buy limit 2.00 RTS-12.20 at 136560 [Invalid price]

До билда 2280 все нормально работало

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Причина обращения: