Добрый день, знатоки!
Сидел, думал над своей торговлей и возникла идея не удерживать позиции дольше определенного времени.
То есть если есть несколько 10-20 открытых ордеров, нужно вычислить из них самый старый и закрыть, результат сделки не важен.
Столкнулся с проблемой, не могу придумать блок кода который смог бы вычислить такой ордер...
Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?
Спасибо!
Алгоритм достаточно простой:
- Завести переменную, в которую будет сохранено время открытия ордера (например, dtOldestOrderTime), а также переменную, в которой сохраняется тикет этого ордера (например, nOldestOrderTicket).
- Пройтись по списку рыночных ордеров (цикл).
- На каждой итерации цикла сравнивается время открытия обрабатываемого ордера и значение переменной dtOldestOrderTime. Если время открытия этого ордера меньше, чем dtOldestOrderTime, то его данные сохраняются в dtOldestOrderTime и nOldestOrderTicket. Также нужно учесть, что инициализировать dtOldestOrderTime стоит каким-то большим значением (например, текущее время + 1 сек), чтобы данные первого найденного ордера гарантированно сохранялись в dtOldestOrderTime.
- По окончанию цикла в переменной nOldestOrderTicket находится тикет самого старшего ордера, а в переменной dtOldestOrderTime - время его открытия. Далее остается решить, пора закрывать такой ордер или нет.
Алгоритм достаточно простой:
- Завести переменную, в которую будет сохранено время открытия ордера (например, dtOldestOrderTime), а также переменную, в которой сохраняется тикет этого ордера (например, nOldestOrderTicket).
- Пройтись по списку рыночных ордеров (цикл).
- На каждой итерации цикла сравнивается время открытия обрабатываемого ордера и значение переменной dtOldestOrderTime. Если время открытия этого ордера меньше, чем dtOldestOrderTime, то его данные сохраняются в dtOldestOrderTime и nOldestOrderTicket. Также нужно учесть, что инициализировать dtOldestOrderTime стоит каким-то большим значением (например, текущее время + 1 сек), чтобы данные первого найденного ордера гарантированно сохранялись в dtOldestOrderTime.
- По окончанию цикла в переменной nOldestOrderTicket находится тикет самого старшего ордера, а в переменной dtOldestOrderTime - время его открытия. Далее остается решить, пора закрывать такой ордер или нет.
++Спасибо, буду пробовать, логика понятна.
На словах оно конечно попроще :), попытаюсь в код ее
Добрый день, знатоки!
Сидел, думал над своей торговлей и возникла идея не удерживать позиции дольше определенного времени.
То есть если есть несколько 10-20 открытых ордеров, нужно вычислить из них самый старый и закрыть, результат сделки не важен.
Столкнулся с проблемой, не могу придумать блок кода который смог бы вычислить такой ордер...
Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?
Спасибо!
extern int MaxTrades = 50; ... if (CountTrades() > MaxTrades) { for (int pos = 0; pos < OrdersTotal(); pos++) { OrderSelect(pos, SELECT_BY_POS); if (OrderSymbol() == Symbol() && OrderType() == OP_BUY) { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Bid, In, White); pos = OrdersTotal(); } if (OrderSymbol() == Symbol() && OrderType() == OP_SELL) { RefreshRates(); OrderClose(OrderTicket(), OrderLots(), Ask, In, White); pos = OrdersTotal(); } } } ... int CountTrades() { int count = 0; for (int trade = OrdersTotal() - 1; trade >= 0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol()) count++; } return (count); }
mql4. старый будет первый они сортируются по времени открытия(или номеру)
mql4. старый будет первый они сортируются по времени открытия(или номеру)
Нет, не сортируются. Сортировка ордеров производится пользователем по своему усмотрению. Поэтому нельзя полагаться на порядок следования ордеров в списке. Нужно только вычислять.
P. S. Приведенный код, к сожалению, вообще никак не относится к обговариваемой проблеме.
Добрый день, знатоки!
Сидел, думал над своей торговлей и возникла идея не удерживать позиции дольше определенного времени.
То есть если есть несколько 10-20 открытых ордеров, нужно вычислить из них самый старый и закрыть, результат сделки не важен.
Столкнулся с проблемой, не могу придумать блок кода который смог бы вычислить такой ордер...
Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?
Спасибо!
int ReturnOldestTicket() { datetime OldestTime=TimeCurrent(); int TicketOldest=-1; int j=0; while ( j<OrdersTotal() ) { if ( OrderSelect(j, SELECT_BY_POS, MODE_TRADES) ) if ( OrderSymbol()==Symbol() ) if ( OrderType()==OP_BUY || OrderType()==OP_SELL ) if ( OrderOpenTime()<OldestTime ) { OldestTime=OrderOpenTime(); TicketOldest=OrderTicket(); } j++; } return(TicketOldest); }Закрытие Позиции (ReturnOldestTicket()) оставляю Вам !
Закрытие Позиции (ReturnOldestTicket()) оставляю Вам !
Спасибо! Как вычислить ордер понял :).
Проблема у меня в другом.
Например, в экстерны вынести переменную, спустя какое время в минутах или часах нужно закрыть ордер... указал например 7 дней или 168 часов или еще как.
и после того как блок находит ордер у которого время открытия раньше чем за семь дней то его закрывает ну или тикет его дает..
С блоком закрытия проблем нет ).
P.S.
Понимаю, что где то просто туплю, но пока в голову ни чего не приходит.
Спасибо! Как вычислить ордер понял :).
Проблема у меня в другом.
Например, в экстерны вынести переменную, спустя какое время в минутах или часах нужно закрыть ордер... указал например 7 дней или 168 часов или еще как.
и после того как блок находит ордер у которого время открытия раньше чем за семь дней то его закрывает ну или тикет его дает..
С блоком закрытия проблем нет ).
P.S.
Понимаю, что где то просто туплю, но пока в голову ни чего не приходит.
Не сочти за грубость, но как можно над таким пустяком не один день голову напрягать??? Ведь эта проблема стоит не больше бульона из-под яиц...
Время всегда считается в СЕКУНДАХ, следовательно переводишь дни и\или часы в секунды (1день = 24часа, 1час = 60мин*60сек) и сравниваешь разницу текущего времени и времени открытия ордера с этим количеством секунд. Если равно или больше, значит этот ордер надо закрывать...
Не сочти за грубость, но как можно над таким пустяком не один день голову напрягать??? Ведь эта проблема стоит не больше бульона из-под яиц...
Время всегда считается в СЕКУНДАХ, следовательно переводишь дни и\или часы в секунды (1день = 24часа, 1час = 60мин*60сек) и сравниваешь разницу текущего времени и времени открытия ордера с этим количеством секунд. Если равно или больше, значит этот ордер надо закрывать...
Вот про то и говорю что туплю ))) Спасибо! Теперь все стало на свои места. Проблема решена!
Как ни странно, но ордера действительно отсортированы по времени (или по номеру тикета, что одно и то же). Вот доказательства
На экране ордера по типу
Результат работы скрипта снизу вверх
//+-------------------------------------------------------+ //| Проверка упорядоченности ордеров PROBA.mq4| //+-------------------------------------------------------+ #property strict void OnStart() { bool x; Alert("- - - - - Ордеров: ", OrdersTotal()); x=OrderSelect(0, SELECT_BY_POS); datetime T1=OrderOpenTime(); Alert(OrderTicket()," ",T1); for(int n=1; n<OrdersTotal(); n++) { x=OrderSelect(n, SELECT_BY_POS); datetime T2=OrderOpenTime(); Alert(OrderTicket()," ",T2); if(T2<T1) { Alert("--- Упорядоченность ордеров по времени открытия отсутствует"); return; } T1=T2; } Alert("+++ Ордера упорядочены по времени открытия"); }
Старожилы говорят, что было время, когда так и было. Потом вдруг сделали, что ордера стали при программном выборе сортироваться так, как на экране. Потом опять они стали сортироваться по времени. Можно ли этим пользоваться? Опасно, а вдруг опять... Ведь уже было! Хотя мое мнение: что было, то сплыло. Ордера отсортированы по времени. Для фрилансеров и маркетников опасно, а свои всегда смогу исправить. На всякий случай писал в СервисДеск 2 месяца назад 2017.05.15 Заявка принята к рассмотрению и тишина...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день, знатоки!
Сидел, думал над своей торговлей и возникла идея не удерживать позиции дольше определенного времени.
То есть если есть несколько 10-20 открытых ордеров, нужно вычислить из них самый старый и закрыть, результат сделки не важен.
Столкнулся с проблемой, не могу придумать блок кода который смог бы вычислить такой ордер...
Может кто нибудь имел дело с таким? Может поделитесь или подскажите в каком направлении идти ?
Спасибо!