Помогите!! функция удаления отложенных ордеров
- Помогите со временем
- Помогите разобраться с удалением отложек
- Вопросы от "чайника"
Уважаемые гуру 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); }
- www.mql5.com
Уважаемые гуру 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 год
я не понимаю, почему нельзя просто взять и из текущего время вычесть время открытия и что бы там получилось какое нибудь значение.
каким образом это сделать? если на примере второй функции получить разницу в секундах было бы очень замечательно
не получается у меня, во второй функции условие проверки разницы времени открытия и текущего времени, если с этими данными происходят какие то вычисления то дата сбрасывается на 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); }Попробуйте так. Откройте отложку и выведите в комент или принт что возвращает функция, подправил не в редакторе а прям тут, но вроде должно работать.
например можно сделать вот так
if( OrderOpenTime()+TimeLim=TimeCurrent())........ удаляем отложку
проблема в том что TimeLim должен задаваться в секундах например 20 секунд, и по идее если ордер открыт 14:40:10 то когда наступит 14:40:10+20 секунд 14:40:30 робот должен его удалить
но это выражение не складывается. результат его сложения вы можете увидеть выше.
что я не так делаю? Объясните чайнику на пальцах.
Буду очень благодарен.
не получается у меня, во второй функции условие проверки разницы времени открытия и текущего времени, если с этими данными происходят какие то вычисления то дата сбрасывается на 1970 год
я не понимаю, почему нельзя просто взять и из текущего время вычесть время открытия и что бы там получилось какое нибудь значение.
каким образом это сделать? если на примере второй функции получить разницу в секундах было бы очень замечательно
if ((uint)(TimeCurrent()-OrderOpenTime())<TimeLimit)
Вот этот кусочек как раз и вычисляет разницу между текущим временем и ценой открытия ордера и эта разница будет в секундах, так как переменные типа datetime хранят данные даты и времени в виде количества секунд прошедших с 1.01.1970 года.
Если надо в минутах то TimeLimit умножаете на 60 если в часах то на 3600 (количество секунд в одном часе)
Если разница между TimeCurrent()-OrderOpenTime() меньше TimeLimit, значит время еще не истекло, если больше то выполняется остальной участок кода, где проверятся тип ордера и удаляется.
Что бы не заморачиваться с приведением типов поменяйте тип переменной TimeLimit с uint на int и тогда этот кусок будет выглядеть так:
if ((TimeCurrent()-OrderOpenTime())<TimeLimit)

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