Очень Кривой код.
ВЫ выбираете символ из открытой позиции , чтоб потом удалять ордера. А если не будет позиции, то символ не будет выбран.
Там еще много чего можно перчислять. Посмотрите как это сделано в примерах справки или в кодобазе у более опытных кодеров. У меня например.
Очень Кривой код.
ВЫ выбираете символ из открытой позиции , чтоб потом удалять ордера. А если не будет позиции, то символ не будет выбран.
Там еще много чего можно перчислять. Посмотрите как это сделано в примерах справки или в кодобазе у более опытных кодеров. У меня например.
Хмм, насколько помню это не мой код. Визуально он работает просто прекрасно, и проще вставляется в советники для быстрого прогона, именно поэтому я пользуюсь им, а не кодобазой. Уверен что это раздражит многих. Но для перфекционистов скрипт николая костина первый в списке подойдёт.
Если создается глобальная переменная
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(); }
Непонятно, зачем нужна строчка
Если создается глобальная переменная
CTrade trade;
то можно пользоваться ей, а не создавать каждый раз локально объект CTrade заново, удалять его, и для следующего ордера снова создавать, удалять...
Если все равно организуется цикл по перебору индексов ордеров, то можно их выбирать по индексу. И раз уж используем CTrade, то нет причин не подключить еще и COrderInfo, чтобы получилось примерно так:
Если нужна большая надежность, то можно дополнить так:
Тот кусок кода легко вставлялся в условия(if) без лишних движений, позволил мне прогнать и улучшить ТС, примерно год назад. Я сделал выводы и пошёл дальше, неожидал что он настолько плох хех.
Спасибо за развёрнутый ответ, полагаю тему можно закрыть. Скрипт, конечно удаляю.
Непонятно, зачем нужна строчка
Если создается глобальная переменная
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()); } } } }

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
OrdersDelete:
Удаляет все ордера на графике.
Автор: Nichita Sorbala