Скрипты: OrdersDelete

 

OrdersDelete:

Удаляет все ордера на графике.

Автор: Nichita Sorbala

 

Очень Кривой код. 

ВЫ выбираете символ из открытой позиции , чтоб потом удалять ордера. А если  не будет позиции, то символ не будет выбран. 
Там еще много чего можно перчислять. Посмотрите как это сделано  в примерах справки или в кодобазе у более опытных кодеров. У меня например. 

 
Dmitiry Ananiev #:

Очень Кривой код. 

ВЫ выбираете символ из открытой позиции , чтоб потом удалять ордера. А если  не будет позиции, то символ не будет выбран. 
Там еще много чего можно перчислять. Посмотрите как это сделано  в примерах справки или в кодобазе у более опытных кодеров. У меня например. 

Хмм, насколько помню это не мой код. Визуально он работает просто прекрасно, и проще вставляется в советники для быстрого прогона, именно поэтому я пользуюсь им, а не кодобазой. Уверен что это раздражит многих. Но для перфекционистов скрипт николая костина первый в списке подойдёт.

 
Непонятно, зачем нужна строчка 
(PositionSelect(Symbol()))

Если создается глобальная переменная 

CTrade trade;

то можно пользоваться ей, а не создавать каждый раз локально объект CTrade заново, удалять его, и для следующего ордера снова создавать, удалять...

Если все равно организуется цикл по перебору индексов ордеров, то можно их выбирать по индексу. И раз уж используем CTrade, то нет причин не подключить еще и COrderInfo, чтобы получилось примерно так:

#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>

CTrade  trade;
СOrderInfo order;

void OnStart()
  {
//---
     for(int i = OrdersTotal() - 1; i >= 0; i--) {
        if(order.SelectByIndex(i)) {
           if(order.Symbol() == Symbol()) {
              ulong ticket = m_order.Ticket();
              m_trade.OrderDelete(ticket);
           }
        }
     }
  }

Если нужна большая надежность, то можно дополнить так:

#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>

void CloseAllOrders() {
   CTrade  trade;
   СOrderInfo order;
   
   ulong ticket;
   bool found = true;
   
   while(found) {
      found = false;
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
         if(order.SelectByIndex(i)) {
            if(order.Symbol() == Symbol() /* or any other conditions */) {
               found = true;
               ticket = order.Ticket();
               trade.OrderDelete(ticket);
            }
         }
      }
   }
}

void OnStart() {
    CloseAllOrders();
}
 
Yuriy Bykov #:
Непонятно, зачем нужна строчка 
(PositionSelect(Symbol()))

Если создается глобальная переменная 

CTrade trade;

то можно пользоваться ей, а не создавать каждый раз локально объект CTrade заново, удалять его, и для следующего ордера снова создавать, удалять...

Если все равно организуется цикл по перебору индексов ордеров, то можно их выбирать по индексу. И раз уж используем CTrade, то нет причин не подключить еще и COrderInfo, чтобы получилось примерно так:

Если нужна большая надежность, то можно дополнить так:

Тот кусок кода легко вставлялся в условия(if) без лишних движений, позволил мне прогнать и улучшить ТС, примерно год назад. Я сделал выводы и пошёл дальше, неожидал что он настолько плох хех.

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

 
Yuriy Bykov #:
Непонятно, зачем нужна строчка 
(PositionSelect(Symbol()))

Если создается глобальная переменная 

CTrade trade;

то можно пользоваться ей, а не создавать каждый раз локально объект CTrade заново, удалять его, и для следующего ордера снова создавать, удалять...

Если все равно организуется цикл по перебору индексов ордеров, то можно их выбирать по индексу. И раз уж используем CTrade, то нет причин не подключить еще и COrderInfo, чтобы получилось примерно так:

Если нужна большая надежность, то можно дополнить так:

COrderInfo абсолютно бесполезная … эта, не помню как называется.

Вместо прямого вызова штатной функции OrderGetTicket(i); навернули …

//+------------------------------------------------------------------+
//| Select an order by the index                                     |
//+------------------------------------------------------------------+
bool COrderInfo::SelectByIndex(const int index)
  {
   ulong ticket=OrderGetTicket(index);
   if(ticket==0)
     {
      m_ticket=ULONG_MAX;
      return(false);
     }
   m_ticket=ticket;
//---
   return(true);
  }
//+---

А если попытаться получить тикет

 ticket = order.Ticket();

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

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

Можно добавить проверку символа, магика и может ещё чего по необходимости.

#include <Trade\Trade.mqh>
CTrade  trade;

void OnStart()
  {
//---
   for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
     ulong ticket = OrderGetTicket(i);
      if(ticket > 0)
       {
        if(!trade.OrderDelete(ticket))
         {
          Print(__LINE__, " Ошибка ", GetLastError());
         }
       }
    }
  }