Не снимаются лимитные ордера на событие OnDeinit ни при снятии советника, ни как.

 

Подскажите как правильно снять лимитные ордера если закрывается терминал МТ5 или снимается советник.
Пытался и в асинхронном режиме бросать заявку и что только не делал ордера остаются висеть в системе. 
Пользуюсь Ctradeinfo.OrderDelete();

 
Aleksandr Dziuba:

Подскажите как правильно снять лимитные ордера если закрывается терминал МТ5 или снимается советник.
Пытался и в асинхронном режиме бросать заявку и что только не делал ордера остаются висеть в системе. 
Пользуюсь Ctradeinfo.OrderDelete();

А что это за класс? Откуда? В СБ такого нет…

 
Alexey Viktorov #:

А что это за класс? Откуда? В СБ такого нет…

Ошибся CTrade из #include <Trade\Trade.mqh>

 
Aleksandr Dziuba #:

Ошибся CTrade из #include <Trade\Trade.mqh>

Опубликуйте свой вариант функции OnDeInit()

Я завтра поэкспериментирую, попытаюсь понять в чём проблема…

 
Даже OrderSendAsync (если я правильно понял выражение "асинхронный режим") выполняется не мгновенно. В итоге выполнение OnDeinit() попросту исчерпает весь лимит времени, который доступен советнику на завершение работы. Вполне возможно, что причина именно такова, особенно если ордеров много (десятки и более).
 

Ihor Herasko #:
Даже OrderSendAsync (если я правильно понял выражение "асинхронный режим") выполняется не мгновенно. В итоге выполнение OnDeinit() попросту исчерпает весь лимит времени, который доступен советнику на завершение работы. Вполне возможно, что причина именно такова, особенно если ордеров много (десятки и более).

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--  деинициализируем нидикаторы
   goninit=true;
   delete_orders();
//   inditatorsdeinit();
   goninit=false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void delete_orders()
  {
   b_trade.SetAsyncMode(true);
   if(PrevLimOrderTicket != 0 && OrderSelect(PrevLimOrderTicket) && OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED && !b_trade.OrderDelete(PrevLimOrderTicket))
     {
      uint _result=a_trade.ResultRetcode();
      Print(__FUNCTION__+"не удален лимитный ордер вне торгового времени Result=",_result);
     }
   if(PrevLimBuyOrderTicket != 0 && OrderSelect(PrevLimBuyOrderTicket) && OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED && !b_trade.OrderDelete(PrevLimBuyOrderTicket))
     {
      uint _result=a_trade.ResultRetcode();
      Print(__FUNCTION__+"не удален лимитный ордер вне торгового времени Result=",_result);
     }
   b_trade.SetAsyncMode(false);
  }
Ордеров да 16. Но хотя бы один должен сняться. Но и после снятия советника они не снимаются. Вот в чем проблема
 
Aleksandr Dziuba #:
хотя бы один должен сняться.

Перед вызовом своей функции сделайте так.

PrevLimOrderTicket = OrderGetTicket(0);

И один удалится. Чтобы все - цикл по ордерам.

 
fxsaber #:

Перед вызовом своей функции сделайте так.

И один удалится. Чтобы все - цикл по ордерам.

Спасибо. Тикеты уже известны. Советников пока 5 а может быть и больше. У каждого по 2 ордера. Поэтому сегодня проверю уделение ордеров без предварительного выделения и проверки на размещение. Может это сработает если вопрос в скорости.
А может Ctrade не дает что то делать.     

 
Aleksandr Dziuba #:
А может Ctrade не дает что то делать.
bool CTrade::OrderDelete(const ulong ticket)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action    =TRADE_ACTION_REMOVE;
   m_request.magic     =m_magic;
   m_request.order     =ticket;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

Так вот же!

А вообще, на завершение работы даётся 2.5 секунды, после чего советник просто убивается.
 

Ну вот… Я только проснулся, хотел поэкспериментировать, а тут вопрос уже решён.

 
JRandomTrader #:

Так вот же!

А вообще, на завершение работы даётся 2.5 секунды, после чего советник просто убивается.

2023.11.28 10:21:44.645 BAS_v.1.16 (SVZ3,M1) CTrade::OrderDelete: MQL5 program is stopped. Trading is disabled


Так!  Значит нужно вынести за класс и в deinit просто отправлять запросы без класса.  

   m_request.action    =TRADE_ACTION_REMOVE;
   m_request.magic     =m_magic;
   m_request.order     =ticket;
//--- action and return the result
   return(OrderSend(m_request,m_result));