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

 
Aleksandr Dziuba #:

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


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


Вот так сделал. снимает ордер за 7мс. Успеваю.

void delete_orders_exit()
  {
   MqlTradeRequest m_request;
   MqlTradeResult m_result;
   ZeroMemory(m_request);
   ZeroMemory(m_result);
   m_request.action    =TRADE_ACTION_REMOVE;
   m_request.magic     =Expert_MagicNumber;
   m_request.order     =PrevLimOrderTicket;
   if(PrevLimOrderTicket != 0 && !OrderSendAsync(m_request,m_result))
     {
      uint _result=m_result.retcode;
      Print(__FUNCTION__+"не удален лимитный ордер  Result=",_result);
     }
   m_request.order     =PrevLimBuyOrderTicket;
   if(PrevLimBuyOrderTicket != 0 && !OrderSendAsync(m_request,m_result))
     {
      uint _result=m_result.retcode;
      Print(__FUNCTION__+"не удален лимитный ордер  Result=",_result);
     }
  }
 
JRandomTrader #:

Так вот же!

Не подумал бы, что торговая библиотека сама определяет, когда посчитает нужным торговать.
 
fxsaber #:
Не подумал бы, что торговая библиотека сама определяет, когда посчитает нужным торговать.

Очень давно, нарвавшись на несколько граблей, отказался от CTrade.

 
JRandomTrader #:

Очень давно, нарвавшись на несколько граблей, отказался от CTrade.

Я сам люблю модульное программирование. Но тут из лени пользуюсь. 

 
Aleksandr Dziuba #:

Вот так сделал. снимает ордер за 7мс. Успеваю.

Не правильное условие. Я всегда путаюсь с && и || по исполнению. Если && проверяются оба условия. Поэтому новый код

void delete_orders_exit()
  {
   MqlTradeRequest m_request;
   MqlTradeResult m_result;
   ZeroMemory(m_request);
   ZeroMemory(m_result);
   m_request.action    =TRADE_ACTION_REMOVE;
   m_request.magic     =Expert_MagicNumber;
   m_request.order     =PrevLimOrderTicket;
   if(PrevLimOrderTicket != 0)
      if(!OrderSendAsync(m_request,m_result))
        {
         uint _result=m_result.retcode;
         Print(__FUNCTION__+"не удален лимитный ордер  Result=",_result);
        }
   m_request.order     =PrevLimBuyOrderTicket;
   if(PrevLimBuyOrderTicket != 0)
      if(!OrderSendAsync(m_request,m_result))
        {
         uint _result=m_result.retcode;
         Print(__FUNCTION__+"не удален лимитный ордер  Result=",_result);
        }
  }
 
Aleksandr Dziuba:
снять лимитные ордера если закрывается терминал МТ5 или снимается советник.

Сделал бы не так: вначале запретил работу эксперта/всех экспертов в терминале (с удалением всех ордеров), а только потом закрыл терминал.