Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ruslan Udintsev
1087
Ruslan Udintsev  
Уважаемые гуру mql4. Пожалуйста помогите написать функцию удаления отложек, через заданное количество секунд, как это реализовать со временем я не могу понять... не обязательно всю функцию писать, я не могу сделать само условие, что если прошло например 10 секунд с момента установки отложки то ее нужно удалить. Вот как-то  так. 
Vladimir Zubov
5306
Vladimir Zubov  
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 форум
Vitalii Ananev
9730
Vitalii Ananev  
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
Попробуйте эту функцию.
Ruslan Udintsev
1087
Ruslan Udintsev  

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

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

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

Ruslan Udintsev
1087
Ruslan Udintsev  
попробую разобраться с первой функцией
Vladimir Zubov
5306
Vladimir Zubov  
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);
}
Попробуйте так. Откройте отложку и выведите в комент или принт что возвращает функция, подправил не в редакторе а прям тут, но вроде должно работать.
Ruslan Udintsev
1087
Ruslan Udintsev  
если я вычитаю из TimeCurrent()-OrderOpenTime() то получается вот такое значение  1970.01.01 00:00:51 затем оно увеличивается на 1 сек 
 
Ruslan Udintsev
1087
Ruslan Udintsev  
эта функция вернет это значение 1970.01.01 00:00:51 вот в таком формате

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

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

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

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

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

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

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

Vitalii Ananev
9730
Vitalii Ananev  
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)
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий