функция закрытия одинаковых отложенные ордеров

 

Здравствуйте, подскажите пожалуйста, как реализовать функцию закрытия одинаковых по цене ордеров в определенный день недели и время? Например, в понедельник после открытия рынка.

Есть следующая заготовка для отложенных покупок...

if(OrdersTotal()>0)
  {
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
           {
            if(OrderType()==OP_BUYSTOP)
              {
              }//if (OrderType()==OP_BUY)
           }//if (OrderSymbol()==Symbol() &&
        }//if (OrderSelect(i,
     }//for (i=OrdersTotal()-1;
  }//if (OrdersTotal()>0) 
 
igortrade:

Здравствуйте, подскажите пожалуйста, как реализовать функцию закрытия одинаковых по цене ордеров в определенный день недели и время? Например, в понедельник после открытия рынка.

Есть следующая заготовка для отложенных покупок...

Пожалуйста правильно вставляйте код в сообщения: Правильно вставляем код на форуме. Ваше сообщения я уже исправил.
 
Проще не устанавливать еще один отложенный ордер, если по этой цене уже установлен один.

в вашем примере не хватает поиска ордеров по цене открытия/цене устанавливания ордера. По этому параметру вы сможете их отобрать из всего списка ваших ордеров, и закрыть. По параметру = OrderOpenPrice()
 
Artem Gulturyan:
Проще не устанавливать еще один отложенный ордер, если по этой цене уже установлен один.

в вашем примере не хватает поиска ордеров по цене открытия/цене устанавливания ордера. По этому параметру вы сможете их отобрать из всего списка ваших ордеров, и закрыть. По параметру = OrderOpenPrice()
Отложки открывает робот после обновления или открытия торговой сессии, все же надо написать функцию в робот, вот думаю над ней....
 

Цикл в Цикле.

ПервыйЦикл перебора существующих отложек. После выбора очередного ордера в ПервомЦикле запускается ВторойЦикл, в котором уже ищется ордер с одинаковой ценой с выбранным ордером из ПервогоЦикла. При нахождении удаляется.

При удалении ставится флаг УдалениеБыло.

После окончания ПервогоЦикла, если УдалениеБыло повторить опять ПервыйЦикл. Т.к. нумерация ордеров смещается и может быть пропущен какой-то ордер. (хотя это необязательно, на следующем тике удалится)

====

Обратите внимание что во втором цикле не должен сбиться счетчик ПервогоЦикла.

   for (i = 0; i<OrdersTotal(); i++)    // в ПервомЦикле  i

   for (ii = 0; ii<OrdersTotal(); ii++)  // во ВторомЦикле.   ii

 
Andrei Fandeev:

Цикл в Цикле.

ПервыйЦикл перебора существующих отложек. После выбора очередного ордера в ПервомЦикле запускается ВторойЦикл, в котором уже ищется ордер с одинаковой ценой с выбранным ордером из ПервогоЦикла. При нахождении удаляется.

При удалении ставится флаг УдалениеБыло.

После окончания ПервогоЦикла, если УдалениеБыло повторить опять ПервыйЦикл. Т.к. нумерация ордеров смещается и может быть пропущен какой-то ордер. (хотя это необязательно, на следующем тике удалится)

====

Обратите внимание что во втором цикле не должен сбиться счетчик ПервогоЦикла.

   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)
  }
 

Во втором цикле Вы не выбрали ордер

Селекта нет и нет выбора по Символу и Магику

И кроме того, надо исключить удаление выбранного ордера из Первого Цикла. Фильтр по Тикету

 
Andrei Fandeev:

Во втором цикле Вы не выбрали ордер

Селекта нет и нет выбора по Символу и Магику

И кроме того, надо исключить удаление выбранного ордера из Первого Цикла. Фильтр по Тикету

Спасибо еще раз. Обычно я тестю функции с помощью 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)
  }
 
igortrade:

Спасибо еще раз. Обычно я тестю функции с помощью 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);
              }
            }
          }
        }
      }
    }
  }
}

 Отсюда

Только "Полезные функции от KimIV". - MQL4 форум
  • www.mql5.com
Только "Полезные функции от KimIV". - MQL4 форум
 
igortrade:

Спасибо еще раз. Обычно я тестю функции с помощью Print() и все отслеживаю, а тут без запуска никак и не факт что будет работать, получилось что-то вроде этого

Чего то, вы намудрили
Причина обращения: