Помогите!! функция удаления отложенных ордеров

 
Уважаемые гуру mql4. Пожалуйста помогите написать функцию удаления отложек, через заданное количество секунд, как это реализовать со временем я не могу понять... не обязательно всю функцию писать, я не могу сделать само условие, что если прошло например 10 секунд с момента установки отложки то ее нужно удалить. Вот как-то  так. 
 
Ruslan Udintsev:
Уважаемые гуру mql4. Пожалуйста помогите написать функцию удаления отложек, через заданное количество секунд, как это реализовать со временем я не могу понять... не обязательно всю функцию писать, я не могу сделать само условие, что если прошло например 10 секунд с момента установки отложки то ее нужно удалить. Вот как-то  так. 

https://www.mql5.com/ru/forum/131859/page5#434248

переделайте эту функцию чтобы следила не за открытыми позициями, а за отложенными ордерами и подкорректируйте datatime t=0; чтобы компилировалась через #property strict

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
Только "Полезные функции от KimIV". - MQL4 форум
  • www.mql5.com
Только "Полезные функции от KimIV". - MQL4 форум
 
Ruslan Udintsev:
Уважаемые гуру mql4. Пожалуйста помогите написать функцию удаления отложек, через заданное количество секунд, как это реализовать со временем я не могу понять... не обязательно всю функцию писать, я не могу сделать само условие, что если прошло например 10 секунд с момента установки отложки то ее нужно удалить. Вот как-то  так. 
void DeleteAllOrder(int Cmd, uint TimeLimit)
{
   
   int count=OrdersTotal();
   if (count<=0) return;
   for (int i=Count;i>=1;i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      {
          if ((uint)(TimeCurrent()-OrderOpenTime())<TimeLimit) continue;
          if (Cmd==-1)
          {
            if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP ||
                 OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) 
                     OrderDelete(OrderTicket()); 
          }else
          if (OrderType()==Cmd) OrderDelete(OrderTicket());
      }    
   }  
}
//Cmd - тип ордера, если -1 то все отложенные ордера.
//TimeLimit время жизни ордера. например если надо задать время жизни 1 час то TimeLimit должен быть равен 1*3600
Попробуйте эту функцию.
 

не получается у меня,  во второй функции условие проверки разницы времени открытия и текущего времени, если с этими данными происходят какие то вычисления то дата сбрасывается на 1970 год

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

каким образом это сделать? если на примере второй функции получить разницу в секундах было бы очень замечательно 

 
попробую разобраться с первой функцией
 
Ruslan Udintsev:

не получается у меня,  во второй функции условие проверки разницы времени открытия и текущего времени, если с этими данными происходят какие то вычисления то дата сбрасывается на 1970 год

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

каким образом это сделать? если на примере второй функции получить разницу в секундах было бы очень замечательно 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последнего ордера. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastOrders(string sy="", int op=-1, int mn=-1) {
  datetime t=0;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
Попробуйте так. Откройте отложку и выведите в комент или принт что возвращает функция, подправил не в редакторе а прям тут, но вроде должно работать.
 
если я вычитаю из TimeCurrent()-OrderOpenTime() то получается вот такое значение  1970.01.01 00:00:51 затем оно увеличивается на 1 сек 
 
 
эта функция вернет это значение 1970.01.01 00:00:51 вот в таком формате

 
Ладно попробую объяснить по новой,мне нужно что бы через 20 сек после установки отложенного ордера, он удалялся, и удалялся роботом а не по дате экспирации или как там она пишется  
 

например можно сделать вот так

if( OrderOpenTime()+TimeLim=TimeCurrent())........ удаляем отложку

проблема в том что TimeLim должен задаваться в секундах например 20 секунд, и по идее если ордер открыт 14:40:10 то когда наступит 14:40:10+20 секунд 14:40:30 робот должен его удалить

но это выражение не складывается. результат его сложения вы можете увидеть выше.

что я не так делаю? Объясните чайнику на пальцах.

Буду очень благодарен.

 
Ruslan Udintsev:

не получается у меня,  во второй функции условие проверки разницы времени открытия и текущего времени, если с этими данными происходят какие то вычисления то дата сбрасывается на 1970 год

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

каким образом это сделать? если на примере второй функции получить разницу в секундах было бы очень замечательно 

if ((uint)(TimeCurrent()-OrderOpenTime())<TimeLimit)

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

 Если надо в минутах то TimeLimit умножаете на 60 если в часах то на 3600 (количество секунд в одном часе) 

Если разница между  TimeCurrent()-OrderOpenTime() меньше TimeLimit, значит время еще не истекло, если больше то выполняется остальной участок кода, где проверятся тип ордера и удаляется. 

Что бы не заморачиваться с приведением типов поменяйте тип переменной  TimeLimit с uint на int и тогда этот кусок будет выглядеть так:

 

if ((TimeCurrent()-OrderOpenTime())<TimeLimit)
Причина обращения: