Как удалить отложенные ордера советника при вызове OnDeinit()?

 

Здравствуйте, подскажите пожалуйста.

Хочу, чтобы если я удаляю советник с графика, автоматически удалялись бы все отложенные ордера, которые этот советник успел открыть.

Столкнулся с такой ошибкой при удалении отложенных ордеров непосредственно из OnDeinit() - "MQL5 program is stopped. Trading is disabled"

Есть ли какие-то способы обхода? Можно ли как-то удалять отложенные ордера из OnDeinit()? Если нельзя, то как решить поставленную задачу, чтобы при удалении советника с графика, удалялись бы все отложенные ордера, которые он выставил?

Спасибо за ответы.


 

Отложенный ордер можно УДАЛИТЬ, а закрыть его НЕЛЬЗЯ, в принципе. Отложенный ордер можно ВЫСТАВИТЬ, а открыть его нельзя.

Ваш текст исправил.

 
yar.forex:

***

Столкнулся с такой ошибкой при удалении отложенных ордеров непосредственно из OnDeinit() - "MQL5 program is stopped. Trading is disabled"

***


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

Если же советник удаляется из-за того, что Вы закрыли график на котором находится советник - то здесь 50/50 - может успеете всё удалить, а может и не успеете. Почему так? Потому что убивание графика на котором находиться живой советник - это нештатная ситуация.

 
Vladimir Karputov:

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

Если же советник удаляется из-за того, что Вы закрыли график на котором находится советник - то здесь 50/50 - может успеете всё удалить, а может и не успеете. Почему так? Потому что убивание графика на котором находиться живой советник - это нештатная ситуация.

Спасибо.

Я имел ввиду не удаление графика с советником, а выключение советника руками. Не когда советник сам себя выключает, а когда я мышкой решил его выключить.

Должен же быть способ, чтобы советник удалил все свои ордера, когда пользователь решил его выключить?

 
yar.forex:

Спасибо.

Я имел ввиду не удаление графика с советником, а выключение советника руками. Не когда советник сам себя выключает, а когда я мышкой решил его выключить.

Должен же быть способ, чтобы советник удалил все свои ордера, когда пользователь решил его выключить?

Тогда только в OnDeinit и тут как повезёт ...

 

Я думал, что будет работать вот так: 

void OnDeinit(const int reason) {

   // Хочу, чтобы подобная конструкция вызывалась, когда я удаляю советник с графика
   for (int i = OrdersTotal(); i >= 0; i--)                       // Перебираем все открытые ордера
   
      if( OrderSelect(OrderGetTicket(i)) == 1)                    // Выбираем ордер
         if( OrderGetInteger(ORDER_MAGIC) == magic)               // Проверяем magic
            trade.OrderDelete(OrderGetInteger(ORDER_TICKET));     // Удаляем ордер

}

Сейчас выдает ошибку: "MQL5 program is stopped. Trading is disabled".
Т.е. как я понял из OnDeinit() вообще нельзя открывать или закрывать ордера.

Но как тогда закрыть ордера советника, если я удаляю советник с графика своими руками?

 

можно попробовать в конце OnTick() проверить IsStopped()

может быть и получится


хотя логичнее такую задачу решать путем создания кнопки на чарте, при нажатии закроете все ордера и выполните ExpertRemove()

 
Igor Makanu:

можно попробовать в конце OnTick() проверить IsStopped()

может быть и получится


хотя логичнее такую задачу решать путем создания кнопки на чарте, при нажатии закроете все ордера и выполните ExpertRemove()

Спасибо, да. Наверно, стоит пойти подобным путем.

 
yar.forex:

Спасибо, да. Наверно, стоит пойти подобным путем.

Вместо спец.кнопки, легче использовать скрипт IamGoingToBed ;-)
В котором можно и вырубить эксперта

 
Malik Arykov:

Вместо спец.кнопки, легче использовать скрипт IamGoingToBed ;-)
В котором можно и вырубить эксперта

Прикольная идея. Проще в реализации )))

Причина обращения: