Здравствуйте, подскажите пожалуйста, как реализовать функцию закрытия одинаковых по цене ордеров в определенный день недели и время? Например, в понедельник после открытия рынка.
Есть следующая заготовка для отложенных покупок...
Проще не устанавливать еще один отложенный ордер, если по этой цене уже установлен один.
Цикл в Цикле.
ПервыйЦикл перебора существующих отложек. После выбора очередного ордера в ПервомЦикле запускается ВторойЦикл, в котором уже ищется ордер с одинаковой ценой с выбранным ордером из ПервогоЦикла. При нахождении удаляется.
При удалении ставится флаг УдалениеБыло.
После окончания ПервогоЦикла, если УдалениеБыло повторить опять ПервыйЦикл. Т.к. нумерация ордеров смещается и может быть пропущен какой-то ордер. (хотя это необязательно, на следующем тике удалится)
====
Обратите внимание что во втором цикле не должен сбиться счетчик ПервогоЦикла.
for (i = 0; i<OrdersTotal(); i++) // в ПервомЦикле i
for (ii = 0; ii<OrdersTotal(); ii++) // во ВторомЦикле. ii
Цикл в Цикле.
ПервыйЦикл перебора существующих отложек. После выбора очередного ордера в ПервомЦикле запускается ВторойЦикл, в котором уже ищется ордер с одинаковой ценой с выбранным ордером из ПервогоЦикла. При нахождении удаляется.
При удалении ставится флаг УдалениеБыло.
После окончания ПервогоЦикла, если УдалениеБыло повторить опять ПервыйЦикл. Т.к. нумерация ордеров смещается и может быть пропущен какой-то ордер. (хотя это необязательно, на следующем тике удалится)
====
Обратите внимание что во втором цикле не должен сбиться счетчик ПервогоЦикла.
for (i = 0; i<OrdersTotal(); i++) // в ПервомЦикле i
for (ii = 0; ii<OrdersTotal(); ii++) // во ВторомЦикле. ii
Написал такую вещь, но что-то сомнительно как-то...
void CloseEqualsOrds() { if(OrdersTotal()>0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { double pricefirst=OrderOpenPrice(); for(int ii=OrdersTotal()-2; ii>=0; ii--) { double pricesecond=OrderOpenPrice(); if(pricesecond==pricefirst) { OrderDelete(OrderTicket()); } } }//if (OrderSymbol()==Symbol() && }//if (OrderSelect(i, }//for (i=OrdersTotal()-1; }//if (OrdersTotal()>0) }
Во втором цикле Вы не выбрали ордер
Селекта нет и нет выбора по Символу и Магику
И кроме того, надо исключить удаление выбранного ордера из Первого Цикла. Фильтр по Тикету
Во втором цикле Вы не выбрали ордер
Селекта нет и нет выбора по Символу и Магику
И кроме того, надо исключить удаление выбранного ордера из Первого Цикла. Фильтр по Тикету
Спасибо еще раз. Обычно я тестю функции с помощью Print() и все отслеживаю, а тут без запуска никак и не факт что будет работать, получилось что-то вроде этого
void CloseEqualsOrds() // { if(OrdersTotal()>0) { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { double pricefirst=OrderOpenPrice(); int ticketfirst=OrderTicket(); for(int ii=OrdersTotal()-1; ii>=0; ii--) { if(OrderSelect(ii,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { double pricesecond=OrderOpenPrice(); int ticketsecond=OrderTicket(); if(pricesecond==pricefirst && ticketfirst!=ticketsecond) { OrderDelete(OrderTicket()); } } } } }//if (OrderSymbol()==Symbol() && }//if (OrderSelect(i, }//for (i=OrdersTotal()-1; }//if (OrdersTotal()>0) }
Спасибо еще раз. Обычно я тестю функции с помощью Print() и все отслеживаю, а тут без запуска никак и не факт что будет работать, получилось что-то вроде этого
Как-то так, пробуйте:
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 28.11.2006 | //| Описание : Удаление ордеров | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ( "" - любой символ, | //| NULL - текущий символ) | //| op - операция ( -1 - любой ордер) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ void DeleteOrders(string sy="", int op=-1, int mn=-1) { bool fd; int err, i, it, k=OrdersTotal(), ot; if (sy=="0") sy=Symbol(); for (i=k-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ot=OrderType(); if (ot>1 && ot<6) { if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) { if (mn<0 || OrderMagicNumber()==mn) { for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); fd=OrderDelete(OrderTicket(), clDelete); if (fd) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") delete order ",GetNameOP(ot), ": ",ErrorDescription(err),", try ",it); Sleep(1000*5); } } } } } } } }
- www.mql5.com
Спасибо еще раз. Обычно я тестю функции с помощью Print() и все отслеживаю, а тут без запуска никак и не факт что будет работать, получилось что-то вроде этого
![](https://c.mql5.com/3/66/9.gif)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, подскажите пожалуйста, как реализовать функцию закрытия одинаковых по цене ордеров в определенный день недели и время? Например, в понедельник после открытия рынка.
Есть следующая заготовка для отложенных покупок...