Подскажите как правильно снять лимитные ордера если закрывается терминал МТ5 или снимается советник.
Пытался и в асинхронном режиме бросать заявку и что только не делал ордера остаются висеть в системе.
Пользуюсь Ctradeinfo.OrderDelete();
А что это за класс? Откуда? В СБ такого нет…
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. Но хотя бы один должен сняться. Но и после снятия советника они не снимаются. Вот в чем проблема
Спасибо. Тикеты уже известны. Советников пока 5 а может быть и больше. У каждого по 2 ордера. Поэтому сегодня проверю уделение ордеров без предварительного выделения и проверки на размещение. Может это сработает если вопрос в скорости.
А может Ctrade не дает что то делать.
А может 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)); }
Так вот же!
Ну вот… Я только проснулся, хотел поэкспериментировать, а тут вопрос уже решён.
Так вот же!
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));
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите как правильно снять лимитные ордера если закрывается терминал МТ5 или снимается советник.
Пытался и в асинхронном режиме бросать заявку и что только не делал ордера остаются висеть в системе.
Пользуюсь Ctradeinfo.OrderDelete();